Vue左滑组件slider使用详解


Posted in Javascript onAugust 21, 2020

slider组件与swiper组件不同,slider滑动时并不翻页,实现的是左滑时,显示右侧内容的功能

Vue左滑组件slider使用详解

1、主要思路

思路和swiper组件类似,主要的也就是对三个触摸事件的处理:touchstart、touchmove、touchend

在touchstart事件处理程序中记录一些初始值,比如原始坐标,偏移距离;在touchmove事件处理程序中计算实时滑动的距离,让元素随之一起偏移,与swiper不同的是,slider在左滑之前,不能右滑,以及滑动时,右侧元素的宽度要同步变化;在touchend事件处理程序中计算最终的滑动距离,左滑且大于阙值则滑动固定值,右滑或小于阙值则回到起始位置,右侧元素的宽度要同步变化。

slider组件可以接收三个参数:

rightWidth: 右侧滑出宽度的百分比

isClickBack: 点击是否收起右侧

isMainSlide: 左侧是否滑动(false则覆盖左侧)

2、代码实现

页面结构:有两个slot来展示左右两边的内容

<template>
 <div class="ths_slider" ref="slider">
 <div class="main"
  @touchstart="touchstart"
  @touchmove="touchmove"
  @touchend="touchend">
  <slot name="main"></slot>
 </div>
 <div class="right" ref="right">
  <slot name="right"></slot>
 </div>
 </div>
</template>

初始设置:记录页面宽度,根据参数isMainSlide来判断滑动的元素

mounted () {
 this.pageWidth = document.documentElement.clientWidth
 this.sliderEle = this.isMainSlide ? this.$refs.slider : this.$refs.right
}

事件处理:

touchstart (e) {
 this.originalPos = e.touches[0].pageX
 const transform = this.sliderEle.style.transform
 this.originalLeft = Number(transform ? transform.split('(')[1].split('px')[0] : 0)
 this.oriRigWidth = this.originalLeft < 0 ? Number(this.$refs.right.style.width.split('px')[0]) : 0
},
touchmove (e) {
 let moveDistance = e.touches[0].pageX - this.originalPos // >0 右滑,<0 左滑
 if (moveDistance > 0 && this.originalLeft >= 0) { // 未向左边滑动时,不能右滑
 return false
 }
 this.doSlide(moveDistance / 2 + this.originalLeft) // 除以2来控制滑动速度
},
touchend (e) {
 const moveDistance = e.changedTouches[0].pageX - this.originalPos // >0 右滑,<0 左滑
 let distance
 if (!this.isClickBack && moveDistance === 0) { // 点击时不收起右侧
 return false
 }
 if ((-moveDistance) > 50) { // 向左滑动超过阙值时,右侧滑出固定距离
 distance = this.pageWidth * this.rightWidth / 100
 } else { // 向左滑动未超过阙值,或向右滑动时,回原位
 distance = 0
 }
 this.doSlide(-distance, true)
},
/**
 * 滑动方法---位置变化 && 右侧宽度变化
 * @param {Number} distance 滑动距离
 * @param {Boolean} animate 滑动是否有动画效果
 */
doSlide (distance, animate = false) {
 this.sliderEle.style.transform = `translateX(${distance}px)`
 this.$refs.right.style.width = -distance + 'px'
 if (this.isMainSlide) {
 this.sliderEle.style.transition = animate ? 'transform .5s' : 'initial'
 this.$refs.right.style.transition = animate ? 'width .5s' : 'initial'
 } else {
 this.sliderEle.style.transition = animate ? 'transform .5s, width .5s' : 'initial'
 }
}

3、组件使用

父组件可以调用slider组件的doSlide()方法来实现点击唤出右侧元素

<t-slider class="slider">
 <template slot="main">左侧滑动</template>
 <template slot="right">
 <div class="edit">编辑</div>
 <div class="delete">删除</div>
 </template>
</t-slider>
<t-slider class="slider" :rightWidth="rightWidth" :isMainSlide="false">
 <template slot="main">
 <div>覆盖左侧</div>
 <div class="btn" @click="showRight">点击唤出</div>
 </template>
 <template slot="right">
 <div class="newContent">newContent</div>
 </template>
</t-slider>
<t-slider class="slider" :isClickBack="false">
 <template slot="main">点击不收起</template>
 <template slot="right">
 <div class="edit">编辑</div>
 <div class="delete">删除</div>
 </template>
</t-slider>
components: {TSlider},
data () {
 return {
 pageWidth: null,
 rightWidth: 80
 }
},
mounted () {
 this.pageWidth = document.documentElement.clientWidth
},
 
methods: {
 showRight () {
 this.$refs.mainSlider.doSlide(-this.pageWidth * this.rightWidth / 100, true)
 }
}

4、效果展示

Vue左滑组件slider使用详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js用图作提交按钮或超连接
Mar 26 Javascript
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
Oct 17 Javascript
javascript高级编程之函数表达式 递归和闭包函数
Nov 29 Javascript
JavaScript 数组中最大最小值
Jun 05 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
详解ES6通过WeakMap解决内存泄漏问题
Mar 09 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 Javascript
vue实现移动端触屏拖拽功能
Aug 21 #Javascript
vue实现移动端拖动排序
Aug 21 #Javascript
微信小程序实现聊天室
Aug 21 #Javascript
vue实现折线图 可按时间查询
Aug 21 #Javascript
Vue按时间段查询数据组件使用详解
Aug 21 #Javascript
js绘制一条直线并旋转45度
Aug 21 #Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 #Javascript
You might like
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
javascript,php获取函数参数对象的代码
2011/02/03 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
react基本安装与测试示例
2020/04/27 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
python实现画圆功能
2018/01/25 Python
单链表反转python实现代码示例
2018/02/08 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python实现字符串和字典的转换
2018/09/29 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
《狼和小羊》教学反思
2014/04/20 职场文书
2015年支教教师工作总结
2015/07/22 职场文书