首页 > 其他分享 >js 实现元素拖拽

js 实现元素拖拽

时间:2022-10-31 01:33:45浏览次数:76  
标签:console 鼠标 top 元素 window js drag 拖拽 left

概述

js 实现拖拽,主要使用元素的 onm ousedown、onmousemove、onmouseup 三个事件实现。

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

实现思路

  • 我们当左键点击时,需要记录当前的鼠标点击位置相对于该元素左上角的x,y坐标,这里我们使用diffX和diffY来表示
  • 然后我们移动时需要不断计算当前元素距离浏览器左边和上边的距离;
  • 同时给元素进行赋值;
  • 当鼠标抬起时,取消鼠标移动事件和鼠标抬起事件。
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
            * {
                margin: 0px;
                padding: 0px;
            }
            #drag {
                width: 200px;
                height: 200px;
                background: red;
                cursor: pointer;
                position: absolute;
            }
        </style>
    </head>
    <body>
        <div id="drag"></div>
        <script>
            window.onload = function () {
                //获取drag元素
                let drag = document.getElementById("drag");
                //当鼠标按下时
                drag.onmousedown = function (e) {
                    console.log("onmousedown", e);
                    console.log("offsetLeft", drag.offsetLeft);
                    console.log("offsetTop", drag.offsetTop);
                    //做到浏览器兼容
                    e = e || window.event;
                    // 计算鼠标点击位置相对于元素左上角的左边和上边距离
                    let diffX = e.clientX - drag.offsetLeft;
                    let diffY = e.clientY - drag.offsetTop;
                    //当拉着box移动时
                    document.onmousemove = function (e) {
                        console.log("onmousemove", e);
                        // 浏览器兼容
                        e = e || window.event;
                        // 元素的 clientX 和 clientY 默认是以元素左上角位置来计算的,这里需要向左向上同时减去鼠标点击的位置差,从而可以保证鼠标始终显示在拖拽元素时的位置
                        let left = e.clientX - diffX;
                        let top = e.clientY - diffY;
                        console.log("left", left);
                        console.log("top", top);
                        // 边界处理,防止超出各个边
                        if (left < 0) {
                            left = 0;
                        } else if (left > window.innerWidth - drag.offsetWidth) {
                            left = window.innerWidth - drag.offsetWidth;
                        }
                        if (top < 0) {
                            top = 0;
                        } else if (top > window.innerHeight - drag.offsetHeight) {
                            top = window.innerHeight - drag.offsetHeight;
                        }
                        // 实时给元素定位赋值
                        drag.style.left = left + "px";
                        drag.style.top = top + "px";
                    };

                    // 当鼠标抬起时
                    document.onmouseup = function (e) {
                        console.log("onmouseup", e);
                        this.onmousemove = null;
                        this.onmouseup = null;
                    };
                };
            };
        </script>
    </body>
</html>

参考链接

 

标签:console,鼠标,top,元素,window,js,drag,拖拽,left
From: https://www.cnblogs.com/beileixinqing/p/16842917.html

相关文章

  • <3> node.js----express服务
    /*express的服务器*///1.导入expressconstexpress=require('express');constbodyParser=require('body-parser');//2.js文件导入constaesEncrypt=req......
  • Go中json的marshal解析
    转自:https://blog.csdn.net/zxy_666/article/details/801732881.JsonMarshal将数据结构编码成json字符串。Json(JavascriptObjectNanotation)是一种数据交换格式,常用......
  • babyJson
    学习从0到1的json实现(一)参考这个教程入门:https://github.com/miloyip/json-tutorial实现自己的json解释器过程中遇到了很多问题,这是一篇日志性质的踩坑记录…或许看......
  • 原生js实现 贪吃 蛇,个感想人
    毕业已经三个月了,在我们学习玩那些便捷的框架之后,似乎对原生的数据结构,js,css,甚至swing等越来越远其实这是错误的,所有高端的技术都是在基础至上一步一步衍生出来的,就像我们......
  • vue 绘制波形图 wavesurfer.js (音频/视频) 【实用教程】
    安装wavesurfer.jscnpmiwavesurfer.js--save无cnpm的先运行npmicnpm-g全局安装cnpm绘制音频波形图常用的配置参数详见注释。<template><divstyle="padding:......
  • js滑动验证
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content......
  • js canvas
      <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"......
  • js复习
    记录那些小小的JS书面知识JS的组成JS语法(ECMAScript),页面文档对象模型(DOM),浏览器对象模型(BOM)ECMAScript:ECMAScript规定了JS的编程语法和基础核心知识,是所有浏......
  • js图片格式转换(File、blob、二进制)
    一、File转Blob​​MDN文档createObjectURL​​​​​​<buttonclass="btn"onclick="openFile()">点我</button>functionopenFile(){varinput=document.createEle......
  • springboot~写一个从excel读取json到List<Map>的方法
    excel读出来的json,它是一个字符串,不是标准json,所以需要对字符串字段进行解析复杂的excel如图通过poi解析json,通过jackson完成对字段的解析publicstaticList<Map<String,O......