html两列元素可以拖拽
时间: 2023-11-26 21:06:53 浏览: 25
HTML中可以使用JavaScript来实现元素的拖拽。下面是一个简单的示例,展示如何在HTML中创建两列可拖拽元素:
```html
<!DOCTYPE html>
<html>
<head>
<title>Draggable Columns</title>
<style>
.column {
float: left;
width: 50%;
height: 300px;
background-color: #eee;
padding: 10px;
box-sizing: border-box;
}
.box {
width: 80%;
height: 50px;
background-color: #ccc;
margin: 10px auto;
cursor: move;
user-select: none;
}
</style>
</head>
<body>
<h1>Draggable Columns</h1>
<div class="column" id="left-column">
<h2>Left Column</h2>
<div class="box" draggable="true">Box 1</div>
<div class="box" draggable="true">Box 2</div>
<div class="box" draggable="true">Box 3</div>
</div>
<div class="column" id="right-column">
<h2>Right Column</h2>
</div>
<script>
let draggables = document.querySelectorAll('.box');
let leftColumn = document.getElementById('left-column');
let rightColumn = document.getElementById('right-column');
draggables.forEach(draggable => {
draggable.addEventListener('dragstart', () => {
draggable.classList.add('dragging');
});
draggable.addEventListener('dragend', () => {
draggable.classList.remove('dragging');
});
});
leftColumn.addEventListener('dragover', e => {
e.preventDefault();
let afterElement = getDragAfterElement(leftColumn, e.clientY);
let draggable = document.querySelector('.dragging');
if (afterElement == null) {
leftColumn.appendChild(draggable);
} else {
leftColumn.insertBefore(draggable, afterElement);
}
});
rightColumn.addEventListener('dragover', e => {
e.preventDefault();
let afterElement = getDragAfterElement(rightColumn, e.clientY);
let draggable = document.querySelector('.dragging');
if (afterElement == null) {
rightColumn.appendChild(draggable);
} else {
rightColumn.insertBefore(draggable, afterElement);
}
});
function getDragAfterElement(container, y) {
let draggableElements = [...container.querySelectorAll('.box:not(.dragging)')];
return draggableElements.reduce((closest, child) => {
let box = child.getBoundingClientRect();
let offset = y - box.top - box.height / 2;
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
}
</script>
</body>
</html>
```
上述代码创建了两个列,每个列中都有三个可拖拽的元素。拖拽事件通过JavaScript来监听并处理,这些事件包括:
- `dragstart`:当元素开始被拖拽时触发。
- `dragend`:当元素拖拽结束时触发。
- `dragover`:当拖拽元素进入一个可放置的区域时触发。
- `dragenter`:当拖拽元素进入一个可放置的区域时触发。
- `dragleave`:当拖拽元素离开一个可放置的区域时触发。
- `drop`:当拖拽元素被放置到一个可放置的区域时触发。
在以上代码中,`dragstart`和`dragend`事件被用来添加和移除一个`dragging`类,以便在元素被拖拽时添加样式。
`dragover`事件用于确定被拖拽元素应该放置在哪里。在这个示例中,`getDragAfterElement`函数用于确定被拖拽元素应该放置在哪个位置。该函数接受一个容器元素和鼠标Y坐标作为输入,并返回容器中最接近鼠标位置的元素。
最后,对左右两列的`dragover`事件进行监听,以便在拖拽元素进入这些列时进行相应的操作。当元素被放置时,它将被移动到正确的位置。