原生JS通过鼠标选择区域实现选中对应元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>鼠标拖拽框选多个元素</title>
<style>
body {
margin: 0;
padding: 0;
height: 100vh;
overflow: hidden;
}
.item {
width: 100px;
height: 100px;
margin: 10px;
background-color: lightblue;
display: inline-block;
position: absolute;
}
.selected {
background-color: orange;
}
.selection-box {
position: absolute;
border: 2px dashed rgba(0, 0, 0, 0.5);
background-color: rgba(0, 0, 255, 0.2);
pointer-events: none;
}
</style>
</head>
<body>
<div class="item" style="top: 50px; left: 100px">item1</div>
<div class="item" style="top: 50px; left: 250px">item2</div>
<div class="item" style="top: 200px; left: 100px">item3</div>
<div class="item" style="top: 200px; left: 250px">item4</div>
</body>
<script>
document.addEventListener("DOMContentLoaded", function () {
let startX, startY, selectionBox;
let items = document.querySelectorAll(".item");
let selectedItems = [];
document.addEventListener("mousedown", function (e) {
if (e.button !== 0) return;
startX = e.pageX;
startY = e.pageY;
selectionBox = document.createElement("div");
selectionBox.classList.add("selection-box");
document.body.appendChild(selectionBox);
document.addEventListener("mousemove", onMouseMove);
document.addEventListener("mouseup", onMouseUp);
});
function onMouseMove(e) {
const width = e.pageX - startX;
const height = e.pageY - startY;
selectionBox.style.left = `${Math.min(startX, e.pageX)}px`;
selectionBox.style.top = `${Math.min(startY, e.pageY)}px`;
selectionBox.style.width = `${Math.abs(width)}px`;
selectionBox.style.height = `${Math.abs(height)}px`;
}
function onMouseUp(e) {
selectedItems = [];
const box = selectionBox.getBoundingClientRect();
items.forEach((item) => {
const rect = item.getBoundingClientRect();
if (isElementInBox(rect, box)) {
item.classList.add("selected");
selectedItems.push({
node: item,
id: item.innerText,
});
} else {
item.classList.remove("selected");
}
});
document.body.removeChild(selectionBox);
document.removeEventListener("mousemove", onMouseMove);
document.removeEventListener("mouseup", onMouseUp);
console.log("selectedItems====>", selectedItems);
}
function isElementInBox(elementRect, boxRect) {
return (
elementRect.right > boxRect.left &&
elementRect.left < boxRect.right &&
elementRect.bottom > boxRect.top &&
elementRect.top < boxRect.bottom
);
}
});
</script>
</html>