uniapp实战仿写网易云音乐(二)—视频页面(scroll-view组件实现横线滑动,mescroll-uni实现视频列表,向下滑动刷新当前页面)

news2024/11/16 8:34:25

文章目录

    • 前言
      • 顶部导航条的实现
      • 视频列表的展示部分
      • CSS部分
      • 最后

前言

接着上篇文章继续完成剩下的部分,本篇文章是完成第二个页面——视频页面的部分,视频还是没有做播放的效果,主要是做展示效果。下面附上两篇文章链接,没看过的同学可以回头看看:
uniapp实战仿写网易云音乐(一)—底部工具栏以及首页轮播图swiper的实现
uniapp实战仿写网易云音乐(二)—promise接口请求的封装和主页功能的实现,组件封装,配置下拉刷新

本篇文章完成的效果动态图:文章底部会附上本页面的css
在这里插入图片描述

顶部导航条的实现

首先我们要实现的是顶部的导航条:
如下效果,可以看到它是一个可以向右滑动的导航栏,并且选中的tab下面会有一个导航条的效果。下面来实现:
在这里插入图片描述

  1. 首先一个向右的导航栏我们就可以想到你使用scroll-view来实现:
    scroll-x="true"就是可以横向滑动
<scroll-view class="scroll-view" scroll-x="true" :show-scrollbar="false">
	<view class="rel">
	<!-- 导航条 -->
		<view class="item" v-for="(item,index) in navList" :key="index" 
		:class="{active: curNav==item.id}" @click="switchNav(item.id, index)">
			<view class="desc">
				{{item.name}}
			</view>
		</view>
	</view>
</scroll-view>

:class绑定高亮的样式
这里点击绑定了switchNav事件,用于更改选中项的id值(用于获取数据)

  1. 然后来写下面红色的导航条
    由上面效果图可以看出这里的红色导航条的宽度不是固定的,所以我们需要计算导航条的宽度
    先在data中定义 导航条默认宽度 和 导航条偏移量
data() {
	return {
		navList: [],                      //导航条
		curNav: '',                       //当前选中的导航条
		sliderWidth: 60,                  //导航条默认宽度
		sliderOffset:26,                  //导航条偏移量
	}
},

然后来写一个导航条,给动态的样式:

<view class="slide" 
:style="'width:'+sliderWidth+'rpx;transform:translateX('+sliderOffset+'rpx)'">
	
</view>

接下来就是点击导航栏的时候修改宽度和偏移量的值:

//导航条高亮切换
switchNav(itemId, index) {
	this.curNav = itemId;
	//导航条的宽度  140是第1项的宽度
	this.sliderWidth = index===1 ? 140: 60;
	//计算偏移量 左边16 文字60+间隙64=124   LOCK=80
	this.sliderOffset = 124*index + (index > 1 ? 80: 16)
},

导航条完整的样式:

<scroll-view class="scroll-view" scroll-x="true" :show-scrollbar="false">
	<view class="rel">
	<!-- 导航条 -->
		<view class="item" v-for="(item,index) in navList" :key="index" 
		:class="{active: curNav==item.id}" @click="switchNav(item.id, index)">
			<view class="desc">
				{{item.name}}
			</view>
		</view>
		<!-- 下划线 -->
		<view class="slide" 
		:style="'width:'+sliderWidth+'rpx;transform:translateX('+sliderOffset+'rpx)'">
		</view>
	</view>
</scroll-view>

视频列表的展示部分

开始实现视频列表的部分:
在这里插入图片描述
视频列表这里我们使用mescroll-uni组件来实现:
这里贴一下这个外部控件的官方文档:mescroll-uni
这里要实现的是一个分页,向上滚动到要能加载下一页,向下滚动要能刷新当前页,这些功能只需要配置对应的属性
先在data中定义需要用到的参数:

downOption: {                     //下拉刷新
	auto: false
},
upOption: {                       //上拉加载下一页
	auto: false,
	page: {
		num: 0,                   //起始页
		size: 10,                 //一页条数
	}
},

@down和@up是下拉和上拉触发的对应的函数

<mescroll-uni :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
	<view class="video-list">
		<view class="video-item" v-for="(item, index) in relatedVideo" :key="index">
			<view class="video-wrap">
				<image :src="item.coverUrl" mode="" class="img"></image>
				<view class="desc ellipsis">
					{{item.title}}
				</view>
				<view class="creater-bar flex-box">
					<view class="name">
						{{item.creator[0].userName}}
					</view>
				</view>
			</view>
		</view>
	</view>
</mescroll-uni>

然后在函数中进行对应的操作:

//下拉刷新回调
downCallback(mescroll) {
	console.log("downcallback")
	//重置列表为第一页(自动执行page.num=1,再触发upcallback方法)
	mescroll.resetUpScroll();
},
//上拉加载回调
upCallback(mescroll) {
	console.log("upcallback", mescroll)
	//加载下一页数据
	this.getList(mescroll.num, mescroll.size, res=> {
		//若是第一页 则清空
		if (mescroll.num == 1) {
			this.relatedVideo = [];
		}
		//累加数据
		this.relatedVideo = this.relatedVideo.concat(res);
		//成功的回调,隐藏刷新状态
		mescroll.endSuccess();
	}, ()=>{
		//失败的回调,隐藏下拉刷新状态
		mescroll.endErr();
	})
}

