js鼠标框选元素

在选择元素时,想要实现可以多个选择的需求,可以用鼠标框选,按下鼠标左键拖动范围来框选多个元素。需要用到onmousedown,onmouseup,onmousemove三个事件来记录鼠标的移动位置,能得到一个框选范围,即可拿到选中的元素。

<html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>鼠标框选</title>
        <style>
          .list{
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: row;
            padding: 10px;
            justify-content: flex-start;
            list-style: none;
            flex-wrap: wrap;
          }
          .listItem{
            list-style: none;
            margin-bottom: 6px;
            margin-right: 6px;
            width: 55px;
            height: 55px;
            border:1px solid #ccc;
          }
          .seled{border:1px solid green;background-color:#c7cfe4;} 

        </style>
    </head>
    <body>
        <div id='root'
            onmousedown='down(event)'
            onmouseup='up(event)'
            onmousemove='move(event)'
            style='width:100%;height:100%;visibility:visible;border:solid 1px #ccc;'
        >        
        <ul class="list">
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
          <li class="listItem"></li>
        </ul>   
        </div>   
    </div>
        <script language="javascript">
           
            // 是否触发鼠标的移动事件,默认不处理
            var select = false;
            var lis =document.getElementsByClassName('listItem');
            // 定义移动元素div
            var rect = null;
            // 记录鼠标按下时的坐标
            var downX = 0;
            var downY = 0;
            // 记录鼠标松开时的坐标
            var mouseX2=downX;
            var mouseY2=downY;
           
            //鼠标按下事件
            function down(event){
                // 鼠标按下时才触发鼠标的移动事件
                select = true;
                rect = document.createElement("div"); 
                // 框选div 样式
                rect.style.cssText = "position:absolute;width:0px;height:0px;font-size:0px;margin:0px;padding:0px;border:1px dashed #0099FF;background-color:#C3D5ED;z-index:1000;filter:alpha(opacity:60);opacity:0.6;display:none;"; 
                rect.id = "selectDiv"; 
                // 添加到root下
                document.getElementById('root').appendChild(rect); 
                
             
                // 取得鼠标按下时的坐标位置
                downX =event.x ||event.clientX;
                downY = event.y||event.clientY;
                rect.style.left = downX + "px"; 
                rect.style.top = downY + "px"; 
                //设置你要画的矩形框的起点位置
                rect.style.left = downX;
                rect.style.top = downY;
            }
           
            //鼠标松开事件
            function up(event){
              for (let i = 0; i < lis.length; i++) {
                  //将移动的div的四个点和和div元素的四个点进行比较
                  if (
                    //判断div元素 右边框的位置大于移动div的左起始点
                    rect.offsetLeft < (lis[i].offsetLeft + lis[i].offsetWidth ) &&
                    //判断div元素 下边框的位置大于移动div的上起始点
                    (lis[i].offsetTop + lis[i].offsetHeight) >rect.offsetTop
                    &&
                    // 判断div元素左边框的位置小于移动div的右起始点
                    rect.offsetLeft + rect.offsetWidth > lis[i].offsetLeft&&
                    // 判断div元素上边框的位置小于移动div的下起始点
                    rect.offsetTop + rect.offsetHeight > lis[i].offsetTop 
                  ) {
                    //将已选中的样式改变
                    if (lis[i].className.indexOf("seled") == -1) { 
                      lis[i].className = lis[i].className + " seled"; 
                    }
        
                  } else {
                    //如果没有选中则清除样式
                    if (lis[i].className.indexOf("seled") != -1) { 
                        lis[i].className = "listItem"; 
                    }
                  }
                }
                //松开鼠标左键,停止鼠标移动事件
                select = false;
                //隐藏图层
                if (rect) { 
                 document.getElementById('root').removeChild(rect); 
                } 
            }
           
            //鼠标移动事件
            function move(event){
                /*
                四个方向画框,根据你鼠标按下的位置,和你拉框时鼠标松开的位置关系,可以把区域分为四个部分,根据四个部分的不同,
                我们可以分别来画框,否则的话,就只能向一个方向画框,也就是点的右下方画框.
               
                */
                if(select){
                    // 取得鼠标移动时的坐标位置
                    mouseX2 = event.clientX;
                    mouseY2 = event.clientY;
                    // 显示框选元素
                    if (rect.style.display == "none") { 
                      rect.style.display = ""; 
                    } 
                    rect.style.left = Math.min(mouseX2, downX) + "px"; 

                    rect.style.top = Math.min(mouseY2, downY) + "px"; 

                    rect.style.width = Math.abs(mouseX2 - downX) + "px"; 

                    rect.style.height = Math.abs(mouseY2 - downY) + "px";
                    // A part
                    if( mouseX2 < downX && mouseY2 < downY ){
                        rect.style.left = mouseX2;
                        rect.style.top = mouseY2 ;   
                    }
                   
                    // B part
                    if( mouseX2 > downX && mouseY2 < downY){
                        rect.style.left = downX ;
                        rect.style.top = mouseY2;   
                    }
                   
                    // C part
                    if( mouseX2 < downX && mouseY2 > downY){
                        rect.style.left = mouseX2;
                        rect.style.top = downY ;   
                    }
                   
                    // D part
                    if( mouseX2 > downX && mouseY2 > downY ){
                        rect.style.left = downX ;
                        rect.style.top = downY;
                    }           
           
                }
                
                // 阻止事件上传
                window.event.cancelBubble = true;
                // 阻止默认事件
                window.event.returnValue = false;   
                
            }
        </script>
    </body>
</html>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 HTML 中的 `<div>` 元素来实现鼠标框选标签的效果。具体方法如下: 1. 在 HTML 文件中添加一个 `<div>` 元素,设置其宽度、高度和背景色等样式属性,使其覆盖需要进行鼠标框选的区域。 2. 使用 JavaScript 监听 `<div>` 元素的 `mousedown`、`mousemove` 和 `mouseup` 事件,分别对应鼠标按下、移动和松开的操作。 3. 在 `mousedown` 事件中记录鼠标按下的位置,并设置一个标志位表示正在进行鼠标框选操作。 4. 在 `mousemove` 事件中检测鼠标是否已经按下,并记录当前鼠标的位置。根据这两个位置计算出鼠标框选的区域,并设置一个 `<div>` 元素的样式,使其显示为一个半透明的矩形框。 5. 在 `mouseup` 事件中清除标志位,并将框选的区域信息传递给后台处理。 以下是一个简单的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>鼠标框选标签</title> <style> #select-area { position: absolute; background-color: rgba(255, 255, 0, 0.3); border: 1px dotted #000; pointer-events: none; } </style> </head> <body> <div id="wrapper" style="position: relative;"> <img src="https://picsum.photos/800/600" alt="示例图"> <div id="select-area"></div> </div> <script> const wrapper = document.getElementById('wrapper') const selectArea = document.getElementById('select-area') let isMouseDown = false let startX, startY wrapper.addEventListener('mousedown', e => { isMouseDown = true startX = e.clientX - wrapper.offsetLeft startY = e.clientY - wrapper.offsetTop }) wrapper.addEventListener('mousemove', e => { if (isMouseDown) { const currentX = e.clientX - wrapper.offsetLeft const currentY = e.clientY - wrapper.offsetTop const width = Math.abs(currentX - startX) const height = Math.abs(currentY - startY) const left = Math.min(startX, currentX) const top = Math.min(startY, currentY) selectArea.style.width = `${width}px` selectArea.style.height = `${height}px` selectArea.style.left = `${left}px` selectArea.style.top = `${top}px` } }) wrapper.addEventListener('mouseup', e => { isMouseDown = false const currentX = e.clientX - wrapper.offsetLeft const currentY = e.clientY - wrapper.offsetTop const width = Math.abs(currentX - startX) const height = Math.abs(currentY - startY) const left = Math.min(startX, currentX) const top = Math.min(startY, currentY) console.log(`(${left}, ${top}), (${left + width}, ${top + height})`) }) </script> </body> </html> ``` 上述代码中,我们在一个包含图片的 `<div>` 元素中实现了鼠标框选标签的效果。当用户在图片上按下鼠标并移动时,会在图片上显示一个半透明的矩形框,表示当前的框选区域。当用户松开鼠标时,会在控制台输出框选区域的左上角和右下角坐标。你可以根据这些坐标信息来实现具体的标签选取功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值