uniapp h5 竖向的swiper内嵌视频实现抖音短视频垂直切换,丝滑切换视频效果,无限数据加载不卡顿

一、项目背景:实现仿抖音短视频全屏视频播放、点赞、评论、上下切换视频、视频播放暂停、分页加载、上拉加载下一页、下拉加载上一页等功能。。。

二、前言:博主一开始一直想实现类似抖音进入页面自动播放当前视频,上下滑动切换之后播放当前视频,但最后在ios上出现声音播放,但画面卡顿的问题,估计是ios的浏览器对自动播放做了安全限制,导致自动播放失效,为了功能的可用性,最终放弃自动播放,实现手动点击视频正中心的播放按钮进行播放,再点击视频暂停,这个bug在安卓端暂时没出现,大概率是ios的安全性更高导致的浏览器策略拦截了,需要用户手动交互。

三、项目框架组件:uniapp h5项目、vue2、 swiper组件、video组件

四、效果

仿抖音全屏视频切换播放暂停


在这里插入图片描述

五、布局:可根据自已的项目需求进行修改,博主这里的逻辑是数据由接口返回,如果没有视频,就展示图片,只有视频才进行播放,标题最多展示三行,超过三行显示‘展开’,点击展开谈起标题的底部弹窗,这里弹窗的代码就不展示了,有需要可私信

<view class="widget-video pos-r" :style="{height:`${videoHeight}px`}"><swiper class="video-list" :current="current" :style="{height:`${videoHeight}px`}" :vertical="true"@change="changeHandler" @transition="transitionHandler" @touchstart="touchStart" @touchend="touchEnd"><swiper-item class="video-item" :style="{height:`${videoHeight}px`}" v-for="(item, index) in datas":key="index"><videov-if="!$util.validatenull(item.videourl) || !$util.validatenull(item.videourl_low) || !$util.validatenull(item.videourl_fhd) || !$util.validatenull(item.videourl_hd)"class="thumb-img" :id="`video_${item.id}`" :src="item.videourl" :show-progress="false":show-fullscreen-btn="false" :show-play-btn="false" :loop="true" :show-center-play-btn="false"enable-play-gesture :poster="item.thumb" preload="auto" x5-playsinline="" playsinline="true"webkit-playsinline="true" x-webkit-airplay="allow" x5-video-player-type="h5"x5-video-player-fullscreen="" x5-video-orientation="portraint" @click="playOrpauseFn"></video><image v-else class="thumb-img" :src="item.thumb" mode="aspectFit"></image><template v-if="item.videourl || item.videourl_fhd || item.videourl_hd || item.videourl_low"><image v-if="showPlayIcon" class="play-icon pos-a pos-tl-c":src="$util.isCandu()?'/static/h5AndWeixin/home/cd_video_play.png':'/static/h5AndWeixin/home/common_icon_item_video_play.png'"mode="aspectFill" @tap="playOrpauseFn"></image></template><view class="calcwidth pos-a pos-bottom padding-l padding-b"><view class="wrapper" @click="openIntroducePop(item.title,item.description)"><view :id="'video-title'+item.id" class="c-f video-title":style="{fontSize:$util.isElder()?'39rpx':'30rpx',maxHeight: titleMaxHeight}"><text v-if="showExpand" class="expand">展开</text>{{item.title}}</view></view><from-time-view :item="item" :hideViews="true" :textColor="'#fff'"></from-time-view></view><view class="right-icon-wrap pos-a dflex col-s flex-d pos-right"><view v-if="item.allow_comment === 1" class="pos-r tac mt30"><image:style="{width:$util.isElder()?'104rpx':'80rpx',height:$util.isElder()?'104rpx':'80rpx'}"src="/sub-live/static/comment.png"@click="openCommentPop(item.catid,item.contentid,item.id)" mode="scaleToFill"></image><view v-if="commentCount> 0" class="zan-num tac pos-a pos-b-full":style="{fontSize:$util.isElder()?'32rpx':'20rpx',backgroundColor:$config.INFO.SUB_THEME_COLOR}">{{$util.filterViews(commentCount)}}</view></view><view v-if="item.islike === 1" class="pos-r tac mt30"><image:style="{width:$util.isElder()?'104rpx':'80rpx',height:$util.isElder()?'104rpx':'80rpx'}":src="likeObj.liked ? '/sub-live/static/zan-active.png' : '/sub-live/static/zan-inactive.png'"mode="scaleToFill" @click="goZanFn(item.catid,item.id)"></image><view v-if="likeObj.like_count > 0" class="zan-num tac pos-a pos-b-full":style="{fontSize:$util.isElder()?'32rpx':'20rpx',backgroundColor:$config.INFO.SUB_THEME_COLOR}">{{$util.filterViews(likeObj.like_count)}}</view></view></view></swiper-item></swiper><view class="nav-bar dflex padding-left-and-right pos-a pos-top"><image :style="{width:$util.isElder()?'39rpx':'30rpx',height:$util.isElder()?'39rpx':'30rpx'}"src="/static/h5AndWeixin/public/white-back.png" @click="goBack"></image></view>
</view>

