拖拽排序是一种常见的用户界面交互功能,它允许用户通过拖动元素来重新排列列表中的项。使用原生JavaScript实现拖拽排序涉及多个基础概念,包括事件监听、DOM操作和状态管理。以下是详细解答:
mousedown
、mousemove
和mouseup
事件。mousedown
时记录初始位置,在mousemove
时更新元素位置,在mouseup
时完成排序。<!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>
ul {
list-style-type: none;
padding: 0;
}
li {
padding: 10px;
border: 1px solid #ccc;
margin-bottom: 5px;
cursor: grab;
}
li.dragging {
opacity: 0.5;
position: absolute;
}
</style>
</head>
<body>
<ul id="sortableList">
<li draggable="true">Item 1</li>
<li draggable="true">Item 2</li>
<li draggable="true">Item 3</li>
<li draggable="true">Item 4</li>
<li draggable="true">Item 5</li>
</ul>
<script>
const list = document.getElementById('sortableList');
let draggedItem = null;
list.addEventListener('dragstart', (event) => {
draggedItem = event.target;
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('text/html', draggedItem.innerHTML);
draggedItem.classList.add('dragging');
});
list.addEventListener('dragover', (event) => {
event.preventDefault();
const overItem = event.target;
if (overItem && overItem.nodeName === 'LI' && overItem !== draggedItem) {
const rect = overItem.getBoundingClientRect();
const relY = event.clientY - rect.top;
const height = rect.bottom - rect.top;
const parent = overItem.parentNode;
if (relY > height / 2) {
parent.insertBefore(draggedItem, overItem.nextSibling);
} else {
parent.insertBefore(draggedItem, overItem);
}
}
});
list.addEventListener('dragend', () => {
draggedItem.classList.remove('dragging');
draggedItem = null;
});
</script>
</body>
</html>
dragover
事件中正确计算插入位置。通过以上步骤和代码示例,可以实现一个基本的拖拽排序功能。根据具体需求,还可以进一步优化和扩展功能。
领取专属 10元无门槛券
手把手带您无忧上云