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


Posted in Javascript onAugust 01, 2017

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

遮罩出现:

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

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

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

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

<!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>

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

Javascript 相关文章推荐
window.showModalDialog使用手册
Jan 11 Javascript
JavaScript的9个陷阱及评点分析
May 16 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
常用的JavaScript验证正则表达式汇总
Nov 26 Javascript
window.showModalDialog()返回值的学习心得总结
Jan 07 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
jquery 根据name名获取元素的value值
Feb 27 Javascript
9种改善AngularJS性能的方法
Nov 28 Javascript
js推箱子小游戏步骤代码解析
Jan 10 Javascript
在nuxt中使用路由重定向的实例
Nov 06 Javascript
Vue router配置与使用分析讲解
Dec 24 Vue.js
使用Node.js实现RESTful API的示例
Aug 01 #Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 #jQuery
js下拉菜单生成器dropMenu使用方法详解
Aug 01 #Javascript
简述jQuery Easyui一些用法
Aug 01 #jQuery
js图片上传的封装代码
Aug 01 #Javascript
使用重写url机制实现验证码换一张功能
Aug 01 #Javascript
js实现拖拽上传图片功能
Aug 01 #Javascript
You might like
PHP 断点续传实例详解
2017/11/11 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
SVG描边动画
2017/02/23 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
python实发邮件实例详解
2019/11/11 Python
python分布式计算dispy的使用详解
2019/12/22 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
公司领导推荐信
2013/11/12 职场文书
车间统计员岗位职责
2014/01/05 职场文书
简历自我评价模板
2015/03/11 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
JavaScript 数组去重详解
2021/09/15 Javascript
python运行脚本文件的三种方法实例
2022/06/25 Python