使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果附源碼
左滑刪除在移動(dòng)端是很常見(jiàn)的一種操作,常見(jiàn)于刪除購(gòu)物車中的商品,刪除收藏夾中文章等等場(chǎng)景。我們只需要手指按住要?jiǎng)h除的對(duì)象,然后輕輕向左滑動(dòng),便會(huì)出現(xiàn)刪除按鈕,然后點(diǎn)擊刪除按鈕即可刪除對(duì)象。
今天我給大家介紹的移動(dòng)端左滑刪除效果是基于Vue2實(shí)現(xiàn)的,結(jié)合以電商平臺(tái)的刪除購(gòu)物車商品為例,來(lái)看實(shí)現(xiàn)步驟。
準(zhǔn)備
安裝vue項(xiàng)目過(guò)程已忽略,如果不懂vue的同學(xué)可以上官網(wǎng)看下:https://cn.vuejs.org/v2/guide/installation.html#NPM
我們使用安裝一個(gè)webpack模板:
vue init webpack test
組件
我們創(chuàng)建一個(gè)左滑刪除組件,在src/components目錄下創(chuàng)建文件:deleteTemplate.vue,然后編寫模板代碼:
<template>
<div class="delete">
<div class="slider">
<div class="content" @touchstart='touchStart' @touchmove='touchMove' @touchend='touchEnd' :style="deleteSlider">
<!-- 插槽中放具體項(xiàng)目中需要內(nèi)容 -->
<slot name="img"></slot>
<slot name="title"></slot>
<slot name="price"></slot>
<!-- 默認(rèn)插槽 -->
<slot></slot>
</div>
<div class="remove" ref='remove' @click="deleteLine">
刪除
</div>
</div>
</div>
</template>
我們這個(gè)模板是一個(gè)要左滑刪除的列表項(xiàng),綁定了手勢(shì)滑動(dòng)觸控動(dòng)作響應(yīng),在其中加入了圖片、商品名稱和價(jià)格等內(nèi)容,以及一個(gè)刪除按鈕。
接下來(lái),我們看組件中的js部分:
<script>
export default {
props: ['index'],
data() {
return {
startX: 0, //觸摸位置
endX: 0, //結(jié)束位置
moveX: 0, //滑動(dòng)時(shí)的位置
disX: 0, //移動(dòng)距離
deleteSlider: '',//滑動(dòng)時(shí)的效果,使用v-bind:style="deleteSlider"
}
},
methods:{
touchStart(ev){
ev = ev || event
//tounches類數(shù)組,等于1時(shí)表示此時(shí)有只有一只手指在觸摸屏幕
if(ev.touches.length == 1){
// 記錄開(kāi)始位置
this.startX = ev.touches[0].clientX;
}
},
touchMove(ev){
ev = ev || event;
//獲取刪除按鈕的寬度,此寬度為滑塊左滑的最大距離
let wd = this.$refs.remove.offsetWidth;
if(ev.touches.length == 1) {
// 滑動(dòng)時(shí)距離瀏覽器左側(cè)實(shí)時(shí)距離
this.moveX = ev.touches[0].clientX
//起始位置減去 實(shí)時(shí)的滑動(dòng)的距離,得到手指實(shí)時(shí)偏移距離
this.disX = this.startX - this.moveX;
//console.log(this.disX)
// 如果是向右滑動(dòng)或者不滑動(dòng),不改變滑塊的位置
if (this.disX < 0 || this.disX == 0) {
this.deleteSlider = "transform:translateX(0px)";
} else if (this.disX > 0) {// 大于0,表示左滑了,此時(shí)滑塊開(kāi)始滑動(dòng)
//具體滑動(dòng)距離我取的是 手指偏移距離*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)
//如果距離小于刪除按鈕一半,強(qiáng)行回到起點(diǎn)
if ((this.disX*5) < (wd/2)) {
this.deleteSlider = "transform:translateX(0px)";
}else{
//大于一半 滑動(dòng)到最大值
this.deleteSlider = "transform:translateX(-"+wd+ "px)";
}
}
},
deleteLine (){
this.deleteSlider = "transform:translateX(0px)";
this.$emit('deleteLine');
}
}
}
</script>
我們?cè)诖a中主要用到三個(gè)移動(dòng)端觸控事件:
touchstart : 手指放到屏幕上時(shí)觸發(fā)
touchmove : 手指在屏幕上滑動(dòng)式觸發(fā)
touchend :手指離開(kāi)屏幕時(shí)觸發(fā)
每個(gè)觸控事件被觸發(fā)后,會(huì)生成一個(gè)event對(duì)象,event對(duì)象里額外包括以下三個(gè)觸控列表
touches : 當(dāng)前屏幕上所有手指的列表
targetTouches : 當(dāng)前dom元素上手指的列表,盡量使用這個(gè)代替touches
changedTouches : 涉及當(dāng)前事件的手指的列表,盡量使用這個(gè)代替touches
這些列表里的每次觸控由touch對(duì)象組成,touch對(duì)象里包含著觸控信息,主要屬性如下:
clientX / clientY : 觸摸點(diǎn)相對(duì)瀏覽器窗口的位置
pageX / pageY : 觸摸點(diǎn)相對(duì)于頁(yè)面的位置
screenX / screenY : 觸摸點(diǎn)相對(duì)于屏幕的位置
在上述代碼中還可以看到,當(dāng)滑塊沒(méi)有超過(guò)刪除按鈕的一半時(shí)自動(dòng)回到起點(diǎn)位置。點(diǎn)擊刪除后調(diào)用deleteLine刪除當(dāng)前行。
組件調(diào)用
我們?cè)贖elloWorld.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="list.img" alt=""></div>
<h3 class="li-title" slot="title">{{list.title}}</h3>
<p class="li-price" slot="price">{{list.price}}</p>
</delete-slider>
</div>
</template>
<script>
import deleteSlider from '@/components/deleteTemplate.vue'
export default {
components: {
deleteSlider
},
data () {
return {
dataList: [
{
id: 1,
img: 'static/a1.jpg',
title: '法國(guó)專柜2019夏季新款修身顯瘦氣質(zhì)包臀短裙鏤空蕾絲性感連衣裙子',
price: '399.00'
},
{
id: 2,
img: 'static/a2.jpg',
title: 'VERAMOON 亮片印花短袖連衣裙女夏甜美露背性感泡泡袖修身短裙',
price: '689.00'
},
{
id: 3,
img: 'static/a3.jpg',
title: 'famous 仙氣木耳邊紫色小碎花短裙a字雪紡連衣裙女',
price: '199.00'
},
{
id: 4,
img: 'static/a4.jpg',
title: '灰灰定制 2019春夏新款小香風(fēng)粗花呢連衣裙女法式名媛復(fù)古短裙M家',
price: '298.00'
}
]
}
},
methods:{
deleteLine (index, id){
console.log(id);
this.dataList.splice(index, 1)
}
}
}
</script>
注意實(shí)際應(yīng)用中數(shù)據(jù)源可用異步加載,在刪除的時(shí)候或許要異步請(qǐng)求后端來(lái)真正完成刪除操作。
總結(jié)
以上所述是小編給大家介紹的使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果附源碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
element表格數(shù)據(jù)部分模糊的實(shí)現(xiàn)代碼
這篇文章給大家介紹了element表格數(shù)據(jù)模糊的實(shí)現(xiàn)代碼,文中有詳細(xì)的效果展示和實(shí)現(xiàn)代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01
vue實(shí)現(xiàn)滾動(dòng)鼠標(biāo)滾輪切換頁(yè)面
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)滾動(dòng)鼠標(biāo)滾輪切換頁(yè)面,類似于縱向走馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
vue基于Echarts的拖拽數(shù)據(jù)可視化功能實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于vue基于Echars的拖拽數(shù)據(jù)可視化功能實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
vue的diff算法知識(shí)點(diǎn)總結(jié)
本篇文章給大家分享了關(guān)于vue的diff算法的相關(guān)知識(shí)點(diǎn)總結(jié),有興趣的朋友參考學(xué)習(xí)下。2018-03-03
Vue Cli3 創(chuàng)建項(xiàng)目的方法步驟
Vue CLI是一個(gè)用于快速Vue.js開(kāi)發(fā)的完整系統(tǒng)。這篇文章主要介紹了Vue Cli3 創(chuàng)建項(xiàng)目的方法步驟,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
解決vue頁(yè)面刷新或者后退參數(shù)丟失的問(wèn)題
下面小編就為大家分享一篇解決vue頁(yè)面刷新或者后退參數(shù)丟失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

