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 相关文章推荐
在b/s开发中经常用到的javaScript技术
Aug 23 Javascript
js判断屏幕分辨率的代码
Jul 16 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
jQuery代码实现对话框右上角菜单带关闭×
May 03 Javascript
微信小程序 wxapp视图容器 view详解
Oct 31 Javascript
Vue.js递归组件构建树形菜单
Dec 24 Javascript
vue按需加载实例详解
Sep 06 Javascript
原生JS实现烟花效果
Mar 10 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日历[测试通过]
2008/03/27 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
php生成随机数的三种方法
2014/09/10 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
使用tensorflow实现线性svm
2018/09/07 Python
Python3远程监控程序的实现方法
2019/07/15 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
python db类用法说明
2020/07/07 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
地理教师岗位职责
2014/03/16 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
事业单位聘任报告
2015/03/02 职场文书
工作试用期自我评价
2015/03/10 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis