• 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;
         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)
    

      

     

  • 相关阅读:
    前端性能优化方法
    软件测试十大原则
    CSRF攻击【转载】
    XSS攻击(出现的原因、预防措施......)
    python 连接MySQL数据库
    《快消品营销人的第一本书》
    python 格式化输出日志记录
    python 安装cv2
    测试用例设计的策略
    【转】APP功能测试要领
  • 原文地址:https://www.cnblogs.com/zqm0924/p/12642591.html
Copyright © 2020-2023  润新知