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


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 相关文章推荐
JavaScript获得选中文本内容的方法
Dec 02 Javascript
js基础知识(公有方法、私有方法、特权方法)
Nov 06 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
jquery获取点击控件的绝对位置简单实例
Oct 13 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
puppeteer实现html截图的示例代码
Jan 10 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
JS实现获取当前所在周的周六、周日示例分析
May 11 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 Javascript
vue框架制作购物车小球动画效果实例代码
Sep 26 Javascript
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
如何使用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
我的论坛源代码(十)
2006/10/09 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
Vue.js实现tab切换效果
2019/07/24 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
如何写好优秀的创业计划书
2014/01/30 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
React forwardRef的使用方法及注意点
2021/06/13 Javascript
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
Echarts如何重新渲染实例详解
2022/05/30 Javascript