1. 程式人生 > 實用技巧 >React實現隨手移動

React實現隨手移動

想當年沒畢業的時候,上課下課睡覺前想的都是程式碼,原生隨手移動分分鐘,現在做個東西跟要命一樣,我不禁在想,難道是工作磨滅了我對這份興趣的熱愛,還是我本就不是一個喜歡堅持的人 ,來吧做個記錄,好記性不如爛筆頭。

思路:

1.移動端觸控事件

  a.當按下手指時,觸發ontouchstart;

b. 當移動手指時,觸發ontouchmove;

  c. 當移走手指時,觸發ontouchend;

當有級別比這些事件級別更高的時候,會取消當前的touch操作,即觸發ontouchcancel。一般會在ontouchcancel時暫停遊戲等

2.div隨手移動的本質是:滑鼠移動改變位置,隨即改變div的left、top

3.注意邊界值,0 < left <clientWidth

核心:

1.從my移動到event.my位置,獲取滑鼠點選div位置。為event.x

2.實際距離移動位置event.mx' 即event.mx'-event.mx ,event.my'-event.my

3.移動時不變數,disX = event.my - div.offsetTop 、disY = event.mx - div.offsetLeft

4.移動後的top、left值為,top:event.my' - disY 、left =event.mx’ - disX ,

那麼核心程式碼如下:

  onTouchStart(e) {
       // 手指按下時的座標
        this.starX = e.touches[0].clientX;
        this.starY = e.touches[0].clientY;
        this.disX =  this.starX- this.oDiv.offsetLeft;
        this.disY = this.starY - this.oDiv.offsetTop;
}

   onTouchMove(e) {
        e.preventDefault(); //防止移動穿透
        this.L = e.touches[0].clientX - this.disX;
        this.T = e.touches[0].clientY - this.disY;
     
        // 限制拖拽的X範圍,不能拖出螢幕
        if (this.L < 0) {
            this.L = 0;
        } 
        if (this.L > document.documentElement.clientWidth - this.oDiv.offsetWidth) {
            this.L = document.documentElement.clientWidth - this.oDiv.offsetWidth;
        }
        // 限制拖拽的Y範圍,不能拖出螢幕
        if (this.T < 0) {
            this.T = 0;
        } 
       if (this.T > document.documentElement.clientHeight - this.oDiv.offsetHeight) {
            this.T = document.documentElement.clientHeight - this.oDiv.offsetHeight;
        }

        this.moveX = this.L;
        this.moveY = this.T;

        this.setState({
            offsetLeft: this.moveX,
            offsetTop: this.moveY
        });
    }

onTouchEnd(e) {
        // 計算結束的位置是靠左還是靠右
        let oLeft = this.state.offsetLeft;
        if (oLeft < (document.documentElement.clientWidth - this.oDiv.offsetWidth) / 2) {
            oLeft = 0;
        } else {
            oLeft = document.documentElement.clientWidth - this.oDiv.offsetWidth;
        }
        this.setState({
            offsetLeft: oLeft
        });
    }

歡迎轉載~,請標註來源~,覺得有用的話,幫忙點個贊