微信小程序 | 一比一复刻抖音短视频

news2024/10/7 6:46:45

📌个人主页:个人主页
​🧀 推荐专栏:小程序开发成神之路 --【这是一个为想要入门和进阶小程序开发专门开启的精品专栏!从个人到商业的全套开发教程,实打实的干货分享,确定不来看看? 😻😻】
📝作者简介从web开发,再到大数据算法,踩过了无数的坑,用心总结经验教训,助你在技术生涯一臂之力!若想获取更多精彩内容,敬请订阅专栏或者关注😁😂🤣😃😆😉😊😋😍😘🥰
⭐️您的小小关注是我持续输出的动力!⭐️


干货内容推荐

🥇入门和进阶小程序开发,不可错误的精彩内容🥇 :

  • 《小程序开发必备功能的吐血整理【个人中心界面样式大全】》
  • 《微信小程序 | 动手实现双十一红包雨》
  • 《微信小程序 | 人脸识别的最终解决方案》
  • 《来接私活吧?小程序接私活必备功能-婚恋交友【附完整代码】》
  • 《吐血整理的几十款小程序登陆界面【附完整代码】》

文章目录

  • 干货内容推荐
    • 一 、效果预览
    • 二、技术点解析
      • 2.1 视频播放功能
      • 2.2 视频滑动功能
    • 三、完整源码

一 、效果预览

请添加图片描述


二、技术点解析

项目使用到的技术栈:

  • uniapp框架极其组件
  • vue 2.0 功能语法

2.1 视频播放功能

视频播放功能我们直接引用官方给我提供的<video>标签,同时我们需要再使用的之前使用uni.createVideoContext()对其进行初始化。

其中使用到的一个知识点为vue语法中的组件命名引用语法--ref

通过在元素标签上对其进行ref=**命名,然后即可在script代码中使用this.$refs.**,即可对相应元素进行引用以及操作。

video视频播放功能详细代码如下:


