JavaScript offset实现鼠标坐标获取和窗口内模块拖动


Posted in Javascript onMay 30, 2021

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 更合适

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

演示

JavaScript offset实现鼠标坐标获取和窗口内模块拖动

<!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>

案例二:拖动模块

演示

JavaScript offset实现鼠标坐标获取和窗口内模块拖动

<!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鼠标坐标获取和窗口内模块拖动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
使弱类型的语言JavaScript变强势
Jun 22 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
Vue.js第四天学习笔记(组件)
Dec 02 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 Javascript
vue项目开启Gzip压缩和性能优化操作
Oct 26 Javascript
React Native项目框架搭建的一些心得体会
May 28 #Javascript
使用react-virtualized实现图片动态高度长列表的问题
May 28 #Javascript
element多个表单校验的实现
May 27 #Javascript
springboot+VUE实现登录注册
May 27 #Vue.js
vue+springboot实现登录验证码
vue+spring boot实现校验码功能
May 27 #Vue.js
vue-cropper组件实现图片切割上传
May 27 #Vue.js
You might like
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
pycharm 使用心得(五)断点调试
2014/06/06 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
努比亚手机官网:nubia
2016/10/06 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
delegate与普通函数的区别
2014/01/22 面试题
普通员工辞职信
2014/01/17 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
服务行业演讲稿
2014/09/02 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
指导老师鉴定意见
2015/06/05 职场文书
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python