前端如何实现长按触发元素选中

569 阅读2分钟

在前端实现长按触发元素选中的功能,可以通过 JavaScript 结合 mousedownmouseupmouseleave 事件来实现。基本思路是当用户按下鼠标按钮时,启动一个计时器,如果用户在一定时间内(如 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);
    });
  });
});
  1. HTML 部分

    • 我们创建了三个 div 元素,每个元素都有一个 box 类。
    • user-select: none; 用于防止文本选择,以便用户在长按时不会意外选择文本。
  2. CSS 部分

    • .box 类定义了每个盒子的样式,包括尺寸、背景颜色和内边距。
    • .selected 类定义了选中状态的样式,当元素被选中时,它的背景颜色会变成浅绿色。
  3. 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');
 });