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 相关文章推荐
js onkeypress与onkeydown 事件区别详细说明
Dec 13 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
基于BootStarp的Dailog
Apr 28 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
Feb 20 Javascript
jQuery实现获取h1-h6标题元素值的方法
Mar 06 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
详解js的作用域、预解析机制
Feb 05 Javascript
vue绑定的点击事件阻止冒泡的实例
Feb 08 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
Apr 28 Javascript
微信小程序实现倒计时功能
Nov 19 Javascript
使用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 水平的题目
2007/05/30 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
PDO::quote讲解
2019/01/29 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
基于python中__add__函数的用法
2019/11/25 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
教师找工作推荐信
2013/11/23 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
校庆团日活动总结
2014/08/28 职场文书
产品委托授权书范本
2014/09/16 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
小鞋子观后感
2015/06/05 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA