在前端实现长按触发元素选中的功能,可以通过 JavaScript 结合 mousedown、mouseup 和 mouseleave 事件来实现。基本思路是当用户按下鼠标按钮时,启动一个计时器,如果用户在一定时间内(如 2 秒)没有松开鼠标按钮,则触发选中事件。
下面是一个详细的代码示例及其讲解:
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Long Press to Select</title>
<style>
.box {
width: 100px;
height: 100px;
background-color: lightblue;
margin: 20px;
display: inline-block;
user-select: none; /* Prevent text selection */
}
.selected {
background-color: lightgreen;
}
</style>
</head>
<body>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<script src="script.js"></script>
</body>
</html>
JavaScript
document.addEventListener('DOMContentLoaded', () => {
const boxes = document.querySelectorAll('.box');
let timer;
boxes.forEach(box => {
box.addEventListener('mousedown', (event) => {
// 鼠标按下开始计时
timer = setTimeout(() => {
box.classList.add('selected');
}, 2000);
});
box.addEventListener('mouseup', (event) => {
// 鼠标按下结束时 结束计时
clearTimeout(timer);
});
box.addEventListener('mouseleave', (event) => {
// 鼠标离开时清除
clearTimeout(timer);
});
});
});
-
HTML 部分:
- 我们创建了三个
div元素,每个元素都有一个box类。 user-select: none;用于防止文本选择,以便用户在长按时不会意外选择文本。
- 我们创建了三个
-
CSS 部分:
.box类定义了每个盒子的样式,包括尺寸、背景颜色和内边距。.selected类定义了选中状态的样式,当元素被选中时,它的背景颜色会变成浅绿色。
-
JavaScript 部分:
-
我们在
DOMContentLoaded事件触发时初始化脚本,以确保 DOM 元素已加载。 -
选择所有具有
.box类的元素,并为每个元素添加事件监听器。 -
mousedown事件:- 当用户按下鼠标按钮时,启动一个计时器(
setTimeout),计时 2 秒。如果用户持续按住 2 秒,计时器触发,添加selected类到元素上。
- 当用户按下鼠标按钮时,启动一个计时器(
-
mouseup事件:- 当用户松开鼠标按钮时,清除计时器(
clearTimeout),防止selected类被添加。
- 当用户松开鼠标按钮时,清除计时器(
-
mouseleave事件:- 当用户在按住鼠标按钮的同时离开元素时,清除计时器,防止
selected类被添加。
- 当用户在按住鼠标按钮的同时离开元素时,清除计时器,防止
-
用户按住元素 2 秒后,元素会被选中,并且背景颜色会发生变化。如果用户在 2 秒内松开鼠标按钮或离开元素,选中操作会被取消。
CSS方案
box:hover:active {
opacity: .999; /*无关紧要的样式*/
transition: opacity 1s; /*延时 1s */
}
这样就不需要使用定时器了,直接监听transitionend事件:
document.addEventListener('transitionend', () => {
// 具体逻辑
box.classList.add('selected');
})
box.addEventListener('mouseleave', (event) => {
// 鼠标离开时清除
box.classList.remove('selected');
});