原生JS拖拽从原理到实现

拖拽在js中挺常用的,不过目前有很多做拖拽的插件,H5也以及支持了拖拽事件,不过了解一下拖拽的原理也是有必要的,其实用原生js实现拖拽并不难。

首先讲一下拖拽的原理,假设浏览器上有一个元素(元素已经绝对定位了),起始位置为(mx, my),即距浏览器上方my px,左方mx px,如下图

拖拽元素的过程无非就是改变该元素的left值和top值,那么left和top值设为多少才对呢,其实这个不难,假设鼠标点击元素,并设该点击的点为(x, y), (x, y) 肯定是在带拖拽元素里的,随着鼠标的移动(是按住鼠标左右键的移动), 能得到新的鼠标位置,设为(nx, ny), 此时left值应该要等于nx - x + mx, top值为ny - y + my, 如下图

如果看懂了上面 的内容,那么接下来就用js实现一下,首先需要关注三个事件,mousedown: 鼠标按下事件,mousemove: 鼠标移动事件,mouseup: 鼠标松开事件。对于元素的初始位置(mx, my)我们这里使用element.offsetLeft和element.offsetTop来获取,鼠标按下的位置(x, y)我们可以使用event.clientX, event.clientY来获取。实现代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    html, body {
        height: 100%;
    }
    * {
        margin: 0;
        padding: 0;
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
    }
    #target {
        width: 100px;
        height: 100px;
        background: blueviolet;
        border-radius: 50%;
        box-shadow: 0 0 5px rgba(0,0,0,.02);
        position: absolute; /*元素记得绝对定位*/
        left: 10px;
        top: 10px;
    }
</style>
<body>
<div id="target">

</div>
<script>
    !function (window, document) {   
        //工具函数的封装
        var getById = document.getElementById.bind(document);
        
        var getStyle = function () {
            return window.getComputedStyle ? function (element, style) {
                return window.getComputedStyle(element)[style]
            } : function (element, style) {
                return element.currentStyle[style]
            }
        }();
        
        var addEvent = function () {
            return document.addEventListener ? function (element, eventType, callback) {
                element.addEventListener(eventType, callback, false)
            } : document.attachEvent ? function (element, eventType, callback) {
                element.attachEvent("on" + eventType, callback)
            } : function (element, eventType, callback) {
                element["on" + eventType] = callback
            }
        }();

        function setStyle(element, css) {
            for (var k in css) {
                if (css.hasOwnProperty(k)) {
                    element.style[k] = css[k]
                }
            }
        }

        var target = getById("target"); // 获取元素
        var x, y, mx, my, dx, dy, drag = false; // 需要设置一个drag来标记是否拖拽
        addEvent(target, "mousedown", function (e) { // mousedown事件
            e = e || window.event;
            drag = true;
            x = e.clientX;
            y = e.clientY;
            mx = this.offsetLeft;
            my = this.offsetTop;
            dx = x - mx;
            dy = y - my;
        });
        addEvent(document, "mousemove", function (e) { // mousemove事件, 绑在document上比较好一点
            e = e || window.event;
            if (!drag) return false;  
            var left = e.clientX - dx, // left = nx - (x - mx)
                top = e.clientY - dy;  // top = ny - (y - my)
            setStyle(target, {left: left + "px", top: top + "px"});
        });
        addEvent(target, "mouseup", function (e) { // mouseup鼠标松开
            drag = false
        });
    }(this, document);
</script>
</body>
</html>

在浏览器上运行结果如下

当然还可以用拖拽做一些跟有趣的事情,读者可以自行尝试。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以提供一些指引:要实现div,你首先需要监听div的mousedown,mouseup和mousemove事件。然后记录鼠标的坐标,并通过改变div的CSS left和top属性来实现div的。 ### 回答2: 原生 JavaScript 可以使用一些事件和方法来实现 div 的功能。以下是一个简单的示例: 首先,在 HTML 中添加一个可的 div 元素: ``` <div id="draggableDiv" draggable="true">可的 div</div> ``` 在 JavaScript 中,我们可以通过监听一些事件来实现的效果。首先,我们需要监听 div 的 mousedown 事件,当鼠标按下时开始。然后,我们需要监听鼠标移动事件来更新 div 的位置。最后,在鼠标抬起时停止。 ``` const draggableDiv = document.getElementById('draggableDiv'); let offsetX, offsetY; draggableDiv.addEventListener('mousedown', (event) => { offsetX = event.clientX - draggableDiv.offsetLeft; offsetY = event.clientY - draggableDiv.offsetTop; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }); function onMouseMove(event) { draggableDiv.style.left = event.clientX - offsetX + 'px'; draggableDiv.style.top = event.clientY - offsetY + 'px'; } function onMouseUp() { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); } ``` 在上面的代码中,我们通过计算鼠标点击位置与 div 左上角的偏移量,然后通过监听鼠标移动事件来更新 div 的位置。鼠标移动事件会不断触发,从而使得 div 跟随鼠标的移动而移动。最后,当鼠标抬起时,我们需要移除事件监听,停止。 通过以上代码,我们就可以实现一个简单的原生 JavaScript div 的效果。当鼠标按下 div 并移动时,div 会跟随鼠标的移动而移动,当鼠标抬起时停止。 ### 回答3: 要实现div的效果,可以使用原生JavaScript来完成。具体步骤如下: 1. 首先,在HTML中创建一个div元素,并给它设置一个id,用于后续的选择和操作。 ```html <div id="dragDiv">我</div> ``` 2. 在JavaScript中,创建一个变量来保存当前被的div元素。 ```javascript var dragElement = document.getElementById("dragDiv"); ``` 3. 添加mousedown事件监听器,当鼠标按下时,开始。 ```javascript dragElement.addEventListener("mousedown", dragStart); ``` 4. 在dragStart函数中,记录鼠标按下时的初始位置和div元素的初始位置。 ```javascript function dragStart(event) { event.preventDefault(); startX = event.clientX; startY = event.clientY; elementX = dragElement.offsetLeft; elementY = dragElement.offsetTop; document.addEventListener("mousemove", drag); document.addEventListener("mouseup", dragEnd); } ``` 5. 创建drag函数,在该函数中,根据鼠标移动的距离,更新div元素的位置。 ```javascript function drag(event) { var moveX = event.clientX - startX; var moveY = event.clientY - startY; dragElement.style.left = elementX + moveX + "px"; dragElement.style.top = elementY + moveY + "px"; } ``` 6. 创建dragEnd函数,在该函数中,移除鼠标移动和松开事件监听器。 ```javascript function dragEnd() { document.removeEventListener("mousemove", drag); document.removeEventListener("mouseup", dragEnd); } ``` 通过以上步骤,我们就可以实现一个简单的原生JavaScriptdiv效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sundial dreams

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值