微信小程序视频加轮播图示例
- 小程序
- 2022-01-07
- 4327
- 0
- index.html
<view style="padding:0" data-e="{{e}}" bindtouchstart="start" bindtouchend="end"><swiper wx:if="{{!videoSrc}}" current="{{current}}" class="swiper" circular="{{true}}" indicator-dots="{{true}}" data-e="{{e}}" bindchange="changeCurrent"><view wx:for="{{info}}" wx:key="this"><swiper-item><image src="{{item.img}}" class="banner" mode='aspectFill' /><image class="play" wx:if="{{item.type == 'video'}}" src='/images/play.png'bindtap="play" data-item="{{item}}"/></swiper-item></view></swiper><!-- 视频的autoplay和controls属性要加上,不加有的安卓手机在缓冲的时候没有loading效果 --><video enable-progress-gesture="{{false}}" custom-catch="{{false}}" wx:if="{{videoSrc}}" class="video" autoplay="{{true}}" src="{{videoSrc}}" controls="controls" bindpause="handleStop" ></video></view>
- index.js
//index.js//获取应用实例const app = getApp()Page({data: {info: [],videoSrc:'',videoImg:'',//视频封面,缓冲时会出现黑屏,加视频封面会提升用户体验autoplay:true,touchX:0,//手指按下时x的坐标touchY:0,//手指按下时y的坐标interval:null,//计时器time:0,//按下到松开的时间current:0//swiper的当前轮播图下标},//事件处理函数play: function(val) {this.setData({ videoSrc: val.currentTarget.dataset.item.video, autoplay: false, videoImg: val.currentTarget.dataset.item.img})},//禁止视频的手动控制进度属性,监听手指移动去滑动轮播图(手指滑动轮播图和控制视频进度事件冲突)//手指开始触屏start:function(e){//获取触摸的原始点this.setData({touchX: e.touches.length>0 ? e.touches[0].pageX : 0,touchY: e.touches.length > 0 ? e.touches[0].pageY : 0})let timeNew=this.data.time//开始记录时间this.data.interval=setInterval(()=>timeNew++,100)this.setData({time:timeNew})},//手指结束触屏end:function(e){let touchX = e.changedTouches.length > 0 ? e.changedTouches[0].pageX : 0let touchY = e.changedTouches.length > 0 ? e.changedTouches[0].pageY : 0let tmX = touchX - this.data.touchXlet tmY = touchY - this.data.touchYif(this.data.time < 10){let absX = Math.abs(tmX)let absY = Math.abs(tmY)if(absX > 2*absY){console.log('5555')//滑动swiper,视频停止播放this.setData({autoplay:true,videoSrc:'',videoImg:''})if(tmX < 0){//左滑console.log('左滑')this.setData({current : this.data.current == (this.data.info.length-1) ? 0 : this.data.current+1})}else{//右滑console.log('右滑')this.setData({current : this.data.current>0 ? this.data.current-1 : this.data.info.length-1})}}}clearInterval(this.data.interval)this.setData({time:0})},handleStop:function(){this.setData({ videoSrc: '', autoplay: true, videoImg:''})},changeCurrent:function(e){//手指滑动轮播图已经在视频播放的时候做了,这里只需要做轮播图自动滚动,但是不停的调用setData可能会出现一些未知的bug,可根据需求场景设置if(e.detail.source == 'autoplay'){this.setData({current:e.detail.current})}},onShow: function() {//从后台拿回数据,写在onshow里面是因为返回此页面时,根据需求去判断是否拿swiper数据let info = [{id: '1',img: 'http://img4.imgtn.bdimg.com/it/u=3882508552,2527877926&fm=26&gp=0.jpg',type: 'video',video: 'https://interface.sina.cn/wap_api/video_location.d.html?cid=37766&table_id=36885&did=icezueu6231605&vt=4&creator_id=1001&vid=30447305701&video_id=304473057&r=video.sina.cn%2Fnews%2F2019-09-16%2Fdetail-iicezueu6231605.d.html&wm=30490005525198963&time=1577412073497&rd=0.018419081320328656'},{id: '2',img: 'http://img2.imgtn.bdimg.com/it/u=3355791600,110151422&fm=26&gp=0.jpg',type: 'img',video: ''},{id: '3',img: 'http://img3.imgtn.bdimg.com/it/u=2846566051,411513524&fm=26&gp=0.jpg',type: 'img',video: ''}]this.setData({info})},onHide:function(){//小程序进入后台禁止轮播,防止swiper出现抽搐的bugthis.setData({autoplay:false,videoSrc:'',})}})
index.wxss
.swiper{width:100%;height:450rpx;}.banner{width:100%;height:100%;}.play{width:100rpx;height:100rpx;position:absolute;top:175rpx;left:50%;margin-left:-50rpx;}.video{width:100%;height:450rpx;position:absolute;top:0;}
效果图
github 项目地址:https://github.com/kesixin/VideoDemo