原生JavaScript实现div拖拽效果

分手后的思念是犯贱 2022-05-24 03:43 452阅读 0赞

实现思路:

(1)首先改变被拖动元素的布局属性为“position:absolute”,其父框为“position:relative”;

(2)捕捉鼠标事件“mousedown”、“mousemove”、“mouseup”;

(3)当触发“mousedown”时,记录下当前鼠标在元素中的相对位置,_x,_y;

(4)紧接着处理“mousemove”事件,通过改变元素的top和left属性来移动元素;

(5)当触发“mouse”事件时,终止拖动。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>原生js实现拖拽</title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  6. <style type="text/css">
  7. #div1{
  8. width: 100px; height: 100px;
  9. background-color: #4D4D4D;
  10. position: absolute; cursor: pointer;
  11. -webkit-box-shadow: 3px 3px 0px 3px #C7C7C7;
  12. box-shadow: 3px 3px 3px 0px #C7C7C7;
  13. }
  14. #parent{
  15. width: 500px; height: 500px;
  16. border: 1px solid #CDCDCD;
  17. position: relative; margin: 0 auto;
  18. background-color: #F4F4F4;
  19. }
  20. .postText{
  21. width: 500px; height: 30px;margin: 0 auto; background-color: #F4F4F4;
  22. }
  23. .postText span{
  24. padding:0px 10px;
  25. }
  26. </style>
  27. <script type="text/javascript">
  28. function posMove(getdivid) {
  29. var oDiv = document.getElementById(getdivid);
  30. var oParent = document.getElementById('parent');
  31. var sent = {
  32. l: 10, //设置div在父元素的活动范围,10相当于给父div设置padding-left:10;
  33. r: oParent.offsetWidth - oDiv.offsetWidth, // offsetWidth:当前对象的宽度, offsetWidth = width+padding+border
  34. t: 10,
  35. b: oParent.offsetHeight - oDiv.offsetHeight,
  36. n: 10
  37. }
  38. drag(oDiv, sent);
  39. }
  40. /**
  41. *
  42. * @param obj:被拖动的div
  43. * @param sent :设置div在容器中可以被拖动的区域
  44. */
  45. function drag(obj,sent){
  46. var dmW = document.documentElement.clientWidth || document.body.clientWidth;
  47. var dmH = document.documentElement.clientHeight || document.body.clientHeight;
  48. var sent = sent || {};
  49. var l = sent.l || 0;
  50. var r = sent.r || dmW - obj.offsetWidth;
  51. var t = sent.t || 0;
  52. var b = sent.b || dmH - obj.offsetHeight;
  53. var n = sent.n || 10;
  54. obj.onmousedown = function (ev){
  55. var oEvent = ev || event;
  56. var sentX = oEvent.clientX - obj.offsetLeft;
  57. var sentY = oEvent.clientY - obj.offsetTop;
  58. document.onmousemove = function (ev){
  59. var oEvent = ev || event;
  60. var slideLeft = oEvent.clientX - sentX;
  61. var slideTop = oEvent.clientY - sentY;
  62. if(slideLeft <= l){
  63. slideLeft = l;
  64. }
  65. if(slideLeft >= r){
  66. slideLeft = r;
  67. }
  68. if(slideTop <= t){
  69. slideTop = t;
  70. }
  71. if(slideTop >= b){
  72. slideTop = b;
  73. }
  74. obj.style.left = slideLeft + 'px';
  75. obj.style.top = slideTop + 'px';
  76. document.getElementById('posTop').innerHTML = slideTop;
  77. document.getElementById('posLeft').innerHTML = slideLeft;
  78. };
  79. document.onmouseup = function (){
  80. document.onmousemove = null;
  81. document.onmouseup = null;
  82. }
  83. return false;
  84. }
  85. }
  86. </script>
  87. </head>
  88. <body>
  89. <div id="parent">
  90. <div id="div1" οnmοusemοve="posMove(this.id)"></div>
  91. </div>
  92. <div class="postText">
  93. 移动的距离Top:<span id="posTop"></span>Left:<span id="posLeft"></span>
  94. </div>
  95. </body>
  96. </html>

效果如下:

20180519211519184

补充一点:

js获取div相对于浏览器的x轴、y轴的数据:

  1. Firefox和其他浏览器使用event.pageX和event.pageY;
  2. IE使用event.clientX和event.clientY;

event对象是全局的,存储在window.event中。

发表评论

表情:
评论列表 (有 0 条评论,452人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaScript 效果实现

      我们在访问一些网站时,会发现有些内容是可以拖拽的,比较方便,那么使用JS怎么实现呢?今天结合代码展示下拖拽效果的实现。  这里需要先熟悉下几个JS事件: onmouse