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


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 相关文章推荐
10个基于Jquery的幻灯片插件教程
Oct 29 Javascript
jQuery :nth-child前有无空格的区别分析
Jul 11 Javascript
jquery中animate动画积累的解决方法
Oct 05 Javascript
超级给力的JavaScript的React框架入门教程
Jul 02 Javascript
javascript中$(function() {});写与不写有哪些区别
Aug 10 Javascript
谷歌Chrome浏览器扩展程序开发小记
Jan 06 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
Jul 13 Javascript
jquery实现点击弹出对话框
Feb 08 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
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
JS 进度条效果实现代码整理
2011/05/21 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
微信小程序日历组件使用方法详解
2018/12/29 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
python如何安装下载后的模块
2020/07/03 Python
在Python中实现字典反转案例
2020/12/05 Python
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
销售人员中英文自荐信
2013/09/22 职场文书
给同事的道歉信
2014/01/11 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书