可拖曳的div

360 阅读1分钟

可拖曳的div

实现 div 随着鼠标的拖动而移动

思路

鼠标按下时记录偏移量,当鼠标移动时计算新的偏移量与原始坐标相减计算出移动距离,使用transform调整 div 位置

代码

<div class="drag-element"></div>
.drag-element { 
    background-color: rgb(246, 69, 69);
    width: 100px;
    height: 100px;
    transform: translate(0, 0); 
    transition: transform 0.2s ease-in-out; 
}
    const dragElement = document.querySelector('.drag-element');
    let offsetX, offsetY;

    // 鼠标按下时记录起始位置
    dragElement.addEventListener('mousedown', (e) => {
      e.preventDefault();
      offsetX = dragElement.offsetLeft;
      offsetY = dragElement.offsetTop;
    });

    // 鼠标移动时更新位置
    document.addEventListener('mousemove', (e) => {
      e.preventDefault();
      if (offsetX !== undefined && offsetY !== undefined) {
        const translateX = e.clientX - offsetX - 50;
        const translateY = e.clientY - offsetY - 50;
        dragElement.style.transform = `translate(${translateX}px, ${translateY}px)`;
      }
    });

    // 鼠标松开时清除记录
    document.addEventListener('mouseup', e => {
      offsetX = undefined;
      offsetY = undefined;
    })

transform每次移动是相对于原始位置所进行,所以只需要记录鼠标点在div中的相对位置。

注意以下几点:

  1. 注意监听范围,不能只监听 div
  1. 不要使用 drag 事件,很难用。
  1. 使用 transform 会比 top / left 性能更好,因为可以避免 reflow 和 repaint