本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(8)

JavaScript之offset实现鼠标坐标获取和窗口内模块拖动-案例演示

发布于2021-05-30 07:08     阅读(833)     评论(0)     点赞(6)     收藏(4)


offset

offset 即偏移量,使用 offset 系列相关属性可以 动态的 获取该元素的位置(偏移)、大小等,如:
元素距离带有定位父元素的位置
获取元素自身的大小(宽度高度)
注:返回的数值不带单位

offset 系列常用的属性包括:
    element.offsetParent
    返回作为该元素带有定位的父级元素,如果父级元素没有定位,则返回 body
    注意,parentNode 和 offsetParent 还是有本质上的区别的:parentNode 返回的是直接父级元素,offsetParent 返回的是带有定位的父级元素。
    element.offsetTop
    返回元素带有定位父元素上方的偏移
    element.offsetLeft
    返回元素带有定位父元素左边框的偏移
    element.offsetWidth
    返回自身包括 padding, 边框, 内容区的宽度,返回数值不带单位
    element.offsetHeight
    返回自身包括 padding, 边框, 内容区的高度,返回数值不带单位

offset 和 style 的区别

offsetstyle
offset 可以得到任意样式表中的样式值style 只能得到行内样式表中的样式值,无法获得内嵌样式
offset 系列获得的数值是没有单位的style.width 获得的是带有单位的字符串
offsetWidth 包含 padding+border+widthstyle.width 获得不包含 padding 和 border 的值
offsetWidth 等属性是只读属性,只能获取不能赋值style 属性是可读写属性,style.width 可以获取也可以赋值
只想要获取元素大小位置的时候,用 offset 更合适要对元素样式进行修改的话,使用 style 更合适

案例一:实时展示鼠标的坐标-演示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>鼠标位置获取-01</title>
  8. <style>
  9. .box {
  10. width: 500px;
  11. height: 500px;
  12. background-color: #55aaff;
  13. margin-left: 50px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <p>获取鼠标在盒子内坐标</p>
  19. <div class="box"></div>
  20. <script>
  21. // 在盒子中点击,想要获得鼠标距离盒子左右的距离
  22. // 实现:
  23. // 1. 获得鼠标在页面中的坐标,e.pageX, e.pageY
  24. // 2. 获得盒子到页面中的距离, box.offsetLeft, box.offsetTop
  25. // 3. 两者相减就能够获得鼠标在盒子中的坐标
  26. // 下面看实现过程吧!
  27. const box = document.querySelector(".box");
  28. box.addEventListener("mousemove", function(e) {
  29. // console.log(e.pageX, e.pageY);
  30. // console.log(box.offsetLeft, box.offsetTop);
  31. const x = e.pageX - this.offsetLeft;
  32. const y = e.pageY - this.offsetTop;
  33. box.textContent = `x: ${x}, y: ${y}`;
  34. });
  35. </script>
  36. </body>
  37. </html>

案例二:拖动模块-演示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>模块拖动-02</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .login,
  14. .modal {
  15. display: none;
  16. }
  17. .login {
  18. width: 512px;
  19. height: 280px;
  20. position: fixed;
  21. border: #ebebeb solid 1px;
  22. left: 50%;
  23. top: 50%;
  24. background-color: #fff;
  25. box-shadow: 0 0 20px #ddd;
  26. z-index: 999;
  27. transform: translate(-50%, -50%);
  28. text-align: center;
  29. }
  30. .modal {
  31. position: absolute;
  32. top: 0;
  33. left: 0;
  34. width: 100vw;
  35. height: 100vh;
  36. background-color: rgba(0, 0, 0, 0.3);
  37. z-index: 998;
  38. }
  39. .login-content {
  40. margin: 100px auto;
  41. text-align: center;
  42. }
  43. .login-content h3:hover,
  44. .closeBtn:hover {
  45. cursor: pointer;
  46. }
  47. .closeBtn {
  48. position: absolute;
  49. right: 10px;
  50. top: 10px;
  51. }
  52. .login h4 {
  53. margin-top: 10px;
  54. }
  55. .login h4:hover {
  56. cursor: move;
  57. }
  58. </style>
  59. </head>
  60. <body>
  61. <div class="login-content">
  62. <h3 id="openLogin">点击弹出模拟框</h3>
  63. </div>
  64. <div class="login">
  65. <div class="closeBtn" id="closeBtn">关闭</div>
  66. <h4 class="loginHeader">点击我拖动吧</h4>
  67. </div>
  68. <div class="modal"></div>
  69. <script>
  70. // 获取元素
  71. const login = document.querySelector(".login");
  72. const modal = document.querySelector(".modal");
  73. const closeBtn = document.querySelector("#closeBtn");
  74. const openLogin = document.querySelector("#openLogin");
  75. // 点击显示元素
  76. openLogin.addEventListener("click", () => {
  77. modal.style.display = "block";
  78. login.style.display = "block";
  79. });
  80. closeBtn.addEventListener("click", () => {
  81. modal.style.display = "none";
  82. login.style.display = "none";
  83. });
  84. // 实现拖拽移动功能
  85. // 1. 鼠标按下获得鼠标在盒子内的坐标
  86. const loginHeader = document.querySelector(".loginHeader");
  87. loginHeader.addEventListener("mousedown", function (e) {
  88. const x = e.pageX - login.offsetLeft;
  89. const y = e.pageY - login.offsetTop;
  90. const move = function (e) {
  91. login.style.left = `${e.pageX - x}px`;
  92. login.style.top = `${e.pageY - y}px`;
  93. };
  94. // 2. 移动鼠标
  95. document.addEventListener("mousemove", move);
  96. document.addEventListener("mouseup", function () {
  97. document.removeEventListener("mousemove", move);
  98. });
  99. });
  100. </script>
  101. </body>
  102. </html>

 




所属网站分类: 技术文章 > 博客

作者:小猪佩奇身上纹

链接:http://www.qianduanheidong.com/blog/article/115767/af61f34cc1ce6dfd86aa/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)