微信小程序仿抖音视频之整屏上下切换功能的实现代码


Posted in Javascript onMay 24, 2020

效果演示:

微信小程序仿抖音视频之整屏上下切换功能的实现代码

WXML:

<view class="video_box">
 <view bindtouchend="touchEnd" id="myVideo{{index}}" animation="{{animation}}" bindtouchstart="touchStart" bindtouchmove="touchMove" class="video_list" wx:for="{{video_list}}" data-index="{{index}}" wx:key="index" >
  <text style="color:red;font-size:30px;display:block;">{{index}}</text>
  <video custom-cache="{{false}}" src="{{item.video_src}}" vslide-gesture-in-fullscreen="{{false}}" direction = '{{0}}' enable-progress-gesture="{{false}}" show-fullscreen-btn="{{false}}" object-fit="cover"></video>
 </view>
</view>

WXSS:

.video_box{width: 100%;height: auto;position: fixed;top:0;bottom: 0;background-color: #000;}
.video_list{width: 100%;height: 100vh;position: relative;}
.video_list video{position: absolute;top:50%;margin-top:-30vw; width: 100%;height:56vw;padding: 0;}
Page({
 /**
  * 页面的初始数据
  */
 data: {
  video_list:[
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218093206z8V1JuPlpe.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/article/202002/17/c292033ef110de9f42d7d539fe0423cf.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218025702PSiVKDB5ap.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/article/202002/18/2fca1c77730e54c7b500573c2437003f.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218093206z8V1JuPlpe.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218114723HDu3hhxqIT.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218025702PSiVKDB5ap.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/article/202002/17/c292033ef110de9f42d7d539fe0423cf.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218093206z8V1JuPlpe.mp4'},
   {video_src:'https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218114723HDu3hhxqIT.mp4'},
  ],
  pageY:'',    // 触摸起始高度坐标
  animation:'',  // 视频划动动画
  up_stroke:false,// ture:上划;false:下划
  difference:'', // 拖动的距离
  windowHeight:'',// 屏幕高度
 },
 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function (options) {
  // 赋值:屏幕高度、
  this.setData({
   windowHeight:wx.getSystemInfoSync().windowHeight
  })
 },
 // 划动起始坐标方法
 touchStart(e){
  // 开始坐标
  this.setData({
   pageY:e.touches[0].pageY,
  })
 },
 // 划动过程坐标方法
 touchMove(e){
  let n = e.currentTarget.dataset.index;   // 触摸的第几个序号
  let difference = e.touches[0].pageY - this.data.pageY; // 移动后和起始值的差值
  if(this.is_continue(n,difference)){    // 判断是否到底
   return;
  } 
  // 划动动画 -------------------------------------
  var animation = wx.createAnimation({    // 移动动效
   duration: 0,
  });
  animation.top(difference - (n*this.data.windowHeight)).step()
  this.setData({
   animation: animation.export(),     // 动画
   up_stroke:difference > 0 ? false : true, // 是否上划,
   difference:difference,          // 拖动的距离
  })
 },
 // 划动结束坐标方法
 touchEnd(e){
  let n = e.currentTarget.dataset.index;
  let difference = this.data.difference; // 拖动的距离
  if(this.is_continue(n,difference)){
   return;
  }
  const windowHeight = this.data.windowHeight;   // 屏幕高度
  let that = this;
  // 根据id获取点击元素距顶部高度
  var query = wx.createSelectorQuery();
  let id = '#' + e.currentTarget.id;
  query.select(id).boundingClientRect(function (rect) { // 获取高度
   if(Math.abs(difference) <= windowHeight /7){   // 小于1/7回原位置 ---------------------------
    var animation = wx.createAnimation({ // 移动动效
     duration: 100,
    });
    animation.top(-(n * windowHeight)).step()
    that.setData({
     animation: animation.export(),
     up_stroke:false, // 重置划动状态
     difference:0,   // 重置划动距离
    })
   }else{ // 大于1/4,移至拖动的下一个视频 --------------------------------
    var animation = wx.createAnimation({ // 移动动效
     duration: 200,
    });
    that.data.up_stroke ? n++ : n--;   // 上划:n+1 下划:n-1
    animation.top(-(n * windowHeight)).step()
    that.setData({
     animation: animation.export(),
     up_stroke:false, // 重置划动状态
     difference:0,   // 重置划动距离
    })
   }
  }).exec();
 },
 // 判断是否到底
 is_continue(n,difference){
  if(difference < 0){ // 上划
   if(n == this.data.video_list.length - 1){ // 最后一个视频,提示到底
    if(difference < -20){
     wx.showToast({
      title: '已经到底了~~',
      icon:'none',
      duration:1000
     })
    }
    return true;
   }
  }else{
   if(n == 0){
    if(difference > 20){
     wx.showToast({
      title: '上面没有了~~',
      icon:'none',
      duration:1000
     })
    }
    return true;
   }
  }
 },
})

总结

到此这篇关于微信小程序仿抖音视频之整屏上下切换功能的实现代码的文章就介绍到这了,更多相关微信小程序抖音视频整屏切换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
Feb 03 Javascript
javascript学习笔记(九) js对象 设计模式
Jun 19 Javascript
js模拟点击事件实现代码
Nov 06 Javascript
将list转换为json失败的原因
Dec 17 Javascript
JS中判断JSON数据是否存在某字段的方法
Mar 07 Javascript
js实现滑动触屏事件监听的方法
May 05 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
Sep 27 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
微信小程序之事件交互操作实例分析
Dec 03 Javascript
JS实现简单的抽奖转盘效果示例
Feb 16 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
jQuery实现可以扩展的日历
Dec 01 jQuery
如何使用vue slot创建一个模态框的实例代码
May 24 #Javascript
使用React代码动态生成栅格布局的方法
May 24 #Javascript
ES6对象操作实例详解
May 23 #Javascript
ES6函数和数组用法实例分析
May 23 #Javascript
ES6箭头函数和扩展实例分析
May 23 #Javascript
ES6新增的数组知识实例小结
May 23 #Javascript
ES6扩展运算符和rest运算符用法实例分析
May 23 #Javascript
You might like
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
JavaScript 面向对象之命名空间
2010/05/04 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
调解协议书
2014/04/16 职场文书
项目建议书范文
2014/05/12 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
房贷工资证明范本
2015/06/12 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
Django框架之路由用法
2022/06/10 Python
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS