zoukankan      html  css  js  c++  java
  • js拖拽功能的实现

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

    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
    }

    原声js实现拖拽功能

    1.给个div,给定一些样式

    <div class="drag" style="left:0;top:0;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);

    转自:https://www.jb51.net/article/138406.htm

    转自:https://www.cnblogs.com/cb1490838281/p/9767261.html

  • 相关阅读:
    Lesson 2 :
    Session 1 : 笔记
    SpringBoot 3 : 单元测试和开发环境调试
    SpringBoot 2 : 网络配置
    MS leetcode 题目
    研二上末
    时不我待
    Do, I do!
    LeetCode 精选 TOP 面试题
    基于attractor landscape研究疾病发展及药物研发
  • 原文地址:https://www.cnblogs.com/psxiao/p/11547834.html
Copyright © 2011-2022 走看看