JavaScript 上下拖拽排序是一种常见的交互功能,它允许用户通过拖拽来重新排列列表项的顺序。这种功能在很多应用场景中都非常有用,比如任务管理、图片编辑、数据管理等。
拖拽排序通常涉及到以下几个核心概念:
以下是一个简单的上下拖拽排序插件的示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drag and Drop Sorting</title>
<style>
.list {
list-style-type: none;
padding: 0;
}
.item {
padding: 10px;
border: 1px solid #ccc;
margin-bottom: 5px;
cursor: grab;
}
.item.dragging {
opacity: 0.5;
background-color: #f0f0f0;
}
</style>
</head>
<body>
<ul class="list" id="sortableList">
<li class="item">Item 1</li>
<li class="item">Item 2</li>
<li class="item">Item 3</li>
<li class="item">Item 4</li>
<li class="item">Item 5</li>
</ul>
<script>
const list = document.getElementById('sortableList');
let dragging = null;
list.addEventListener('mousedown', (e) => {
if (e.target.classList.contains('item')) {
dragging = e.target;
dragging.classList.add('dragging');
}
});
list.addEventListener('mousemove', (e) => {
if (!dragging) return;
dragging.style.position = 'absolute';
dragging.style.top = `${e.clientY - dragging.offsetHeight / 2}px`;
dragging.style.left = `${e.clientX - dragging.offsetWidth / 2}px`;
const items = Array.from(list.children);
const dragIndex = items.indexOf(dragging);
const hoverIndex = items.findIndex(item => {
const rect = item.getBoundingClientRect();
return e.clientY > rect.top && e.clientY < rect.bottom;
});
if (hoverIndex !== -1 && hoverIndex !== dragIndex) {
list.insertBefore(dragging, hoverIndex > dragIndex ? items[hoverIndex].nextSibling : items[hoverIndex]);
}
});
list.addEventListener('mouseup', () => {
if (dragging) {
dragging.classList.remove('dragging');
dragging.style.position = '';
dragging.style.top = '';
dragging.style.left = '';
dragging = null;
}
});
</script>
</body>
</html>
mousemove
事件中的位置计算逻辑,确保元素的 top
和 left
属性设置正确。mousemove
事件中正确使用 insertBefore
方法来更新元素的顺序。通过以上示例代码和解决方案,你应该能够实现一个基本的上下拖拽排序功能,并解决常见的相关问题。
领取专属 10元无门槛券
手把手带您无忧上云