当前位置:首页 > 学习提升 > javascript > 正文内容

js拖拽功能的实现

自由小鸟2年前 (2023-01-03)javascript1195

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

1.onmousedown:鼠标按下事件
2.onmousemove:鼠标移动事件
3.onmouseup:鼠标抬起事件

拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

拖拽状态 = 0鼠标在元素上按下的时候{
      拖拽状态 = 1
      记录下鼠标的x和y坐标
      记录下元素的x和y坐标
}
鼠标在元素上移动的时候{
      如果拖拽状态是0就什么也不做。
      如果拖拽状态是1,那么
      元素y = 现在鼠标y - 原来鼠标y + 原来元素y
      元素x = 现在鼠标x - 原来鼠标x + 原来元素x
}
鼠标在任何时候放开的时候{
       拖拽状态  = 0
}
<div class="drag" style="left:0;top:0;width:100px;height:100px">按住拖动</div>
<style>
        .drag {
            background-color: skyblue;
            position: absolute;
            line-height: 100px;
            text-align: center;
        }
 </style>
// 获取DOM元素  
      let dragDiv = document.getElementsByClassName("drag")[0];
      // 鼠标按下事件 处理程序
      let putDown = function (event) {
          dragDiv.style.cursor = "pointer";
          let offsetX = parseInt(dragDiv.style.left); // 获取当前的x轴距离
          let offsetY = parseInt(dragDiv.style.top); // 获取当前的y轴距离
          let innerX = event.clientX - offsetX; // 获取鼠标在方块内的x轴距
          let innerY = event.clientY - offsetY; // 获取鼠标在方块内的y轴距
          // 按住鼠标时为div添加一个border
          dragDiv.style.borderStyle = "solid";
          dragDiv.style.borderColor = "red";
          dragDiv.style.borderWidth = "3px";
          // 鼠标移动的时候不停的修改div的left和top值
          document.onmousemove = function (event) {
              dragDiv.style.left = event.clientX - innerX + "px";
              dragDiv.style.top = event.clientY - innerY + "px";
              // 边界判断
              if (parseInt(dragDiv.style.left) <= 0) {
                  dragDiv.style.left = "0px";
              }
              if (parseInt(dragDiv.style.top) <= 0) {
                  dragDiv.style.top = "0px";
              }
              if (parseInt(dragDiv.style.left) >= window.innerWidth - parseInt(dragDiv.style.width)) {
                  dragDiv.style.left = window.innerWidth - parseInt(dragDiv.style.width) + "px";
              }
              if (parseInt(dragDiv.style.top) >= window.innerHeight - parseInt(dragDiv.style.height)) {
                  dragDiv.style.top = window.innerHeight - parseInt(dragDiv.style.height) + "px";
              }
          }
          // 鼠标抬起时,清除绑定在文档上的mousemove和mouseup事件
          // 否则鼠标抬起后还可以继续拖拽方块
          document.onmouseup = function () {
              document.onmousemove = null;
              document.onmouseup = null;
              // 清除border
              dragDiv.style.borderStyle = "";
              dragDiv.style.borderColor = "";
              dragDiv.style.borderWidth = "";
          }
      }
      // 绑定鼠标按下事件
      dragDiv.addEventListener("mousedown", putDown, false);

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://www.webge.net/?id=164

“js拖拽功能的实现” 的相关文章

未命名

未命名

1、clientHeight:表示的是可视区域的高度,不包含border和滚动条;2、offsetHeight:表示的是可视区域的高度,包含了border和滚动条3、scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分;4、clientTop:表示边框border的厚度,在未指...

异步加载js的方法

一、为什么要写异步加载①js加载本身是属于同步加载的,加载js文件会阻塞文档,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。但是有些工具方法需要按需加载,有一些工具js文件它是不会改变页面的,用到再加载,不用不加载。 ②但是实际开发中我们只需要把script标签放在页面的最下面。...

请解释什么是事件委托/事件代理

˂a name="什么是事件委托" class="reference-link" href="#"˃什么是事件委托事件委托也称之为事件代理(Event Delegation)。是JavaScript中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定在子元素的响应事件委托给父元素,让父...

Javascript如何实现继承

JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法 ˂a name="一,原型链继承" class="reference-link" href="#"˃一,原型链继承让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。当试图访问一个对象的...