创建一个可以拖拽移动的div

本文详细解析了如何使用原生JavaScript实现一个可拖拽的DIV元素。从HTML结构搭建、CSS样式设定,到利用鼠标事件完成DIV的移动,文章逐步介绍了offsetX、offsetY、pageX、pageY等关键属性的运用,以及解决边界问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个其实是一道面试题
我们今天可以看看,并且进行思路分析

思路:

	1 一个可以移动的div ,他必须是脱离文本流的吧;脱离文档流有很多方法
	最常用的就是定位
    2 可以拖拽移动,那么鼠标的 down  move up事件肯定也要有
    3 坐标肯定也要拿到,一般都是e事件(后面会讲)
    4 开始做 一边做 一边修改(后面会遇到在各种各样预想不到问题)

首先随便是创建一个div (设置样式的时候要脱离文档流)
按下! 然后Tab一键生成html
在body里面写一个开机标签就行了 (
别问我为什是块级标签,块级元素才能设置宽高)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>My Move</title>
</head>
<body>
	<div><div/>
</body>
</html>

接下来就可以开始创建一个div了
因为代码量很少 我就把它们都写在同一个文件里面了
样式部分

<style>
  *{
    margin:0;
    padding:0;
  }
  div{
    width:100px;
    height:100px;
    border:1px solid green;
    background-color: green;
    position:absolute;
  }
</style>

这样就生成这个:
在浏览器的最左上角生成绿色的正方形(就截图了一点)
在浏览器的最左上角生成绿色的正方形
接着就是重点了 JS部分
现在可以想一下大致的结构(原生方法)
大致的鼠标事件的结构:
(我的选择的获取方法是TagName,这个兼容性强一点,但要记住,这个选出来和querySelectAll一样都是类数组,所以最好加上下标)

<script>
  var div = document.getElementsByTagName('div')[0];
  console.log(div);
  div.onmousedown = function (e) {
    console.log('down')
    console.log(e)
    div.onmousemove = function (e) {
      console.log('move')
      div.onmouseup = function (e) {
        console.log('up')
        //鼠标事件清除,运行一次就清除掉,这样就不会影响下一次运行
        div.onmousemove = null
      }
    }
  }
</script>

这是基本结构 鼠标时间的排版哦 ;没看懂的朋友多去百度并写一写很快就能看懂了
还有就是这个e变量 这个是浏览器的事件 是一个很泛指的东西 指向所有事件 你也可以写b c v 等等 都可以 如果不懂 在onmousedown函数里面打印一下就是知道了
打印的这个e是一个大的对象
思路2:

	1  了解 offsetX  offsetY 和pageX  pageY 这几个属性(这几个属性名不懂
	一定要自己去百度)
	2  每次移动 都要把新的坐标赋值给原来的div,这样才能保证div的移动的视觉效果

然后就要开始写代码了
思路:
分别获得
offsetX offsetY 和pageX pageY他们的值
并且让 pageX-offsetX 得到正确的div的坐标
让 pageY-offsetY 得到正确的div的坐标
有人觉得为什么要这么麻烦 因为一个正放心的坐标是什么
没错 : 在左上角 但是我们不可能你每次都在左上角 ,如果点击的地方不是左上角
div会自动给你跳到左上角 这个就很恐怖了
所以才需要精确地计算它的 页面坐标 - 点击坐标 = 左上角的div坐标完整代码

<script>
var div = document.getElementsByTagName('div')[0];
console.log(div);
div.onmousedown = function (e) {
 console.log(e)
 var x = e.offsetX
 var y = e.offsetY
 console.log(x, y)
 div.onmousemove = function (e) {
   //主要逻辑就是下面两行代码 
   //将得到的坐标值 赋值给div
   div.style.top = e.pageY - y + 'px';
   div.style.left = e.pageX - x + 'px';
   console.log(e.pageX, e.pageY)
   div.onmouseup = function (e) {
     //鼠标事件清除,运行一次就清除掉,这样就不会影响下一次运行
     div.onmousemove = null
   }
 }
}
</script>

到这里 你以为就结束了吗 ?
哼 ! 天真
实际操作中我们发现 如果div移动到边框 然后再突然出现在页面的其他位置
div的一系列鼠标事件就不能结束了 除非你把鼠标重新放回div上
为什么呢 ?
把div换成document就ok了 现在知道为什么把?

<script>
  var div = document.getElementsByTagName('div')[0];
  console.log(div);
  div.onmousedown = function (e) {
    console.log(e)
    var x = e.offsetX
    var y = e.offsetY
    console.log(x, y)
    document.onmousemove = function (e) {
      //主要逻辑就是下面两行代码 
      //将得到的坐标值 赋值给div
      div.style.top = e.pageY - y + 'px';
      div.style.left = e.pageX - x + 'px';
      console.log(e.pageX, e.pageY)
      document.onmouseup = function (e) {
        //鼠标事件清除,运行一次就清除掉,这样就不会影响下一次运行
        document.onmousemove = null
      }
    }
  }
</script>

完结撒花

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值