JavaScript offset實現鼠標坐標獲取和窗口內模塊拖動

offset

offset 即偏移量,使用 offset 系列相關屬性可以 動態的 獲取該元素的位置(偏移)、大小等,如:
元素距離帶有定位父元素的位置
獲取元素自身的大小(寬度高度)
註:返回的數值不帶單位

offset 系列常用的屬性包括:
    element.offsetParent
    返回作為該元素帶有定位的父級元素,如果父級元素沒有定位,則返回 body
    註意,parentNode 和 offsetParent 還是有本質上的區別的:parentNode 返回的是直接父級元素,offsetParent 返回的是帶有定位的父級元素。
    element.offsetTop
    返回元素帶有定位父元素上方的偏移
    element.offsetLeft
    返回元素帶有定位父元素左邊框的偏移
    element.offsetWidth
    返回自身包括 padding, 邊框, 內容區的寬度,返回數值不帶單位
    element.offsetHeight
    返回自身包括 padding, 邊框, 內容區的高度,返回數值不帶單位

offset 和 style 的區別

offset style
offset 可以得到任意樣式表中的樣式值 style 隻能得到行內樣式表中的樣式值,無法獲得內嵌樣式
offset 系列獲得的數值是沒有單位的 style.width 獲得的是帶有單位的字符串
offsetWidth 包含 padding+border+width style.width 獲得不包含 padding 和 border 的值
offsetWidth 等屬性是隻讀屬性,隻能獲取不能賦值 style 屬性是可讀寫屬性,style.width 可以獲取也可以賦值
隻想要獲取元素大小位置的時候,用 offset 更合適 要對元素樣式進行修改的話,使用 style 更合適

案例一:實時展示鼠標的坐標

演示

<!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>鼠標位置獲取-01</title>
		<style>
			.box {
				width: 500px;
				height: 500px;
				background-color: #55aaff;
				margin-left: 50px;
			}
		</style>
	</head>
	<body>
		<p>獲取鼠標在盒子內坐標</p>
		<div class="box"></div>
		<script>
			// 在盒子中點擊,想要獲得鼠標距離盒子左右的距離
			// 實現:
			// 1. 獲得鼠標在頁面中的坐標,e.pageX, e.pageY
			// 2. 獲得盒子到頁面中的距離, box.offsetLeft, box.offsetTop
			// 3. 兩者相減就能夠獲得鼠標在盒子中的坐標
			// 下面看實現過程吧!
			const box = document.querySelector(".box");
			box.addEventListener("mousemove", function(e) {
				// console.log(e.pageX, e.pageY);
				// console.log(box.offsetLeft, box.offsetTop);
				const x = e.pageX - this.offsetLeft;
				const y = e.pageY - this.offsetTop;
				box.textContent = `x: ${x}, y: ${y}`;
			});
		</script>
	</body>
</html>

案例二:拖動模塊

演示

<!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>模塊拖動-02</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .login,
      .modal {
        display: none;
      }
      .login {
        width: 512px;
        height: 280px;
        position: fixed;
        border: #ebebeb solid 1px;
        left: 50%;
        top: 50%;
        background-color: #fff;
        box-shadow: 0 0 20px #ddd;
        z-index: 999;
        transform: translate(-50%, -50%);
        text-align: center;
      }
      .modal {
        position: absolute;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        background-color: rgba(0, 0, 0, 0.3);
        z-index: 998;
      }
      .login-content {
        margin: 100px auto;
        text-align: center;
      }
      .login-content h3:hover,
      .closeBtn:hover {
        cursor: pointer;
      }
      .closeBtn {
        position: absolute;
        right: 10px;
        top: 10px;
      }
      .login h4 {
        margin-top: 10px;
      }
      .login h4:hover {
        cursor: move;
      }
    </style>
  </head>
  <body>
    <div class="login-content">
      <h3 id="openLogin">點擊彈出模擬框</h3>
    </div>
    <div class="login">
      <div class="closeBtn" id="closeBtn">關閉</div>
      <h4 class="loginHeader">點擊我拖動吧</h4>
    </div>
    <div class="modal"></div>
    <script>
      // 獲取元素
      const login = document.querySelector(".login");
      const modal = document.querySelector(".modal");
      const closeBtn = document.querySelector("#closeBtn");
      const openLogin = document.querySelector("#openLogin");
      // 點擊顯示元素
      openLogin.addEventListener("click", () => {
        modal.style.display = "block";
        login.style.display = "block";
      });
      closeBtn.addEventListener("click", () => {
        modal.style.display = "none";
        login.style.display = "none";
      });
      // 實現拖拽移動功能
      // 1. 鼠標按下獲得鼠標在盒子內的坐標
      const loginHeader = document.querySelector(".loginHeader");
      loginHeader.addEventListener("mousedown", function (e) {
        const x = e.pageX - login.offsetLeft;
        const y = e.pageY - login.offsetTop;
        const move = function (e) {
          login.style.left = `${e.pageX - x}px`;
          login.style.top = `${e.pageY - y}px`;
        };
        // 2. 移動鼠標
        document.addEventListener("mousemove", move);
        document.addEventListener("mouseup", function () {
          document.removeEventListener("mousemove", move);
        });
      });
    </script>
  </body>
</html>

到此這篇關於JavaScript offset實現鼠標坐標獲取和窗口內模塊拖動的文章就介紹到這瞭,更多相關JavaScript鼠標坐標獲取和窗口內模塊拖動內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: