<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.drag_demo {
display: flex;
flex-direction: column;
gap: 6px;
}
.drag_item {
width: 200px;
height: 50px;
background-color: rgb(255, 146, 62);
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
cursor: move;
}
.drag_start_item {
opacity: 0.3;
}
</style>
</head>
<body>
<div class="drag_demo">
<div draggable="true" class="drag_item">1</div>
<div draggable="true" class="drag_item">2</div>
<div draggable="true" class="drag_item">3</div>
<div draggable="true" class="drag_item">4</div>
</div>
<script>
const containerElement = document.querySelector('.drag_demo');
let dragElement;
containerElement.ondragstart = (event) => {
setTimeout(() => {
dragElement = event.target;
event.target.classList.add('drag_start_item');
});
};
containerElement.ondragenter = (event) => {
const targetElement = event.target;
if (targetElement === dragElement || targetElement === containerElement) return false;
const containerElementChildrenList = Array.from(containerElement.children);
const dragIndex = containerElementChildrenList.indexOf(dragElement);
const targetIndex = containerElementChildrenList.indexOf(targetElement);
if (dragIndex < targetIndex) {
targetElement.after(dragElement);
console.log('向下');
}
if (dragIndex > targetIndex) {
targetElement.before(dragElement);
console.log('向上');
}
};
containerElement.ondragend = (event) => {
event.target.classList.remove('drag_start_item');
dragElement = null;
};
</script>
</body>
</html>