```html
<template>
	<view class="root">
		<video
			ref="myVideos"
			id="myVideo"
			:src="src"
			@play="playIng"
			:muted="muted"
			:enable-progress-gesture="false"
			:page-gesture="false"
			:initial-time="0"
			:controls="false"
			:show-fullscreen-btn="false"
			:show-center-play-btn="false"
			:style="boxStyle"
			loop
		></video>
	</view>
</template>

<script>
	export default {
		watch: {
			state(newValue, oldValue) {
				setTimeout(()=>{
					this[newValue]();
				},300)
			}
		},
		data() {
			return {
				muted: true,
				ctx: null
			}
		},
		mounted() {
			this.ctx = uni.createVideoContext('myVideo',this);
			// #ifndef APP-NVUE
			this.$nextTick(()=>{
				if(this.state) this[this.state]();
			})
			// #endif
		},
		props: {
			state: {
				default: false
			},
			src:{
				default: false
			},
			boxStyle:{
				default :{}
			}
		},
		methods: {
			stop() {
				this.ctx.pause();
			},
			pause() {
				this.ctx.pause();
			},
			continue() {
				this.ctx.play();
			},
			play() {
				// createVideoContext.seek(0);
				this.ctx.play();
			},
			playIng(e) {
				// console.log('playIng', e)
			}
		}
	}
</script>

<style>
.root{
	background-color: #000000;
	position: relative;
}
.videoImg{
	position: absolute;
	top: 0;
	left: 0;
}
</style>

2.2 视频滑动功能

小程序中的滑动操作我们第一时间应该想到的是轮播图组件,的确现在各大平台已经给我们开发者提供了功能强大的轮播图组件,除此之外我们仍然可以借助于其他第三方开发库进行轮播图功能的实现。

在传统的轮播图中我们放置的是图片,在这个业务场景中我们直接放置视频!而且传统的轮播图我们是左右滑动,这里我们需要将其设置成上下滑动!

完整代码如下:
- 页面元素

<swiper :current="rootSwiperAnimationfinishIndex" class="pages-swiper" @change="rootSwiperChange"
			@animationfinish="rootSwiperAnimationfinish">
			<swiper-item class="swiper-item">
				<view class="flex_column">
					<QS-Navbar ref="navbar" :navbarItems="[{ width: 1 }]" :fixed="false" :hasPlacherholder="true"
						backgroundColor="rgba(255,255,255,0)"></QS-Navbar>
					<home ref="home" :height="(windowHeight - navbarHeight) + 'px'"></home>
				</view>
			</swiper-item>
			<swiper-item class="swiper-item">
				<view class="swiper-item bgc-000" style="">
					<!-- #ifndef APP-NVUE -->
					<swiper class="pages-swiper" vertical @animationfinish="videoSwiperAnimationfinish">
						<swiper-item v-for="(item, i) in dataList" :key="item.id">
							<view class="pages-swiper" style="background-color: #000000;color: white;">
								<jVideo v-if="Math.abs(k-i)<=1" :state="item.state" :src="item.src"
									:boxStyle="boxStyle"></jVideo>
								<view class="videoHover" v-if="1" @tap="tapVideoHover(item.state,$event)"
									:style="boxStyle">
									<image v-if="item.state=='pause'" class="playState"
										src="/static/img/index/play.png">
									</image>
								</view>
								<view class="userInfo">
									<image class="userAvatar"
										src="https://ftp.bmp.ovh/imgs/2019/10/c9583cb026b4251f.jpeg"></image>
									<view class="like" @tap="cLike(item.video_id,item.like);item.like=!item.like">
										<image v-if="item.like" class="likeIco" src="/static/img/index/xinActive.png" />
										<image v-else class="likeIco" src="/static/img/index/xin.png" />
										<text class="likeNum"
											:class="{'likeNumActive':item.like}">{{item.like_n}}</text>
									</view>
									<view class="comment" @tap="toComment(i)">
										<image class="commentIco" src="/static/img/index/comment.png"></image>
										<text class="t-a-c" style="color: #FFFFFF;">{{Math.abs(k-i)}}</text>
									</view>
									<view class="share flex_column_c_c" @tap="share">
										<image class="shareIco" src="/static/img/index/share.png"></image>
										<text class="shareTex">分享</text>
									</view>
								</view>
								<view class="content">
									<text class="userName">@{{item.title}}-{{i}}</text>
									<text class="words">{{item.msg}}</text>
								</view>
							</view>
						</swiper-item>
					</swiper>

- 逻辑

getData(refresh = false, doEvent = false, callback = e => {}) {
				// uni.$qs.doPageDemand.call(this, {
				// 	//getDataFn: 请求视频列表接口,
				// 	refresh,
				// 	doEvent,
				// 	setName: 'dataList',
				// 	successEnd: ()=>{
				// 		callback();
				// 	}
				// })
					for (let i = 0; i < 5; i++) {
						this.dataList.push({
							title: "1111",
							msg: "2222222",
							state: 'pause',
							like: i % 2 > 0,
							like_n: i,
							id: this.dataList.length + 1,
							src: 'https://cloud.video.taobao.com//play/u/1768198696/p/1/e/6/t/1/239439242603.mp4',
							videoImg: ''
						});
					}
				setTimeout(e => { //模拟接口请求时间为1秒
					callback();
				}, 1000);
			},
			//点击播放&&暂停
			tapVideoHover(state, event) {
				console.log('state--', state, event);
				const item = this.dataList[this.k];
				// #ifdef APP-NVUE
				if (state == 'play' || state == 'continue') {
					item.state = 'pause';
				} else {
					item.state = 'continue';
				}
				// #endif
				// #ifndef APP-NVUE
				const s = item.state;
				if (s == 'play' || s == 'continue') {
					item.state = 'pause';
				} else {
					item.state = 'continue';
				}
				// #endif
			},

三、完整源码

项目源码包下载地址:CSDN-零积分下载–基于uniapp的仿抖音短视频功能小程序完整源码

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

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

相关文章

Java中常用API总结(6)——BigInteger类

BigInteger类一、前言二、概述1.API帮助文档2.使用方法三、常见方法1.构造方法1️⃣格式2️⃣实例2.成员方法1️⃣格式2️⃣实例四、注意事项五、结语一、前言 平时在存储整数的时候&#xff0c;Java中默认是int类型&#xff0c;int类型有取值范围&#xff1a;-2147483648 ~ 2…

【深入理解JVM】内存模型

目录 运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 虚拟机对象探秘 对象的创建 对象的内存布局 运行时数据区域 程序计数器 程序计数器是一块较小的内存空间&#xff0c;存储当前线程所执行的字节码指令的地址。在java…

C#开发的资源文件程序(可国际化) - 开源研究系列文章

上次将小软件的线程池描述了&#xff0c;也将插件程序描述了&#xff0c;这次就将里面的资源文件相关的内容进行下记录&#xff0c;这里能够让程序做成国际化的形式(即多语言程序)&#xff0c;主要就是通过这个资源文件的方式进行的处理。下面将对这个资源文件的定义进行描述&a…

多线程之waitnotify

目录&#xff1a; 前言 1.wait()方法 2 notify()方法 3.wait & notify的代码示例&#xff1a; 4.关于notifyAll()方法 前言 线程最大的问题就是抢占式执行&#xff0c;随机调度。虽然线程在操作系统内核里的调度是随机的&#xff0c;但是可以通过一些办法来控制线程…

带你了解SVG标签

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 在主页中查看更多前端教学&#xff0c;可接大学生前端作业单。 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 js学习 目录初始SVG矩形&#xff0c;圆形和椭圆型 矩形 圆…

云安全(云安全数据中心、WAF、DDOS)

安全 安全威胁 可用性 安全威胁&#xff1a;大规模分布式拒绝服务攻击(DDoS)、僵尸网络(Botnet) 影响&#xff1a;网站业务不可用 完整性 安全威胁&#xff1a;网站入侵、服务器口令暴力破解 影响&#xff1a;网站页面被篡改和植入后门 保密性 安全威胁&#xff1a;网站后门…

二、Groovy入门

文章目录二、Groovy入门2.1 Groovy 简介2.2 Groovy 安装[非必须]2.3 IDEA创建 Groovy 项目2.4 Groovy 基本语法2.4.1 案例 1:基本注意点2.4.2 案例 2:引号说明2.4.3 案例 3:三个语句结构2.4.4 案例 4:类型及权限修饰符2.4.5 案例 5:集合操作2.4.6 案例 6:类导入2.4.7 案例 7:异…

MySQL是怎么保证主备一致的?

在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。 毫不夸张地说,MySQL 能够成为现下最流行的开源数据库,…

pytorch torchvision.ops.roi_align

pytorch的torchvision.ops.roi_align这个算子真的是坑我好多天啊&#xff01;害我连续加班半个月&#xff01;二阶段目标检测后面用roi_align来提取特征。 接口官方说明&#xff1a;https://pytorch.org/vision/stable/generated/torchvision.ops.roi_align.html?highlightroi…

React Devtools 使用技巧

首先在扩展迷中搜索下载该扩展&#xff0c;引入到 Chrome 的扩展程序中。 当我们添加扩展到Chrome中&#xff0c;就会在浏览器中看到 React Devtools 的 Icon&#xff0c;同时通过该扩展我们就可以知道当前打开的网站是开发环境的网站还是生产环境&#xff0c;React Devtools …

Mysql 安装 ubutu20.04

Mysql 安装 1&#xff1a;sudo apt-get autoremove --purge mysql* 2&#xff1a;sudo apt-get install mysql-server 3&#xff1a;sudo apt --fix-broken install -y 4&#xff1a;sudo apt-get install mysql-server 5&#xff1a; service mysql status 5&#xff1a;sudo…

C++STL-stackqueuepriority_queue介绍

文章目录1. 容器适配器1.1 什么是适配器1.2 STL标准库中stack和queue的底层结构2. stack的介绍和使用2.1 stack的介绍2.2 stack的使用3. queue的介绍和使用3.1 queue的介绍3.2 queue的使用4. priority_queue的介绍和使用4.1 priority_queue的介绍4.2 priority_queue的使用1. 容…

年度征文 | 回顾2022,展望2023

目录 一、前言 二、回顾2022 三、展望2023 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;感谢大家一直的支持。岁末年初&#xff0c;让我们一起回顾2022展望2023。一、前言 时光荏苒&#xff0c;岁月如梭&#xff0c;2022 已和我们再见&#xff0c;2023 正向我们走来。…

云原生周刊 | 在 Grafana 中显示 K8s Service 之间的依赖关系

开源项目推荐 Caretta 这个项目可以在 Grafana 监控面板中显示 K8s Service 之间的依赖关系。底层使用的是 eBPF&#xff0c;对应用无侵入。 busuanzi 这是一个基于 Golang Redis 的简易访问量统计系统&#xff0c;可以用来替代不蒜子。 vim-online-editor 这是一个在线版…

一文读懂 Kubernetes 存储设计

在 Docker 的设计中&#xff0c;容器内的文件是临时存放的&#xff0c;并且随着容器的删除&#xff0c;容器内部的数据也会一同被清空。不过&#xff0c;我们可以通过在 docker run 启动容器时&#xff0c;使用 --volume/-v 参数来指定挂载卷&#xff0c;这样就能够将容器内部的…

企业级数据中台构建方法和指导

目录1. 数据中台的概念2. 数据中台适合企业2.1 企业构建数据中台面临的问题2.2 企业构建数据中台解决问题的方法2.3 什么样的企业适合构建数据中台3. 如何建设数据中台3.1 方法论3.1.1 OneData3.1.2 OneService3.2 技术3.3 组织4. 数据中台实现&#xff1a;指标管理5. 数据中台…

高速缓存伪共享(false sharing)

0. CPU缓存 根据摩尔定律&#xff1a;芯片中的晶体管数量每隔18个月就会翻一番。导致CPU的性能和处理速度变得越来越快&#xff0c;而提升CPU的运行速度比提升内存的运行速度要容易和便宜的多&#xff0c;所以就导致了CPU与内存之间的速度差距越来越大。 为了弥补CPU与内存之间…

错失搭档张云雷,杨九郎和郭冬临一起演小品

熟悉相声的人都知道&#xff0c;这个传统的曲艺行业&#xff0c;一般是由捧哏和逗哏组成&#xff0c;两个人相辅相成缺一不可。就拿德云社的相声演员来说&#xff0c;也产生了很多对优秀演员&#xff0c;比如说郭德纲和于谦&#xff0c;比如说岳云鹏和孙越等等。 除了这两对相声…

微信开放平台之小程序获取用户信息

说实话&#xff0c;微信开放平台的文档真的是狗屎一般的存在&#xff0c;维护不及时&#xff0c;混乱&#xff0c;每隔一段时间更新一次授权接口&#xff01;着实让开发者想口吐芬芳了&#xff01;文档内跳来跳去&#xff0c;找不到一个完整的链路&#xff01;维护好几套接口文…

_Linux多线程-线程控制篇

文章目录1. POSIX线程库2. 创建线程3. 线程ID及进程地址空间布局4. 线程等待5. 线程终止pthread_ exitpthread_ cancel6. 分离线程7. 总结1. POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的要使用这些函数库&#…