CSS部分

<style lang="scss">
	.topbar {
		.h86 {
			height: 86rpx;
		}
	}

	.scroll-view {
		position: fixed;
		top: 0;
		width: 100%;
		height: 86rpx;
		white-space: nowrap;
		text-align: center;
		line-height: 86rpx;
		color: #333;
		font-weight: 600;
		border-bottom: 1rpx solid #e6e6e6;
		z-index: 10;
		background: #fff;
		.item {
			position: relative;
			display: inline-block;
			min-width: 126rpx;
			height: 86rpx;
			line-height: 86rpx;
			padding: 0 20rpx;
			&.active{
				color:#f32628;
			}
		}
	}

	.slide {
		position: absolute;
		width: 60rpx;
		height: 4rpx;
		left: 0;
		bottom: 0rpx;
		background: #f32628;
		transition: transform 0.3s;
		z-index: 2;
		/* #ifdef MP-WEIXIN */
		bottom: 2rpx;
		/* #endif */
	}

	.video-list {
		color: #333;
		background: #f8f8f8;
		.tit-bar {
			padding-left: 32rpx;
		}
		.video-item {
			padding-top: 32rpx;
			background: #fff;
			border-bottom: 24rpx solid #f8f8f8;
		}

		.video-wrap {
			width: 686rpx;
			margin: 0 auto;
		}

		.img {
			display: block;
			width: 686rpx;
			height: 390rpx;
			border-radius: 10rpx;
			background: #eee;
		}

		.desc {
			font-size: 30rpx;
			font-weight: 600;
			line-height: 84rpx;
			border-bottom: 1rpx solid #e6e6e6;
		}
	}

	.creater-bar {
		height: 100rpx;
		justify-content: space-between;
		align-items: center;
		.avactor-box {
			align-items: center;
		}
		.avactor {
			width: 66rpx;
			height: 66rpx;
			margin-right: 10rpx;
			border-radius: 66rpx;
			background: #eee;
		}

		.name {
			line-height: 100rpx;
		}
	}
</style>

最后

ok到这里就实现了第二个页面的内容,后面会继续更新剩下的页面,感兴趣的可以点一个订阅关注呀~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【概率论】正态分布

前导知识&#xff1a; 概率密度函数&#xff08;密度函数&#xff09;&#xff1a;描述一个随机变量的在某个确定的取值点附近的可能性的函数。 随机变量的取值落在某个区域内的概率为概率密度函数在这个区域上的积分。 性质&#xff1a; f(x)>0 数学期望 又称均值&am…

vue组件

9.Vue组件 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 组件系统让我们可以用独立可复用的小组件来构建大型应用&#xff0c;几乎任意类型的应用的界面都可以抽象为一个组件树&#xff1a; 9…

SpringBoot 自定义starter yaml提示失效问题

自定义starter yaml提示失效问题自定义starter yaml提示失效问题问题场景解决办法自定义starter yaml提示失效问题 问题场景 在自定义starter后&#xff0c;必不可少会有properties配置参数需要指定&#xff0c;而在有时又不知道为什么出现这个问题。官方 Configuration Meta…

玩以太坊链上项目的必备技能(OOP-抽象合约-Solidity之旅十)

抽象合约&#xff08;abstract contract&#xff09; 前文在讲合约继承的基类构造函数的参数时&#xff0c;有提到抽象合约&#xff0c;也就是说&#xff0c;如果派生合约未能给其继承的基合约指定构造函数参数时&#xff0c;那么&#xff0c;该派生合约必须声明为抽象合约&am…

ubuntu中安装tippecanoe并切片

概述 本文是一片”水文”&#xff0c;记录一下如何在ubuntu中用tippecanoe制作矢量切片。 实现操作 本示例中ubuntu是在VMware虚拟机中&#xff0c;安装的是18.04.6的版本&#xff0c;你可通过我兰的镜像下载&#xff0c;速度杠杠的。 1.安装git sudo apt install git2.cl…

探索SpringMVC-HandlerMapping之RequestMappingHandlerMapping

前言 上回我们知道HandlerMapping是用来寻找Handler的&#xff0c;并不与Handler的类型或者实现绑定&#xff0c;而是根据需要定义的。那么为什么要单独给RequestMapping实现一个HandlerMapping&#xff1f;这次咱们就来专门看看这个RequestMappingHandlerMapping。 RequestM…

Educational Codeforces Round 139 (Rated for Div. 2)(A~E)

A. Extremely Round 定义一个数中仅存在一位非0&#xff0c;它是extremely round&#xff0c;计算1~n中有几个满足条件的数。 思路&#xff1a;直接计算即可。 AC Code&#xff1a; #include <bits/stdc.h>typedef long long ll; const int N 1e5 5; int t, n;int c…

高手必备10大难题:Mysql如何实现RR级隔离时,不会幻读?

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

[2022-12-17]神经网络与深度学习第5章 - 循环神经网络(part 1)

contents循环神经网络 part 1 - RNN记忆能力实验写在开头循环神经网络的记忆能力实验数据集构建数据集构建函数数据集加载构建 Dataset类模型构建嵌入层SRN层自己实现torch框架实现比较线性层模型汇总模型训练训练指定长度的数字预测模型模型评价写在最后循环神经网络 part 1 -…

[机器人学习]-树莓派6R机械臂运动学分析

根据D-H表规定得到如下变换矩阵为&#xff1a; 由此可得机器人相邻两关节位姿分别为&#xff1a; 根据DH参数求解变换矩阵的函数trans&#xff1a; %输入JD&#xff0c;即6个关节变量的值&#xff0c;求解正运动方程 function [ T ] trans( theta, d, a, alpha ) T [ cos(th…

Java中Stream的 flatMap 与 map 实际使用场景与区别对比

基本概念 Stream 流式操作&#xff0c;一般用于操作集合即 List 一类的数据结构&#xff0c;JDK 1.8 后的新特性 Stream 中的 map 一般用于对List 中的每一个元素执行指定方法使得最终结果为最终的集合为每一个记录的某一属性的集合&#xff08;get 方法&#xff09;或者通过…

PPT怎么转PDF?将Powerpoint(PPT)转换为PDF方法分享

当您在PowerPoint中创建精美的演示文稿时&#xff0c;您不仅想给观众留下深刻的印象&#xff0c;还希望它能够方便地打包&#xff0c;并且文件格式起着重要作用。虽然PPTX是一种广泛传播的格式&#xff0c;但PDF始终是一个安全的选择。以下是有关如何使用在线工具将PowerPoint演…

每天五分钟机器学习:主成分分析算法PCA的降维原理是什么?

本文重点 当数据从n维降到k维的时候,我们需要找到一个能使得投影误差最小的k维向量构成的投影平面,然后将数据进行投影,从而达到降维的作用。所以PCA算法要做的就是两件事情,一件事情就是计算最优的k维向量,另一个问题就是计算原来样本点映射到降维面的z(i),也就是这些新…

【C++初阶】模板初阶、STL简介

文章目录模板初阶泛型编程函数模板类模板STL简介什么是STLSTL的六大组件STL的缺陷模板初阶 泛型编程 概念 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 函数模板 概念 函数模板代表了一个函数家族&#xff0c;…

搜索与图论 - spfa 算法

文章目录一、spfa 算法1. spfa 算法简介2. spfa 算法和 bellman-ford 算法的区别3. spfa 算法和 dijkstra 算法的区别4. spfa 算法实现步骤5. spfa 算法举例图解6. spfa 算法用于求最短路和判断负环&#xff0c;详见下面两道例题。二、spfa 算法例题—— spfa 求最短路具体实现…

1. SpringBoot 整合 Canal

勿以恶小而为之&#xff0c;勿以善小而不为----- 刘备 SpringBoot 整合 Canal pom.xml 添加 canal.client 依赖 (1.1.5 改动很大&#xff0c;这儿客户端用 1.1.4) <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.a…

【云原生进阶之容器】第一章Docker核心技术1.5.3节——cgroups数据结构剖析

1 cgroups数据结构解析 从进程的角度出发来剖析 cgroups 相关数据结构之间的关系。在 Linux 中管理进程的数据结构是 task_struct。cgroup表示进程的行为控制,因为子系统必须要知道进程是位于哪一个cgroup,所以在struct task_struct和cgroup中存在一种映射。 1.1 task_struc…

【数据结构进阶】二叉平衡树

一、 二叉平衡树 概念 二叉搜索树有称 二叉排序树&#xff0c;它也可以是一个空树。 如果它的左子树不为空&#xff0c;则左子树上所有结点的值都小于根结点的值如果他的右子树不为空&#xff0c;则右子树上所有结点的值都大于根结点的值它的左右子树也分别是二叉搜索树 由…

【Acwing 周赛#82】AcWing 4783. 多米诺骨牌

目录 4782.第k个数 4783. 多米诺骨牌 - bfs 记录时间 4782.第k个数 java大顶堆 import java.util.*;public class Main {public static void main(String[] args ){Scanner scnew Scanner(System.in);int nsc.nextInt(),ksc.nextInt();k--;PriorityQueue<Integer> qn…

HarmonyOS玩转ArkUI动效 - 水母动画

前言 本文会详细讲解我参加&#xff1a; HarmonyOS【挑战赛第三期】玩转ArkUI动效的项目 我的参赛项目源码&#xff1a;【挑战赛第三期】JellyfishAnimation 动画效果参考自&#xff1a;cassie-codes的水母SVG 华为鸿蒙已经放弃Java作为鸿蒙的开发语言&#xff0c;开发了一个申…