微信小程序视频加轮播图示例
发布于 5 年前 作者 chaozhu 424 次浏览 来自 分享
  • 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 : 0
    let touchY = e.changedTouches.length > 0 ? e.changedTouches[0].pageY : 0
    let tmX = touchX - this.data.touchX
    let tmY = touchY - this.data.touchY
    if(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出现抽搐的bug
    this.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

回到顶部