当前位置:首页 > JavaScript

js实现框选

2026-04-05 06:27:45JavaScript

实现框选的基本思路

框选功能通常涉及监听鼠标事件,记录起始和结束位置,动态绘制选框。以下是具体实现方法:

监听鼠标事件

在需要框选的容器上绑定mousedownmousemovemouseup事件:

const container = document.getElementById('selectable-area');
let isSelecting = false;
let startX, startY;

container.addEventListener('mousedown', (e) => {
  isSelecting = true;
  startX = e.clientX;
  startY = e.clientY;
});

document.addEventListener('mousemove', (e) => {
  if (!isSelecting) return;
  // 更新选框位置和尺寸
});

document.addEventListener('mouseup', () => {
  isSelecting = false;
  // 清除选框或执行选中逻辑
});

动态绘制选框

创建绝对定位的div作为选框元素,并根据鼠标位置调整其样式:

const selectionBox = document.createElement('div');
selectionBox.style.position = 'absolute';
selectionBox.style.border = '2px dashed #000';
selectionBox.style.backgroundColor = 'rgba(0, 0, 255, 0.1)';
document.body.appendChild(selectionBox);

// 在mousemove事件中更新选框
const currentX = e.clientX;
const currentY = e.clientY;
selectionBox.style.left = Math.min(startX, currentX) + 'px';
selectionBox.style.top = Math.min(startY, currentY) + 'px';
selectionBox.style.width = Math.abs(currentX - startX) + 'px';
selectionBox.style.height = Math.abs(currentY - startY) + 'px';

检测元素碰撞

判断目标元素是否在选框区域内:

function isElementInSelection(element, selectionBox) {
  const elementRect = element.getBoundingClientRect();
  const selectionRect = selectionBox.getBoundingClientRect();

  return !(
    elementRect.right < selectionRect.left ||
    elementRect.left > selectionRect.right ||
    elementRect.bottom < selectionRect.top ||
    elementRect.top > selectionRect.bottom
  );
}

// 遍历所有可选元素
document.querySelectorAll('.selectable-item').forEach(item => {
  if (isElementInSelection(item, selectionBox)) {
    item.classList.add('selected');
  }
});

清除选框状态

鼠标释放时移除选框元素或重置状态:

js实现框选

document.addEventListener('mouseup', () => {
  isSelecting = false;
  selectionBox.remove();
  // 或重置选框尺寸
  selectionBox.style.width = '0';
  selectionBox.style.height = '0';
});

完整示例代码

document.addEventListener('DOMContentLoaded', () => {
  const container = document.getElementById('selectable-area');
  const selectionBox = document.createElement('div');
  let isSelecting = false;
  let startX, startY;

  selectionBox.style.position = 'absolute';
  selectionBox.style.border = '2px dashed #000';
  selectionBox.style.backgroundColor = 'rgba(0, 0, 255, 0.1)';
  selectionBox.style.display = 'none';
  document.body.appendChild(selectionBox);

  container.addEventListener('mousedown', (e) => {
    isSelecting = true;
    startX = e.clientX;
    startY = e.clientY;
    selectionBox.style.left = `${startX}px`;
    selectionBox.style.top = `${startY}px`;
    selectionBox.style.width = '0';
    selectionBox.style.height = '0';
    selectionBox.style.display = 'block';
  });

  document.addEventListener('mousemove', (e) => {
    if (!isSelecting) return;

    const currentX = e.clientX;
    const currentY = e.clientY;

    selectionBox.style.left = Math.min(startX, currentX) + 'px';
    selectionBox.style.top = Math.min(startY, currentY) + 'px';
    selectionBox.style.width = Math.abs(currentX - startX) + 'px';
    selectionBox.style.height = Math.abs(currentY - startY) + 'px';
  });

  document.addEventListener('mouseup', () => {
    if (!isSelecting) return;
    isSelecting = false;
    selectionBox.style.display = 'none';

    document.querySelectorAll('.selectable-item').forEach(item => {
      const elementRect = item.getBoundingClientRect();
      const selectionRect = selectionBox.getBoundingClientRect();

      if (!(
        elementRect.right < selectionRect.left ||
        elementRect.left > selectionRect.right ||
        elementRect.bottom < selectionRect.top ||
        elementRect.top > selectionRect.bottom
      )) {
        item.classList.toggle('selected');
      }
    });
  });
});

注意事项

  • 确保选框元素的z-index高于其他内容
  • 考虑滚动偏移时需调整坐标计算
  • 移动端需要额外处理触摸事件
  • 性能优化:对于大量可选元素,可以使用空间分区算法提高检测效率

标签: js
分享给朋友:

相关文章

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…