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 相关文章推荐
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
Jul 26 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
javascript实现英文首字母大写
Apr 23 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
JS中常用的正则表达式
Sep 29 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
详解Angular的数据显示优化处理
Dec 26 Javascript
轻松理解Javascript变量的相关问题
Jan 20 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 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
DOMXML函数笔记
2006/10/09 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
Smarty模板语法详解
2019/07/20 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
js 走马灯简单实例
2013/11/21 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
jQuery的框架介绍
2016/05/11 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
js微信分享接口调用详解
2019/07/23 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python实现栈的方法
2015/05/26 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
python实现手机通讯录搜索功能
2018/02/22 Python
Python使用gRPC传输协议教程
2018/10/16 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
苹果音乐订阅:Apple Music
2018/08/02 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
校运会入场式解说词
2014/02/10 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
《静夜思》教学反思
2016/02/17 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python