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中的关于类型转换的性能优化
Dec 14 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
介绍JavaScript中Math.abs()方法的使用
Jun 14 Javascript
JS加载iFrame出现空白问题的解决办法
May 13 Javascript
常用的js验证和数据处理总结
Aug 02 Javascript
AngularJS实现ajax请求的方法
Nov 22 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
浅谈React和Redux的连接react-redux
Dec 04 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
koa2+vue实现登陆及登录状态判断
Aug 15 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
Jul 30 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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 和 HTML
2006/10/09 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
浅析vue-router原理
2018/10/19 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
wxPython实现文本框基础组件
2019/11/18 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
Pandas的Apply函数具体使用
2020/07/21 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
EJB3推出JPA的原因
2013/10/16 面试题
通信专业个人自我鉴定
2013/10/21 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
业务内勤岗位职责
2014/04/30 职场文书
最感人的道歉情书
2015/05/12 职场文书