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查找字符串中出现最多的字符和次数的小例子
Oct 29 Javascript
Jquery取得iframe下内容的方法
Nov 18 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
bootstrap弹出层的多种触发方式
May 10 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
vue生命周期的探索
Apr 03 Javascript
js实现提交前对列表数据的增删改查
Jan 16 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
Nov 07 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
小程序实现列表点赞功能
2018/11/02 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
Python3生成手写体数字方法
2018/01/30 Python
使用tensorflow实现线性svm
2018/09/07 Python
python实现AES加密与解密
2019/03/28 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
前台接待的工作职责
2013/11/21 职场文书
爱与责任演讲稿
2014/05/20 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
2014年预算员工作总结
2014/12/05 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
2015年防汛工作总结
2015/05/15 职场文书
网吧温馨提示
2015/07/17 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python