js拖拽

開發了那麼久,對於js實現拖拽多少都寫過,用於實際項目卻沒有。html

先看一下以前寫的:vue

若是鼠標慢慢移動,拖拽是沒有任何問題的,若是速度快了,那麼鼠標和元素就會分離。由於咱們是監聽鼠標移動事件,鼠標移動的時候須要執行咱們定義的函數,函數執行會有一些延時,當鼠標移動速度過快,致使函數的延時使得元素跟不上鼠標移動的速度,從而鼠標移出了元素,也就形成了元素不跟隨鼠標了。瀏覽器

解決的辦法就是把監聽元素換成document或者body,當函數執行延時了,由於鼠標仍是在document和body上,也能一直觸發函數,二者的效果是同樣的,只有一個小區別bash

document:函數

body:工具

二者都能很流暢的拖動,區別就是瀏覽器上面的地方,不屬於body,因此使用body會失效,建議使用document最好。spa

最後貼上代碼:code

<!DOCTYPE html>

<html>

<head>

    <title></title>

    <style>

        *{

            padding:0;

            margin:0;

        }

        #box{

            position:absolute;

            width:100px;

            height:100px;

            background: red;

        }

        html, body{

            width:100%;

            height:100%;

        }

    </style>

</head>

<body>



<div id="box"></div>



<script>

    var el = document.getElementById('box');



    el.addEventListener('mousedown',(event) => {

        var startX = event.clientX,

            startY = event.clientY,

            left = el.offsetLeft,

            top = el.offsetTop;

        

        var moveFun = (event) => {

            var X = event.clientX - startX

            var Y = event.clientY - startY;

            el.style.left = `${left + X}px`;

            el.style.top = `${top + Y}px`;

        };

    

        document.addEventListener('mousemove',moveFun);

        

        el.addEventListener('mouseup',() => {

            document.removeEventListener('mousemove',moveFun);

        });

    });

</script>

</body>

</html>
複製代碼

幾個點要注意,body樣式必須設置,不然監聽body會失效,document監聽,移除也要是document,移除的時候是把方法傳入,因此這邊監聽方法用函數表達式。以前在vue裏面移除的時候就遇到過這個問題。若是是想移動端使用,就都改爲監聽touch,任何用touches裏面的參數。固然,你也能夠去寫一個兼容PC和移動端的。cdn

最後分享個PC錄製GIF的小工具GifCam,感受還行。htm

相關文章
相關標籤/搜索