js 怎么限定拖拽范围在指定类名div的,第一层子节点范围内拖拽,第二层无法拖拽
时间: 2023-07-06 10:22:39 浏览: 149
你可以通过以下步骤实现拖拽范围的限定:
1. 给指定类名的 div 添加一个事件监听器,监听鼠标按下事件。
```
const dragArea = document.querySelector('.drag-area');
dragArea.addEventListener('mousedown', dragStart);
```
2. 在鼠标按下事件中获取拖拽元素和鼠标的初始位置,并给拖拽元素添加一个类名。
```
let dragItem = null;
let dragOffsetX = 0;
let dragOffsetY = 0;
function dragStart(e) {
if (e.target.classList.contains('drag-item')) {
dragItem = e.target;
dragOffsetX = e.clientX - dragItem.offsetLeft;
dragOffsetY = e.clientY - dragItem.offsetTop;
dragItem.classList.add('dragging');
}
}
```
3. 给 document 添加一个事件监听器,监听鼠标移动事件和鼠标松开事件。
```
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', dragEnd);
```
4. 在鼠标移动事件中计算拖拽元素的位置,并限定拖拽范围在指定类名 div 的第一层子节点范围内。
```
function drag(e) {
if (dragItem) {
const dragLeft = e.clientX - dragOffsetX;
const dragTop = e.clientY - dragOffsetY;
const parentRect = dragArea.getBoundingClientRect();
const childRect = dragItem.getBoundingClientRect();
if (dragLeft > parentRect.left && dragLeft + childRect.width < parentRect.right && dragTop > parentRect.top && dragTop + childRect.height < parentRect.bottom) {
dragItem.style.left = dragLeft + 'px';
dragItem.style.top = dragTop + 'px';
}
}
}
```
5. 在鼠标松开事件中移除拖拽元素的类名。
```
function dragEnd() {
if (dragItem) {
dragItem.classList.remove('dragging');
dragItem = null;
}
}
```
6. 对于指定类名 div 的第二层子节点,可以在事件监听器中添加一个判断条件,如果是第二层子节点,则不执行拖拽事件。
```
dragArea.addEventListener('mousedown', function(e) {
if (e.target.classList.contains('drag-item')) {
if (e.target.parentNode.parentNode !== dragArea) {
return;
}
dragStart(e);
}
});
```
阅读全文