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 相关文章推荐
JavaScript中“+=”的应用
Feb 02 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
Aug 24 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
分类解析jQuery选择器
Nov 23 Javascript
JS新包管理工具yarn和npm的对比与使用入门
Dec 09 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
jQuery实现列表的增加和删除功能
Jun 14 jQuery
Vue自定义指令上报Google Analytics事件统计的方法
Feb 25 Javascript
JS实现放大镜效果
Sep 21 Javascript
vue 图片裁剪上传组件的实现
Nov 12 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
解读Vue组件注册方式
May 15 Vue.js
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
Ajax PHP分页演示
2007/01/02 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
python使用Flask操作mysql实现登录功能
2018/05/14 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python中函数参数匹配模型详解
2019/06/09 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
办公室年终个人自我评价
2013/10/28 职场文书
销售内勤岗位职责
2014/04/15 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
初中军训感想
2015/08/07 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang