JS小案例:实现盒子拖拽功能

HTML部分:

<div id="box"></div>

CSS部分:

#box{width: 100px;height: 100px;background-color: pink;position: absolute;top: 0;left: 0;}

JS部分:

方法一:

window.onload=function(){var bax=document.getElementById("box");var divX=0;var divY=0;var mouseX=0;var mouseY=0;//为box绑定一个鼠标按下事件box.onmousedown=function(e){//获取盒子距离浏览器可视窗口的水平距离和垂直距离divX=this.offsetLeft;divY=this.offsetTop;//获取鼠标距离浏览器可视窗口的水平位置和垂直位置mouseX=e.clientX;mouseY=e.clientY;//为全局绑定一个鼠标移动事件(1.为什么不给box绑定?)document.onmousemove=function(e){//获取移动后的水平偏移量和垂直偏移量var disX=e.clientX-mouseX;var disY=e.clientY-mouseY;//令箱子移动:移动前的位置+移动后的位置box.style.left=disX+divX+"px";box.style.top=disY+divY+"px";}//为盒子绑定一个鼠标移出事件,使箱子停止移动document.onmouseup=function(){document.onmousemove=null;document.onmouseup=null;}}}

逻辑解释:
------1.鼠标按下时:
--------------获取到鼠标按下时的浏览器可视窗口的水平距离和垂直距离;
--------------获取到元素位置的距离浏览器可视窗口的水平距离和垂直距离。
------2.鼠标移动时:
--------------定义变量,表示鼠标移动后的水平偏移量和垂直偏移量;
--------------改变箱子的水平距离和垂直距离=移动前的水平/垂直距离+水平/垂直偏移量;
------3.鼠标放下时:
--------------使元素停止运动

方法二:

window.onload=function(){//开启box1的拖拽var box1=document.getElementById("box1");drag(box1);}//提取1一个专门设置拖拽的函数//参数:开启拖拽的元素function drag(obj){obj.onmousedown=function(event){//2.这行代码的作用?event=event||window.event;//div的偏移量 鼠标.clientX-元素.offsetLeft//div的偏移量 鼠标.clientY-元素.offsetTopvar ol=event.clientX-obj.offsetLeft;var ot=event.clientY-obj.offsetTop;//1.当鼠标在被拖拽元素上按下时,开始拖拽document.onmousemove=function(event){//设置box1捕获所有鼠标按下的事件//setCapture可以将鼠标事件锁定在指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上。obj.setCapture && obj.setCapture();//2.当鼠标移动时被拖拽元素跟随鼠标移动event=event||window.event;var left=event.clientX-ol;var top=event.clientY-ot;obj.style.left=left+"px";obj.style.top=top+"px";} //为元素绑定一个鼠标松开函数document.onmouseup=function(){// 3.当鼠标松开时,被拖拽元素固定在当前位置document.onmousemove=null;document.onmouseup=null;//当鼠标松开时取消捕获obj.releaseCapture && obj.releaseCapture();}//3.为什么要添加return false?return false;}}

逻辑解释:
------1.鼠标按下时:
--------------定义变量,保存鼠标按下时的的位置距离元素的水平位置和垂直位置;

------2.鼠标移动时:
--------------使用setcapture方法将该鼠标事件锁定在元素上;
--------------定义变量,表示鼠标移动后的水平偏移量和垂直偏移量-鼠标按下时的水平/垂直位置;
--------------令元素的水平/垂直位置等于上述变量。

------3.鼠标放下时:
--------------使元素停止运动;
--------------使用releasecapture取消捕获。

问题解释

1.此时需要给文档对象绑定一个鼠标移动事件,如果只给box绑定的话,如果鼠标离开box的位置,则无法再拖拽,所以要在document绑定,才能使元素在整个页面移动

2.event这个参数只有IE8以上的浏览器才会兼容,而IE8以下的浏览器则需要使用event=window.event,使代码兼容性更强大了。

  1. 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容。此时会导致拖拽功能的异常,这个是浏览器提供的默认行为。如果不希望发生这个行为,可以通过return false取消这个行为。但是对IE8不起作用。

扩:如何区分clientX、offsetX、screenX?

路漫漫其修远兮,吾将上下而求索。
Array[林]奉上

【JS案例】:实现盒子拖拽功能相关推荐

  1. draggable禁止拖动_通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽...

    前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...

  2. js面向对象思想封装拖拽功能,兼容pc和移动端

    我们在开发项目过程中,很可能会碰到页面上某块需要可以拖拽移动的功能需求,网上已经有不少前辈分享了相关功能的案例,插件或者代码,但是考虑到项目功能需求,我们可能仅需要实现拖拽移动功能就可以,不需要其他功 ...

  3. js分隔条实现拖拽功能(支持左右拖动)

    这次记录就不贴代码了,只是记录一下原理和思路,因为代码封装的太严格,所以不好拿出来. lz的页面是左右各一个分隔条实现拖拽的,左边是框架自带一个功能没问题,右边是lz模仿做的,结果样子是做出来了,就是 ...

  4. js简单实现鼠标拖拽功能:盒子可以跟着鼠标移动位置

    实现的原理: 根据上面的图可以算出移动后的盒子的left和top: 鼠标距离边界的值: ev.pageY - box.top ev.pageX - box.left box2.top = ev2.pa ...

  5. java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能

    一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...

  6. js实现鼠标拖拽功能基本思路

    如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒. onmousedown:鼠标按下事件 onmousemove:鼠标移动事件 onmouseup:鼠标抬起事件 拖拽的基本原 ...

  7. 移动html触摸效果,JS实现移动端触屏拖拽功能

    2.css 3.js = maxW) { oLeft = maxW; } if(oTop < 0) { oTop = 0; } else if(oTop >= maxH) { oTop = ...

  8. 盒子拖拽效果,原生js实现

    原生js实现拖拽效果 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  9. html 手机端拖拽效果,JS实现移动端触屏拖拽功能

    1.html 2.css * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; } #div1 { width: 5 ...

最新文章

  1. Java颜色互换_java – 如何慢慢地将对象颜色从一个变为...
  2. 赛马问题,毒药问题,倒水问题等智力题
  3. mssql自定义函数中使用游标
  4. 问题 E: 小鱼的数学问题(递推)
  5. 小朋友学C++(1)
  6. Andriod开发 --插件安装、环境配置、问题集锦
  7. Windows Server 2016之RDS配置证书
  8. 肖仰华 | 大规模、高质量的金融知识图谱,如何自动化构建?
  9. 解决cuda版本与pytorch版本不兼容问题
  10. 计算机二级判断题技巧一半对一半错,计算机二级小技巧
  11. 重磅!『2021科技研究前沿』发布,重点关注11大领域、171个热点和新兴前沿!...
  12. 【Spark】Spark的Kryo序列化
  13. C语言基础:如何判断素数(质数)与合数
  14. 1357:车厢调度 (栈)
  15. 为什么沿着梯度相反的方向更新参数
  16. HTML5 混合APP开发学习笔记(三)——CSS样式设计
  17. poj2528 贴海报
  18. 喜讯 雨笋教育优秀学员荣获望城区网络安全攻防演练二等奖
  19. Web服务器和客户端
  20. Python 二分查找:bisect库的使用

热门文章

  1. 返回上一页页面数据保存
  2. 解决ajax跨域问题的5种解决方案
  3. Mybatis知识点讲解 【笔记】
  4. 基于SSM的在线视频网站的设计与实现
  5. PHP 后端开发之调试方法
  6. 台湾屏东:神人共欢“迎王祭”
  7. Github发布名叫“依赖图”(Dependency Graph)新工具
  8. Java日志-总结【这一篇够了】
  9. 关于 contentWindow, contentDocument
  10. Linux环境下从MySql数据库导出sql文件