很久沒釋出文章了,一方面工作原因,一方面是惰性開始出來了。希望能繼續堅持菜雞之路。
最近有個需求,移動端有導航,需要左滑右滑的時候就能切換導航,跟輪播一樣的效果,但是輪播內容少,而且是一次性載入資料。而需求是很多型別,每個型別有非常多的列表,如果使用輪播,一次性載入資料太多,再加上分頁,那就完全行不通。
自己寫了個左滑右滑的元件。我一直覺得寫元件最重要的就是理解原理和理清思路。
當我們觸控到螢幕的時候,會觸發touchStar方法,獲取起始的X座標值startX,在手指移動過程中,會觸發touchMove方法,獲得手指當前的X座標值currentX。CurrentX-startX就是移動的距離,讓當前父元素相對定位,然後隨著移動定位left的值。這樣就實現了一個元素左滑右滑的效果。
接著考慮當手指鬆開的時候觸發touchEnd方法,獲取endX,endX減去startX或者是移動過程中的距離,大於0就是手指向右滑動,小於0就是向左滑動。然後在結束的時候把相對定位的父元素left變成0.
因為是元件,我們把左滑還是右滑返回,把可能需要用到的移動過程中的距離也返回。最後,我們在移動一點點距離的時候不一定要左滑右滑,所以需要一個最小的滑動距離。
<template>
<div class="">
<divclass="touch-movue-left-right"
@touchstart="touchStart($event)"
@touchend="touchEnd($event)"
@touchmove="touchMove($event)"
:style="{'left': moveMar +'px'}">
<slot></slot>
</div>
</div>
</template>
export default {
props: ['moveJudge', 'moveDistance','margin'],
data() {
return {
startX: 0,
moveMar: 0
}
},
components: {},
mounted() {
},
methods: {
touchStart(e){
this.startX =e.targetTouches[0].pageX;
},
touchMove(e){
this.moveMar =e.targetTouches[0].pageX - this.startX;
this.$emit('moveDistance',this.moveMar);
},
touchEnd(e){
if(this.moveMar > (this.margin ||100)){
this.$emit('moveJudge', 'right');
}else if(this.moveMar <(-this.margin || -100)){
this.$emit('moveJudge', 'left');
}
this.moveMar = 0;
},
}
}
.touch-movue-left-right{
position: relative;
width: 100%;
background: #42b983;
}
複製程式碼
可以自己使用一下,順便提一下,上拉載入下拉重新整理之前是分開的,增加了一個一起的,加上左滑右滑,已經發布npm:
歡迎關注Coding個人筆記 公眾號