鼠标拖拽建立选区,选中元素

本文介绍如何在Vue项目中使用TypeScript实现鼠标拖拽选区,以批量选中元素。详细过程包括效果展示、建立选区组件的步骤,如确定选区位置、筛选选中元素、判断元素是否在选区内,以及完整代码的分享。
摘要由CSDN通过智能技术生成

个人博客网站欢迎交流:萤火之森:https://blog.xkongkeji.com

近段时间做一个编辑器,就需要一个鼠标拖拽选区的功能,方便批量选中元素,进行相应操作,所有就有了这篇文章。

效果展示

image.png
image.png

建立选区组件

1、要想选中元素,肯定要先建立选区

  • 根据两个坐标点确定选区位置,并绘制出选区
  • 根据两个坐标删除选区的宽与高
let size = computed(() => {
      let width =
        props.endPoint.x === 0
          ? 0
          : Math.abs(props.startPoint.x - props.endPoint.x);
      let height =
        props.endPoint.y === 0
          ? 0
          : Math.abs(props.startPoint.y - props.endPoint.y);
      return {
        width,
        height,
      };
  • 确定起始坐标点
    • 不管从何处点击都需要找到两个坐标点所绘制的矩形的左上角的坐标点。
    • 左上角的坐标点,很明显是所有坐标的最小值,也就是X,Y取最小的值的点(如下)
    • 还需要考虑终点还没有产生时的情况,也就是排除终点为初始值也就是0的情况
 let Point = computed(() => {
      let x =
        props.endPoint.x === 0
          ? props.startPoint.x
          : Math.min(props.startPoint.x, props.endPoint.x);
      let y =
        props.endPoint.y === 0
          ? props.startPoint.y
          : Math.min(props.startPoint.y, props.endPoint.y);
      return {
        x,
        y,
      };
    });zaige
  • 这样就可绘制出一个选区

image.png

2、根据选区,筛选出选中的元素

  • 筛选选区的元素主要是根据nodeType选中出编辑区所有可选择的元素节点。
  • 怎么才算可选元素,这就得看自己需要,我在元素节点上标注了canChecked,通过这个属性排除非可选元素
 * 获取该元素下可以被选中的元素集合
 * @param parentElement 父元素
 * @param keyCode 可选元素标识
 * @returns
 */
function getChildrens(parentElement: HTMLElement, keyCode: string) {
 
要监听子元素选中文字事件,可以使用 `selectionchange` 事件。该事件会在用户选择文本或取消选择文本时触发,可以通过 `window.getSelection()` 方法获取当前的选区对象,从而获取选中的文本。 下面是一个示例代码: ```html <div id="parent"> <p>段落1</p> <div class="selectable">可选中元素</div> <a href="#">链接</a> </div> ``` ```javascript const parent = document.getElementById('parent'); parent.addEventListener('selectionchange', function(event) { const selection = window.getSelection(); const selectedText = selection.toString(); let element = selection.anchorNode.parentNode; while (element !== parent) { if (element.classList.contains('selectable')) { console.log('选中的文本:', selectedText); console.log('选中文本的父元素:', element); break; } element = element.parentNode; } }); ``` 在上面的代码,我们将 `selectionchange` 事件绑定到了父元素 `div` 上,然后在事件处理程序获取当前的选区对象,并通过 `toString()` 方法获取选中的文本。接下来,我们通过 `while` 循环遍历选区的父级元素,判断父级元素是否存在 `selectable` 类名。如果存在,就表示该元素是我们想要监听的元素类型,可以进行相应的处理。如果遍历到了父元素 `div`,仍然没有找到符合条件的元素,就可以退出循环。 需要注意的是,`selectionchange` 事件只有在文本被选中或取消选中后才会触发,因此无法实时监听正在选中的文本。如果需要实时监听选中的文本,可以考虑使用 `mouseup` 事件来模拟实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值