要实现一个具有回放功能的拖拽效果,并显示拖动距离的JavaScript功能,我们可以使用HTML的`
### 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`函数中遍历这些坐标来模拟拖拽过程。
这个示例提供了拖拽功能的基础,包括开始拖拽、持续拖拽和结束拖拽的处理,以及一个简化的回放功能框架。