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 相关文章推荐
IE6/7/8/9不支持exec的简写方式
May 25 Javascript
js渐变显示渐变消失示例代码
Aug 01 Javascript
jQuery基于当前元素进行下一步的遍历
May 20 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
Jun 14 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
Oct 22 Javascript
JavaScript数组的栈方法与队列方法详解
May 26 Javascript
如何快速上手Vuex
Feb 14 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
Jun 01 Javascript
React中阻止事件冒泡的问题详析
Apr 12 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
Oct 27 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生成html分页列表的代码
2007/03/18 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php curl模拟post请求小实例
2013/11/13 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
php控制文件下载速度的方法
2015/03/24 PHP
Jquery对数组的操作技巧整理
2014/03/25 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
JavaScript错误处理
2015/02/03 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python实现下载文件的三种方法
2017/02/09 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
青年创业培训欢迎词
2014/01/08 职场文书
迎新晚会策划方案
2014/06/13 职场文书
中央空调节能方案
2014/06/15 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
通知函的格式
2015/04/27 职场文书
倡议书怎么写?
2019/04/11 职场文书
如何书写授权委托书?
2019/06/25 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
Python使用pyecharts控件绘制图表
2022/06/05 Python