要实现JavaScript表格的自由拖拽排序特效,可以使用HTML5的拖放API(Drag and Drop API)。以下是一个简单的示例代码,展示了如何实现这一功能:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Table Drag and Drop Sorting</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
.dragging {
opacity: 0.5;
}
</style>
</head>
<body>
<table id="sortableTable">
<thead>
<tr>
<th>Index</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr draggable="true" data-index="0">
<td>1</td>
<td>Item 1</td>
</tr>
<tr draggable="true" data-index="1">
<td>2</td>
<td>Item 2</td>
</tr>
<tr draggable="true" data-index="2">
<td>3</td>
<td>Item 3</td>
</tr>
<!-- Add more rows as needed -->
</tbody>
</table>
<script src="script.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
const table = document.getElementById('sortableTable');
const rows = Array.from(table.querySelectorAll('tbody tr'));
rows.forEach(row => {
row.addEventListener('dragstart', dragStart);
row.addEventListener('dragover', dragOver);
row.addEventListener('drop', drop);
row.addEventListener('dragend', dragEnd);
});
let draggedRow = null;
function dragStart(e) {
draggedRow = this;
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/html', this.outerHTML);
this.classList.add('dragging');
}
function dragOver(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
return false;
}
function drop(e) {
e.stopPropagation();
if (e.target.tagName === 'TD') {
const targetRow = e.target.parentElement;
const dragIndex = draggedRow.dataset.index;
const dropIndex = targetRow.dataset.index;
// Swap the rows in the DOM
if (dragIndex !== dropIndex) {
const temp = rows[dragIndex].outerHTML;
rows[dragIndex].outerHTML = rows[dropIndex].outerHTML;
rows[dropIndex].outerHTML = temp;
}
}
return false;
}
function dragEnd() {
this.classList.remove('dragging');
draggedRow = null;
}
});
dragstart
、dragover
、drop
和dragend
等事件,可以控制拖拽过程中的行为。dragover
事件中调用e.preventDefault()
以允许放置。drop
事件中正确计算和交换元素的位置。.dragging
)来改变拖拽元素的样式,使其在拖拽过程中更明显。通过上述代码和解释,你应该能够实现一个基本的表格拖拽排序功能,并理解其背后的原理和应用场景。
领取专属 10元无门槛券
手把手带您无忧上云