js拖拽效果的原理及实现

1. 原理


JS 拖拽一个元素的原理:
首先要明白三个值

鼠标的位置A = {x, y}
盒子的位置B = {x, y}
鼠标在盒子内的距离C = {A.x - B.x, A.y - B.y}
涉及到三个鼠标事件

鼠标按下时,mousedown
鼠标移动时,mousemove
鼠标松开时,mouseup
然后就可以开始讲明实现过程了

鼠标按下的时候,计算出C,鼠标在盒子里距离(鼠标位置 - 盒子位置)
鼠标移动的时候,更新盒子位置 B = A - C
鼠标松开的时候,关闭2, 3过程的两个鼠标监听器
————————————————

2. 代码实现

html

<div class="box">

</div>

css

.box {
    position: absolute;
    width: 100px;
    height: 100px;
    left: 10px;
    top: 10px;
    background-color: beige;
}

.box:hover {
    cursor: move;
}

 js

var box = document.querySelector('.box')

// 获取元素的样式
var getStyle = function(element){
    return window.getComputedStyle(box, null)
}

// 获取目标元素的位置
var getTargetPos = function(elem) {
    var elemStyle = getStyle(elem)
    var pos = {
        x: parseInt(elemStyle.left.slice(0, -2)),
        y: parseInt(elemStyle.top.slice(0, -2))
    }
    return pos
}

// 设置目标元素的位置
var setTargetPos = function(elem, pos) {
    elem.style.left = pos.left
    elem.style.top = pos.top
    return elem
}

box.addEventListener('mousedown', function(event) {
    var divPos = getTargetPos(box)
    var mousePos = {
        x: event.clientX,
        y: event.clientY
    }
    // 鼠标按下的时候,记录鼠标在div内部的距离
    var innerDis = {
        x: event.clientX - divPos.x,
        y: event.clientY - divPos.y
    }

    var move = function(event) {
        // 鼠标移动到的新位置 - 鼠标在div的内部距离 即是拖动元素的新位置
        setTargetPos(box, {
            left: (event.clientX - innerDis.x) + 'px',
            top: (event.clientY - innerDis.y) + 'px',
        })
    }

    var end = function() {
        document.removeEventListener('mousemove', move)
        document.removeEventListener('mouseup', end)
    }

    // 必须绑定在document对象上,如果绑定在box对象上,当鼠标脱快了移出box盒子时,就会产生BUG
    document.addEventListener('mousemove', move, false)
    document.addEventListener('mouseup', end, false)

  

 

posted @ 2020-04-06 16:15  cruor  阅读(323)  评论(0编辑  收藏  举报