博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原生基础版】js原生实现拖拽效果,注意不要忘了div的cursor用grab和grabbing(还是古法炮制、传统工艺的原生代码兼容性最好,推荐!!!)
阅读量:2032 次
发布时间:2019-04-28

本文共 2627 字,大约阅读时间需要 8 分钟。

以下方式的劣势就是在放弃拖拽那一刻会触发click事件,通常如果被拖拽元素还有其他点击事件,会重复触发,往往并非业务需求。优势就是…额…貌似这段代码没什么屌优势! 

// 初始化需要拖拽的列    initDrags() {      var arr = document.querySelectorAll(".dragged");      for (var i = 0, len = arr.length; i < len; i++) {        var a = arr[i];        this.drag(a);      }    },    // js原生实现拖拽效果    drag(sel) {      var dragged = typeof sel === "string" ? document.querySelector(sel) : sel;      // 点击某物体时,用drag对象即可,move和up是全局区域,      // 也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动)      dragged.onmousedown = function(event) {        var event = event || window.event; //兼容IE浏览器        // 鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离        var diffX = event.clientX - dragged.offsetLeft;        var diffY = event.clientY - dragged.offsetTop;        if (typeof dragged.setCapture !== "undefined") {          dragged.setCapture();//防止拖拽的时候鼠标离开了div范围就没办法移动了        }//这个地方一般不建议直接用document,最好用document.querySelector("容器"),以免和其他子元素的onmousemove冲突,但是务必确保移动范围是在容器范围内,否则出界就无法移动了        document.onmousemove = function(event) {          dragged.setAttribute("dragging", "true"); //拖拽过程变成虚线的样子          var event = event || window.event;          var x = event.clientX - diffX;          var y = event.clientY - diffY;          if (x < 0) {            x = 0;          } else if (x > window.innerWidth - dragged.offsetWidth) {            x = window.innerWidth - dragged.offsetWidth;          }          if (y < 0) {            y = 0;          } else if (y > window.innerHeight - dragged.offsetHeight) {            y = window.innerHeight - dragged.offsetHeight;          }          dragged.style.left = x + "px";//左右拖拽          dragged.style.top = y + "px";//上下拖拽        };//这个地方一般不建议直接用document,最好用document.querySelector("容器"),以免和其他子元素的onmouseup冲突,但是务必确保移动范围是在容器范围内,否则出界就无法松开了        document.onmouseout = document.onmouseup = function(event) {          dragged.removeAttribute("dragging"); //取消虚线样式          this.onmousemove = null;          this.onmouseup = null;          //修复低版本ie bug          if (typeof dragged.releaseCapture != "undefined") {            dragged.releaseCapture();          }        };      };    },
div.dragged {   /*禁止选中文本*/  -moz-user-select: none;  -webkit-user-select: none;  -ms-user-select: none;  -khtml-user-select: none;  user-select: none;  cursor: grab;  &:active {    z-index: 1;    cursor: grabbing;    opacity: .618;  }  &[dragging] {    cursor: grabbing;    background: white !important;    border: 1px dashed gray !important;    color: gray !important;    opacity: 0.9 !important;    transform: translate(-3px, -3px);    box-shadow: 5px 10px 0 rgba(0, 0, 0, 0.05);  }}

 

转载地址:http://sfxaf.baihongyu.com/

你可能感兴趣的文章
Java数组及数组工具类Arrays的使用
查看>>
Oracle11g数据库的下载与安装
查看>>
手动启动 oracle 服务
查看>>
oracle创建用户并授权
查看>>
模拟(手写)ArrayList
查看>>
深入浅出 Java 虚拟机——专题
查看>>
一 基础原理:第01讲:一探究竟:为什么需要 JVM?它处在什么位置?
查看>>
一 基础原理:第02讲:大厂面试题:你不得不掌握的 JVM 内存管理
查看>>
一 基础原理:第03讲:大厂面试题:从覆盖 JDK 的类开始掌握类的加载机制
查看>>
一 基础原理:第04讲:动手实践:从栈帧看字节码是如何在 JVM 中进行流转的
查看>>
二 垃圾回收:第05讲:大厂面试题:得心应手应对 OOM 的疑难杂症
查看>>
二 垃圾回收:第06讲:深入剖析:垃圾回收你真的了解吗?(上)
查看>>
二 垃圾回收:第06讲:深入剖析:垃圾回收你真的了解吗?(下)
查看>>
二 垃圾回收:第07讲:大厂面试题:有了 G1 还需要其他垃圾回收器吗?
查看>>
二 垃圾回收:第08讲:案例实战:亿级流量高并发下如何进行估算和调优
查看>>
三 实战:第09讲:案例实战:面对突如其来的 GC 问题如何下手解决
查看>>
jvm核心:hashcode&markword
查看>>
Spring最深处——ASM
查看>>
简单模拟Ttomcat
查看>>
Java二十三种设计模式总结
查看>>