js实现完美拖拽效果可拖动层与回放拖动规迹并显示拖动距离参数


要实现一个具有回放功能的拖拽效果,并显示拖动距离的JavaScript功能,我们可以使用HTML的`

`元素来作为可拖动的层,结合CSS和JavaScript来完成。下面是一个基本的实现示例:

### HTML 结构


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drag and Replay</title>
<style>
  #draggable {
    width: 100px;
    height: 100px;
    background-color: red;
    position: absolute;
    cursor: move;
    user-select: none;
  }
</style>
</head>
<body>
<div id="draggable"></div>
<button onclick="replayDrag()">Replay Drag</button>
<p>Distance: <span id="distance">0</span>px</p>

<script>
// JavaScript 代码将放在这里
</script>
</body>
</html>

### JavaScript 实现


let startX, startY, initialX, initialY, dragElement, dragging = false;

function drag_start(e) {
    dragElement = this;
    e = e || window.event;
    e.preventDefault();

    // 获取鼠标按下时的坐标
    startX = e.clientX - dragElement.offsetLeft;
    startY = e.clientY - dragElement.offsetTop;

    // 记录初始位置
    initialX = dragElement.offsetLeft;
    initialY = dragElement.offsetTop;

    // 指示拖拽开始
    dragging = true;

    // 调用一个函数,将执行一个循环,直到拖拽结束
    document.onmousemove = drag_over;
    document.onmouseup = drag_end;
    // 阻止默认处理(选择文本)
    return false;
}

function drag_over(e) {
    if (dragging) {
        e = e || window.event;
        e.preventDefault();

        // 计算新的位置
        let x = e.clientX - startX;
        let y = e.clientY - startY;

        // 设置元素的新位置
        dragElement.style.left = `${x}px`;
        dragElement.style.top = `${y}px`;

        // 更新距离
        updateDistance(initialX, initialY, x, y);
    }
}

function drag_end(e) {
    // 停止拖拽
    dragging = false;

    // 清除事件监听
    document.onmousemove = null;
    document.onmouseup = null;
}

function updateDistance(startX, startY, endX, endY) {
    const distance = Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2));
    document.getElementById('distance').innerText = Math.round(distance);
}

// 初始化拖拽
document.getElementById('draggable').addEventListener('mousedown', drag_start, false);

// 回放拖拽功能(这里简单模拟,实际中需要记录拖拽路径)
let recordedPath = [];
function recordPath(x, y) {
    recordedPath.push({x, y});
}

function replayDrag() {
    // 这里仅模拟回到起点,实际中需要遍历recordedPath
    dragElement.style.left = `${initialX}px`;
    dragElement.style.top = `${initialY}px`;

    // 假设recordedPath有数据,这里仅示意
    // 需要添加逻辑来遍历路径并设置位置
    // ...
}

// 注意:回放功能需要完善,这里只是展示了一个框架
// 实际使用中,你需要在drag_over中调用recordPath来记录路径

请注意,回放功能在这里是简化的,仅用于展示如何设置初始位置。在实际应用中,你需要在`drag_over`函数中调用`recordPath`来记录每一步的坐标,并在`replayDrag`函数中遍历这些坐标来模拟拖拽过程。

这个示例提供了拖拽功能的基础,包括开始拖拽、持续拖拽和结束拖拽的处理,以及一个简化的回放功能框架。