js实现鼠标拖拽多选功能示例

发布时间 - 2026-01-11 02:35:29    点击率:

最近做了一个用js实现鼠标拖拽多选的功能,于是整理了一下思路,写了一个小demo:

遮罩出现:

被遮罩盖住的,即为选中的块(背景色为粉色)

下面是具体代码,注释已在文中,与大家交流。

<!DOCTYPE html>
<html>
<head>
  <title>鼠标拖拽多选功能</title>
  <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
  <style type="text/css">
    *{
      box-sizing:border-box;
    }
    ul{
      width:500px;
      height:auto;
      margin:0;
      padding:20px;
      font-size: 0;
      /*需设置定位*/
      position:relative;
    }
    li{
      width:70px;
      height:70px;
      margin:10px;
      padding:0;
      display:inline-block;
      vertical-align: top;
      font-size: 13px;
      border:1px solid #d9d9d9;
    }
    #moveSelected{
      position:absolute;
      background-color: blue;
      opacity:0.3;
      border:1px dashed #d9d9d9;
      top:0;
      left:0;
    }
    .selected{
      background-color: pink;
    }
  </style>
</head>
<body>
  <ul class="list">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
    <li>16</li>
    <li>17</li>
    <li>18</li>
    <li>19</li>
    <li>20</li>
    <li>21</li>
    <li>22</li>
    <!-- 鼠标拖拽出的遮罩 (定位为 position:absolute)-->
    <!-- 遮罩最好是在绑定了mouseover事件的元素内部,并且不要阻止遮罩的冒泡事件。这样鼠标移到了遮罩上面,依然可以利用冒泡执行父元素的mouseover事件,就不会出现遮罩只能扩大,不能缩小的情况了(亲自试过) -->
    <div id="moveSelected"></div>
  </ul>
</body>
</html>
<script type="text/javascript">
  $(document).ready(function(){
    let moveSelected=$('#moveSelected')[0];
    let flag=false;//是搜开启拖拽的标志
    let oldLeft=0;//鼠标按下时的left,top
    let oldTop=0;
    let selectedList=[];//拖拽多选选中的块集合

    // 鼠标按下时开启拖拽多选,将遮罩定位并展现
    $(".list").mousedown(function(event) {
      flag=true;
      moveSelected.style.top=event.pageY+'px';
      moveSelected.style.left=event.pageX+'px';
      oldLeft=event.pageX;
      oldTop=event.pageY;
      event.preventDefault(); // 阻止默认行为
      event.stopPropagation(); // 阻止事件冒泡
    });
    // 鼠标移动时计算遮罩的位置,宽 高
    $(".list").mousemove(function(event) {
      if(!flag) return;//只有开启了拖拽,才进行mouseover操作
      if(event.pageX<oldLeft){//向左拖
        moveSelected.style.left=event.pageX+'px';
        moveSelected.style.width=(oldLeft-event.pageX)+'px';
      }else{
        moveSelected.style.width=(event.pageX-oldLeft)+'px';
      }
      if(event.pageY<oldTop){//向上
        moveSelected.style.top=event.pageY+'px';
        moveSelected.style.height=(oldTop-event.pageY)+'px';
      }else{
        moveSelected.style.height=(event.pageY-oldTop)+'px';
      }
      event.preventDefault(); // 阻止默认行为
      event.stopPropagation(); // 阻止事件冒泡
    });
    //鼠标抬起时计算遮罩的right 和 bottom,找出遮罩覆盖的块,关闭拖拽选中开关,清除遮罩数据
    $(".list").mouseup(function(event) {
      moveSelected.style.bottom=Number(moveSelected.style.top.split('px')[0])+Number(moveSelected.style.height.split('px')[0]) + 'px';
      moveSelected.style.right=Number(moveSelected.style.left.split('px')[0])+Number(moveSelected.style.width.split('px')[0])+'px';
      findSelected();
      flag=false;
      clearDragData();
      event.preventDefault(); // 阻止默认行为
      event.stopPropagation(); // 阻止事件冒泡
    });
    $(".list").mouseleave(function(event) {
      flag=false;
      moveSelected.style.width=0;
      moveSelected.style.height=0;
      moveSelected.style.top=0;
      moveSelected.style.left=0;
      event.preventDefault(); // 阻止默认行为
      event.stopPropagation(); // 阻止事件冒泡
    });
    function findSelected(){
      let blockList=$('.list').find('li');
      for(let i=0;i<blockList.length;i++){
        //计算每个块的定位信息
        let left=$(blockList[i]).offset().left;
        let right=$(blockList[i]).width()+left;
        let top=$(blockList[i]).offset().top;
        let bottom=$(blockList[i]).height()+top;
        //判断每个块是否被遮罩盖住(即选中)
        let leftFlag=moveSelected.style.left.split('px')[0]<=left && left<=moveSelected.style.right.split('px')[0];
        let rightFlag=moveSelected.style.left.split('px')[0]<=right && right<=moveSelected.style.right.split('px')[0];
        let topFlag=moveSelected.style.top.split('px')[0]<=top && top<=moveSelected.style.bottom.split('px')[0];
        let bottomFlag=moveSelected.style.top.split('px')[0]<=bottom && bottom<=moveSelected.style.bottom.split('px')[0];
        if((leftFlag || rightFlag) && (topFlag || bottomFlag)){
          selectedList.push(blockList[i]);
          $(blockList[i]).addClass('selected');
        }
      }
      console.log(selectedList);
    }
    function clearDragData(){
      moveSelected.style.width=0;
      moveSelected.style.height=0;
      moveSelected.style.top=0;
      moveSelected.style.left=0;
      moveSelected.style.bottom=0;
      moveSelected.style.right=0;
    }
  });
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# js鼠标拖拽多选  # js实现鼠标拖拽多选  # 使用javaScript实现鼠标拖拽事件  # 鼠标拖拽移动子窗体的JS实现  # js实现使用鼠标拖拽切换图片的方法  # JS鼠标拖拽实例分析  # jsMind通过鼠标拖拽的方式调整节点位置  # js实现鼠标拖拽div左右滑动  # JavaScript鼠标拖拽事件详解  # 超酷的鼠标拖拽翻页(分页)效果实现javascript代码  # js实现鼠标拖拽缩放div实例代码  # JavaScript实现div的鼠标拖拽效果  # 鼠标  # 拖拽  # 时计  # 多选  # 按下  # 是在  # 写了  # 已在  # 定了  # 试过  # 移到  # 可以利用  # 即为  # 大家多多  # 背景色  # 罩上  # 开启了  # padding  # margin  # size 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel如何实现API资源集合?(Resource Collection教程)  如何在香港服务器上快速搭建免备案网站?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Angular 表单中正确绑定输入值以确保提交与验证正常工作  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel如何处理和验证JSON类型的数据库字段  如何用wdcp快速搭建高效网站?  如何在Tomcat中配置并部署网站项目?  魔方云NAT建站如何实现端口转发?  独立制作一个网站多少钱,建立网站需要花多少钱?  在Oracle关闭情况下如何修改spfile的参数  jQuery validate插件功能与用法详解  Laravel如何与Inertia.js和Vue/React构建现代单页应用  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel如何自定义分页视图?(Pagination示例)  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Java类加载基本过程详细介绍  如何用AWS免费套餐快速搭建高效网站?  详解Oracle修改字段类型方法总结  如何打造高效商业网站?建站目的决定转化率  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  怎样使用JSON进行数据交换_它有什么限制  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  浅谈Javascript中的Label语句  详解Android图表 MPAndroidChart折线图  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何使用Collections进行数据处理?(实用方法示例)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Python函数文档自动校验_规范解析【教程】  iOS验证手机号的正则表达式