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 相关文章推荐
防止页面被iframe(兼容IE,Firefox火狐)
Jul 04 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
JQuery中如何传递参数如click(),change()等具体实现
Apr 28 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 Javascript
如何在Linux上安装Node.js
Apr 01 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
详解webpack分包及异步加载套路
Jun 29 Javascript
js实现日期显示的一些操作(实例讲解)
Jul 27 Javascript
React中常见的动画实现的几种方式
Jan 10 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 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
php表单处理操作
2017/11/16 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
回调函数的意义以及python实现实例
2017/06/20 Python
浅谈Django REST Framework限速
2017/12/12 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
Python中偏函数用法示例
2018/06/07 Python
django使用LDAP验证的方法示例
2018/12/10 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python使用python-docx读写word文档
2019/08/26 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Python类型转换的魔术方法详解
2020/12/23 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
新锐科技Java程序员面试题
2016/07/25 面试题
2013年入党人员的自我鉴定
2013/10/25 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
理财计划书
2014/08/14 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
Go timer如何调度
2021/06/09 Golang