六、js:主要展示视频代码

data() {return {videoHeight: uni.getWindowInfo().windowHeight,current: 0,datas: [],page: 0, // 当前页0,上一页-1,下一页1showPlayIcon: false,pageStartY: 0,pageEndY: 0,titleMaxHeight: '',showExpand: false,videoCtx: null};
},
onLoad() {// 获取当前页数据this.getvideolists();
},
methods: {getvideolists() {const _this = this;// 请求数据,改成自已接口的路径和参数_this.$api.getVerticalVideoList({catid: _this.catid,id: _this.id, // 请求上一页传第一条数据的id,请求下一页传最后一条数据的idpage: _this.page}).then(res => {if (res.data) {// 判断是否有数据,有数据才进行操作if (!_this.$util.validatenull(res.data.lists)) {// 下拉加载上一页,将数据插入当前数据的头部,并且播放数据的最后一条if (_this.current === 0 && _this.page === -1) {_this.datas.unshift(...res.data.lists);_this.current = res.data.lists.length - 1;} else {// 上拉加载下一页,将数据添加到当前数据的尾部_this.datas.push(...res.data.lists);}const firstItem = _this.datas[0];// 只创建当前视频的播放器,以免卡顿_this.playOrpauseFn();} }}).catch((err) => {console.error(err);})},// 上下切换视频changeHandler(e) {const _this = this;if (e.detail.source == 'touch') {const {current} = e.detail;// 将播放按钮隐藏_this.showPlayIcon = false;// 设置当前视频_this.current = current;// 只创建当前视频播放器,播放当前视频,暂停其他视频_this.playOrpauseFn();}},transitionHandler(e) {if (e.detail.dy === 0) {// 最后一条数据上拉加载下一页if (this.current === this.datas.length - 1) {if (this.pageStartY > this.pageEndY) {this.page = 1;this.id = this.datas.at(-1).id;this.getvideolists();}}// 第一条数据下拉加载上一页if (this.current === 0) {if (this.pageStartY < this.pageEndY) {this.page = -1;this.id = this.datas.at(0).id;this.getvideolists();}}}},// 获取当前触发的纵坐标以此来判断是上拉还是下拉// 记录开始滑动的手指的纵坐标touchStart(res) {if (this.current === this.datas.length - 1 || this.current === 0) {this.pageStartY = res.changedTouches[0].pageY;}},// 记录滑动结束的手指的纵坐标touchEnd(res) {if (this.current === this.datas.length - 1 || this.current === 0) {this.pageEndY = res.changedTouches[0].pageY;}},// 根据视频id创建播放器playOrpauseFn() {let video_id = this.datas[this.current].id;this.videoCtx = uni.createVideoContext(`video_${video_id}`, this);// 点击播放按钮视频播放,按钮隐藏,再点击视频暂停,按钮显示if (this.showPlayIcon) {this.videoCtx.seek(0);this.videoCtx.play();this.showPlayIcon = false;} else {this.videoCtx.pause();this.showPlayIcon = true;}}
}

七、sass:

	.widget-video {width: 100%;background-color: #000;overflow: hidden;.nav-bar {width: 100%;height: 88rpx;}}.video-list {width: 100%;height: 100%;.video-item {width: 100%;position: relative;.play-icon {width: 64rpx;height: 64rpx;}.right-icon-wrap {// width: 112rpx;bottom: 208rpx;right: 18rpx;.mt30 {margin-top: 60rpx;}.zan-num {// width: 68rpx;margin: auto;border-radius: 4rpx;font-weight: 600;color: #FFFFFF;transform: scale(0.8);}}.calcwidth {width: calc(100% - 130rpx);}.wrapper {display: flex;width: 100%;overflow: hidden;.video-title {overflow: hidden;text-overflow: ellipsis;text-align: justify;position: relative;}.video-title::before {content: '';height: calc(100% - 42rpx);float: right;}.expand {position: relative;float: right;clear: both;margin-left: 40rpx;color: #A9A9B8;cursor: pointer;border: 0;}.expand::before {content: '...';position: absolute;left: -10rpx;color: #fff;transform: translateX(-100%);}}}}

**end:**如果出现画面卡顿,声音播放等问题,请一定要关闭视频自动播放功能。

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

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

相关文章

excel要如何自动累加某个单元格上方的所有单元格?

输入公式 SUM(INDIRECT("A1:A"&ROW()-1)) 运行实例如下图 注意图中b4&#xff0c;和b5单元格都输入相同的公式。 此方法可以避免写vba&#xff0c;以前此类问题的解决都是通过vba代码进行处理 对函数进行解析 主要使用了 INDIRECT() 2、公式说明&#xff1a;…

Leetcode | Binary search | 22. 74. 162. 33. 34. 153.

22. Generate Parentheses 要意识到只要还有左括号&#xff0c;就可以放到path里。只要右括号数量小于左括号&#xff0c;也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index&#xff0c;并且每次只需要 …

打印Winform控件实现简陋版的分页打印(C#)

本文的代码可以从这里获取&#xff1a;winformDemo.rar 张祥裕/分享的资源名称 - Gitee.com 作者的水平有限&#xff0c;如有错误&#xff0c;望指正。 为了简单起见&#xff0c;纸张大小&#xff0c;打印机等信息按照默认的来&#xff0c;本文的实现方案是&#xff1a;打印Pa…

C语言:反转一个单链表

Lei宝啊&#xff1a;个人主页 题目&#xff1a; 描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 接口&#xff1a; struct ListNode* reverseList(struct ListNode* head){} 示例&#xff1a; 输入&#xff1a; head [1…

全局ip代理安全吗? 手机设置全局代理方法详解

全局IP代理并不一定是安全的&#xff0c;因为全局IP代理会将所有网络流量都通过代理服务器进行转发&#xff0c;包括敏感信息和隐私数据。如果代理服务器受到黑客攻击或存在安全漏洞&#xff0c;可能会导致数据泄露和其他安全问题。因此&#xff0c;在使用全局IP代理时&#xf…

Spring Boot项目的创建

hi 大家好,又见面了,今天继续讲解Spring Boot 文章目录 &#x1f436;1.什么是Spring Boot?&#x1f436;2.Spring Boot的优势&#x1f436;3.Spring Boot项目创建&#x1f33c;3.1使用ieda创建&#x1f95d;3.1.1下载插件Spring Boot Helper&#x1f95d;3.1.2创建项目 &…

VS创建wsdl服务提供给java调用

文章目录 前言1.c#创建asp.net web服务1.1 创建ASP.NET Web应用程序1.2 添加服务类1.3 定义服务方法1.3 浏览服务1.4 发布服务1.5 IIS部署服务 2.Java中调用服务2.1 用动态客户端工厂类调用2.1.1 引入依赖2.1.2 调用测试代码2.1.3 测试结果 2.2 创建代理类进行调用2.2.1 使用ws…

修改整数(有点坑,所以发出来了)

问题描述 小贝给了小聪一个正整数 x&#xff0c;但是小聪决定把这个数改掉。她可以把整数 x 每个位置上的数 t 改成 9-t。 请你帮助小聪来计算一下&#xff0c;如何把 x 改成一个最小的正整数&#xff0c;注意&#xff0c;不能出现首位为 0 的情况。 输入格式 输入一个正整数…

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作&#xff0c;今天宏哥就用具体例子&#xff0c;将上一篇中的理论知识实践一下。而且在实际测试过程中&#xff0c;有时候需要修改请求或响应数据&#xff0c;或者直接模拟服务器响应&#xff0c;此时可以使用fiddler进行…

容斥原理 训练笔记

​ 容斥原理 设S是一个有限集&#xff0c;A_1,A_2…A_n是S的n个子集&#xff0c;则 ∣ S − ⋃ i 1 n A i ∣ ∑ i 0 n ( − 1 ) i ∑ 1 ≤ j 1 < j 2 . . . < j i ≤ n ∣ ⋂ k 1 i A j k ∣ |S-\bigcup_{i1}^{n}A_i|\sum_{i0}^{n}(-1)^i\sum_{1\leq j_1< j_2.…

okvis

论文 Keyframe-Based Visual-Inertial SLAM Using Nonlinear Optimization 摘要 由于两种感知模式的互补性&#xff0c;视觉和惯性线索的融合在机器人中变得很流行。虽然迄今为止大多数融合策略都依赖于过滤方案&#xff0c;但视觉机器人界最近转向了非线性优化方法&#x…

【React Native】学习记录(二)——路由搭建和常见的开发技巧

模拟器设置成中文 在开发过程中发现&#xff0c;两个模拟器都不能输入中文&#xff0c;所以需要配置一下。 先说一下安卓&#xff0c;在弹出的输入框中查看设置&#xff0c;设置一下对应的languages即可&#xff1a; 在苹果模拟器中&#xff0c;跟苹果手机一样&#xff0c;打…

树莓派本地快速搭建web服务器,并发布公网访问

文章目录 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 随着科技的发展&#xff0c;电子工业也在不断进步&#xff0c;我们身边的电子设备也在朝着小型化和多功能化演进&#xff0c;以往体积庞大的电脑也在…

Selenium多浏览器处理

Python 版本 #导入依赖 import os from selenium import webdriverdef test_browser():#使用os模块的getenv方法来获取声明环境变量browserbrowser os.getenv("browser").lower()#判断browser的值if browser "headless":driver webdriver.PhantomJS()e…

为Android构建现代应用——应用架构

选择风格(Choosing a style) 我们将依照Google在《应用架构指南》中推荐的最佳实践和架构指南来构建OrderNow的架构。 这些定义包括通过各层定义组件的一些Clean Architecture原则。 层次的定义(Definition of the layers) 在应用程序中&#xff0c;我们将定义以下主要层次…

小程序创建

1&#xff0c;下载HBuilder X ;(3.8.7) HBuilderX-高效极客技巧 2,下载模板&#xff08;不选云服务的&#xff09;&#xff1b; 3&#xff0c;运行-运行到小程序模拟器&#xff1b; 4&#xff0c;安装小程序开发工具&#xff1b; 5&#xff0c;选择稳定版-windows64版&…

SpringBoot 统⼀功能处理

目录 前言 1.⽤户登录权限效验 1.1、最初⽤户登录效验 1.2、Spring AOP ⽤户统⼀登录验证的问题 1.3、Spring 拦截器 了解 创建一个 Spring 拦截器 的流程 1、 创建自定义拦截器&#xff0c;实现 HandlerInterceptor 接⼝的preHandle&#xff08;执⾏具体⽅法之前的预处理…

win10日程怎么同步到安卓手机?电脑日程同步到手机方法

在如今快节奏的生活中&#xff0c;高效地管理时间变得至关重要。而对于那些经常在电脑上安排日程的人来说&#xff0c;将这些重要的事务同步到手机上成为了一个迫切的需求。因为目前国内使用win10系统电脑、安卓手机的用户较多&#xff0c;所以越来越多的职场人士想要知道&…

Jenkins 安装构建

一、CentOS 安装 1. 使用该存储库 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key 2. 安装 Java yum install fontconfig java-11-openjdk配…