左滑删除在移动端是很常见的一种操作,常见于删除购物车中的商品,删除收藏夹中文章等等场景。我们只需要手指按住要删除的对象,然后轻轻向左滑动,便会出现删除按钮,然后点击删除按钮即可删除对象。
点击下载源码
今天我给大家介绍的移动端左滑删除效果是基于Vue2实现的,结合以电商平台的删除购物车商品为例,来看实现步骤。
准备
安装vue项目过程已忽略,如果不懂vue的同学可以上官网看下:https://cn.vuejs.org/v2/guide/installation.html#NPM
我们使用安装一个webpack模板:
vue init webpack test
组件
我们创建一个左滑删除组件,在src/components目录下创建文件:deleteTemplate.vue,然后编写模板代码:
<template> <div class="delete"> <div class="slider"> <div class="content" @touchstart='touchStart' @touchmove='touchMove' @touchend='touchEnd' :style="deleteSlider"> <!-- 插槽中放具体项目中需要内容 --> <slot name="img"></slot> <slot name="title"></slot> <slot name="price"></slot> <!-- 默认插槽 --> <slot></slot> </div> <div class="remove" ref='remove' @click="deleteLine"> 删除 </div> </div> </div> </template>
我们这个模板是一个要左滑删除的列表项,绑定了手势滑动触控动作响应,在其中加入了图片、商品名称和价格等内容,以及一个删除按钮。
接下来,我们看组件中的js部分:
<script> export default { props: ['index'], data() { return { startX: 0, //触摸位置 endX: 0, //结束位置 moveX: 0, //滑动时的位置 disX: 0, //移动距离 deleteSlider: '',//滑动时的效果,使用v-bind:style="deleteSlider" } }, methods:{ touchStart(ev){ ev = ev || event //tounches类数组,等于1时表示此时有只有一只手指在触摸屏幕 if(ev.touches.length == 1){ // 记录开始位置 this.startX = ev.touches[0].clientX; } }, touchMove(ev){ ev = ev || event; //获取删除按钮的宽度,此宽度为滑块左滑的最大距离 let wd = this.$refs.remove.offsetWidth; if(ev.touches.length == 1) { // 滑动时距离浏览器左侧实时距离 this.moveX = ev.touches[0].clientX //起始位置减去 实时的滑动的距离,得到手指实时偏移距离 this.disX = this.startX - this.moveX; //console.log(this.disX) // 如果是向右滑动或者不滑动,不改变滑块的位置 if (this.disX < 0 || this.disX == 0) { this.deleteSlider = "transform:translateX(0px)"; } else if (this.disX > 0) {// 大于0,表示左滑了,此时滑块开始滑动 //具体滑动距离我取的是 手指偏移距离*5。 this.deleteSlider = "transform:translateX(-" + this.disX*5 + "px)"; // 最大也只能等于删除按钮宽度 if (this.disX*5 >= wd) { this.deleteSlider = "transform:translateX(-" +wd+ "px)"; } } } }, touchEnd(ev){ ev = ev || event; let wd = this.$refs.remove.offsetWidth; if (ev.changedTouches.length == 1) { let endX = ev.changedTouches[0].clientX; this.disX = this.startX - endX; //console.log(this.disX) //如果距离小于删除按钮一半,强行回到起点 if ((this.disX*5) < (wd/2)) { this.deleteSlider = "transform:translateX(0px)"; }else{ //大于一半 滑动到最大值 this.deleteSlider = "transform:translateX(-"+wd+ "px)"; } } }, deleteLine (){ this.deleteSlider = "transform:translateX(0px)"; this.$emit('deleteLine'); } } } </script>
我们在代码中主要用到三个移动端触控事件:
touchstart : 手指放到屏幕上时触发
touchmove : 手指在屏幕上滑动式触发
touchend :手指离开屏幕时触发
每个触控事件被触发后,会生成一个event对象,event对象里额外包括以下三个触控列表
touches : 当前屏幕上所有手指的列表
targetTouches : 当前dom元素上手指的列表,尽量使用这个代替touches
changedTouches : 涉及当前事件的手指的列表,尽量使用这个代替touches
这些列表里的每次触控由touch对象组成,touch对象里包含着触控信息,主要属性如下:
clientX / clientY : 触摸点相对浏览器窗口的位置
pageX / pageY : 触摸点相对于页面的位置
screenX / screenY : 触摸点相对于屏幕的位置
在上述代码中还可以看到,当滑块没有超过删除按钮的一半时自动回到起点位置。点击删除后调用deleteLine删除当前行。
组件调用
我们在HelloWorld.vue中建立模板,引入组件deleteSlider,代码如下:
<template> <div class="mylist"> <delete-slider v-for="(list, index) in dataList" :key="index" @deleteLine="deleteLine(index, list.id)"> <div class="li-img" slot="img"><img :src="/UploadFiles/2021-04-02/list.img">注意实际应用中数据源可用异步加载,在删除的时候或许要异步请求后端来真正完成删除操作。
总结
以上所述是小编给大家介绍的使用Vue实现移动端左滑删除效果附源码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。