元素偏移量offset系列
1.1 offset概述
offset翻译过来,就是偏移量,我们使用offset系列相关属性,可以动态的得到该元素的位置(偏移)、大小等。
- 获取元素距离带有定位父元素的位置。
 - 获得元素自身的大小(宽度高度)。
 - 注意: 返回的数值都不带单位。
 
offset系列常用属性:
| offset系列属性 | 作用 | 
| element.offsetParent | 返回作为该元素带有定位的父级,如果父级都没有定位,则返回body | 
| element.offsetTop | 返回元素相对带有定位父元素上方的偏移 | 
| element.offsetLeft | 返回元素相对带有定位父元素左边框的偏移 | 
| element.offsetWidth | 返回自身包括padding、边框、内容区的宽度,返回数值不带单位 | 
| element.offsetHeight | 返回自身包括padding、边框、内容区的高度,返回数值不带单位 | 
1.2 offset与style区别
| offset | style | 
| offset可以得到任意样式表中的样式值 | style只能得到行内样式表的样式值 | 
| offset系列获得的数值是没有单位的 | style.width获得的是带有单位的字符串 | 
| offsetWIdth包含padding+border+width | style.width获得不包含padding和border的值 | 
| offsetWidth等属性是只读属性,只能获取不能赋值 | style.width是可读写属性,可以获取也可以赋值 | 
| 所以,我们想要获取元素大小位置,用offset更合适 | 所以,我么想要给元素更改值,则需要用style改变 | 
1.3 拖拽模态框
案例分析:
1.点击弹出层,模态框和遮罩层就会显示出来display:block;
2.点击关闭按钮,模态框和遮罩层就会隐藏起来display:none;
3.在页面中拖拽的原理:鼠标按下并且移动,之后松开鼠标;
4.触发事件是鼠标按下mousedown,鼠标移动mousemove,鼠标松开mouseup;
5.拖拽过程:鼠标移动过程中,获得最新的值赋值给模态框的left和top值,这样模态框就可以跟着鼠标走了;
6.鼠标按下触发的事件源是最上面一行,就是id为title
7.鼠标的坐标减去鼠标在盒子里的坐标,才是模态框真正的位置。
1 <div class="login-header"><a id="link" href="javascript:;">点击,弹出登录框</a></div>
2 <div id="login" class="login">
3 <div id="title" class="login-title">登录会员
4 <span><a id="closeBtn" href="javascript:void(0);" class="close-login">关闭</a></span>
5 </div>
6 <div class="login-input-content">
7 <div class="login-input">
8 <label>用户名:</label>
9 <input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">
10 </div>
11 <div class="login-input">
12 <label>登录密码:</label>
13 <input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">
14 </div>
15 </div>
16 <div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登录会员</a></div>
17 </div>
18 <!-- 遮盖层 -->
19 <div id="bg" class="login-bg"></div>
20
21 <script>
22 // 获取元素
23 var login = document.querySelector('.login');
24 var mask = document.querySelector('.login-bg');
25 var link = document.querySelector('#link');
26 var closeBtn = document.querySelector('#closeBtn');
27 var title = document.querySelector('#title');
28 // 2.点击弹出层这个链接link,让mask和login显示出来
29 link.addEventListener('click', function(){
30 mask.style.display = 'block';
31 login.style.display = 'block';
32 });
33 // 3. 点击closeBtn就隐藏mask和login
34 closeBtn.addEventListener('click', function() {
35 mask.style.display = 'none';
36 login.style.display = 'none';
37 });
38 // 4.开始拖拽
39 // (1)当我们鼠标按下,就获得鼠标在盒子里的坐标
40 title.addEventListener('mousedown', function(e){
41 var x = e.pageX - login.offsetLeft;
42 var y = e.pageY - login.offsetTop;
43 // (2)鼠标移动的时候,把鼠标在页面的坐标,减去鼠标在盒子里的坐标,就是模态框的left和top
44 document.addEventListener('mousemove', move);
45 function move(e) {
46 login.style.left = e.pageX - x + 'px';
47 login.style.top = e.pageY - y + 'px';
48 };
49 // 鼠标弹起,就让鼠标移动事件移除
50 document.addEventListener('mouseup', function() {
51 document.removeEventListener('mousemove' , move)
52 })
53 })
54 </script>
京东放大镜效果:
 1 window.addEventListener('load', function() {
 2     var preview_img = document.querySelector('.preview_img');
 3     var mask = document.querySelector('.mask');
 4     var big = document.querySelector('.big');
 5     // 1.当我们鼠标经过preview_img就显示和隐藏mask遮罩层和big大盒子
 6     preview_img.addEventListener('mouseover', function() {
 7         mask.style.display = 'block';
 8         big.style.display = 'block';
 9     });
10     preview_img.addEventListener('mouseout', function() {
11         mask.style.display = 'none';
12         big.style.display = 'none';
13     });
14     // 2.鼠标移动的时候,让黄色盒子跟着鼠标来走
15     preview_img.addEventListener('mousemove', function(e) {
16         // (1).先计算出鼠标在盒子里的坐标
17         var x = e.pageX - this.offsetLeft;
18         var y = e.pageY - this.offsetTop;
19         // (2).减去盒子高度 300的一半 是150就是我们mask的最终 left和top值了
20         // (3).我们mask移动的距离
21         var maskX = x - mask.offsetWidth / 2;
22         var maskY = y - mask.offsetHeight / 2;
23         // (4). 如果x坐标小于0, 就让他停在0的位置
24         // 遮罩层的最大移动距离
25         var maskMax = preview_img.offsetWidth - mask.offsetWidth;
26         if(maskX <= 0) {
27             maskX = 0;
28         } else if (maskX >= maskMax) {
29             maskX = maskMax;
30         }
31         if (maskY <= 0) {
32             maskY = 0;
33         } else if (maskY >= maskMax) {
34             maskY = maskMax;
35         }
36         mask.style.left = maskX + 'px';
37         mask.style.top = maskY + 'px';
38         // 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
39         var bigImg = document.querySelector('.bigImg');
40         // 大图片的移动距离
41         var bigMax = bigImg.offsetHeight - big.offsetWidth;
42         // 大图片的移动距离
43         var bigX = maskX * bigMax / maskMax;
44         var bigY = maskY * bigMax / maskMax;
45         bigImg.style.left = -bigX + 'px';
46         bigImg.style.top = -bigY + 'px';
47     })
48 })
元素偏移量offset系列的更多相关文章
- 元素偏移量 offset 系列
		
offset 概述 offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移).大小等. 获得元素距离带有定位父元素的位置 获得元素自身的大小(宽度高度) 注意 ...
 - 模态框拖拽案例分析--元素偏移量 offset 系列
		
弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...
 - jq获取元素偏移量offset()
		
解释: 1 获取匹配元素在当前视口的相对偏移. 2 返回的对象包含两个整型属性:top 和 left demo1: 获取top与left var aaa = $(".aaa "); ...
 - jacascript 偏移量offset、客户区client
		
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 偏移量 偏移量(offset dimension)是 javascript 中的一个重要的概念.涉及到偏移 ...
 - offset系列,client系列,scroll系列回顾
		
一 scroll系列属性 ——滚动
 - offset系列、scroll系列与client系列
		
offset系列: offsetLeft:获取元素距离最左边的距离,自身的margin包括在内,不包括自身的border offsetTop:获取元素距离最上边的距离,自身的margin包括在内,不包 ...
 - client系列、offset系列、scroll系列
		
一.client系列 clientWidth/clientHeight 是我们设置的宽和高加上内边距(没有边框) clientLeft/clientTop 就是我们设置的边框值 二.offset ...
 - 009 轮播图,offset系列
		
关于使用JS做轮播图,使用一个章节进行笔迹. 一:简单轮播图 1.程序 <!DOCTYPE html> <html lang="en"> <head& ...
 - offset系列属性
		
offset系列:获取元素的相关的样式属性的值 offsetwidth:获取元素的宽 offsetheight:获取元素的高 offsetleft:获取元素距离左边位置的值 offsettop;获取元 ...
 - js offset系列属性
		
offsetParent:返回该元素有定位的父级,如果父级都没有定位则返回body offsetTop:返回元素相对父级(带有定位的父级)上方的偏移 offsetLeft:返回元素相对父级(带有定位的 ...
 
随机推荐
- HarmonyOS第一课_构建更加丰富的页面
			
管理组件状态 概述 组件内的状态管理:@State 从父组件单向同步状态:@Prop 与父组件双向同步状态:@Link 跨组件层级双向同步状态:@Provide 和@Consume 概述 在应用中,界 ...
 - MongoDB的聚合笔记
			
1,聚合 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg(). 常用的表达式如上图. 1.1,aggregate 语法 语法: db.集合名称.aggregat ...
 - 单元测试框架pytest
			
1.什么是pytest pytest是一个非常成熟的全功能的Python测试框架,主要有以下特点: 简单灵活,容易上手,文档丰富 支持参数化,可以细粒度地控制要测试的测试用例 能够支持简单的单元测试和 ...
 - JWT简单使用
			
创建一个Maven项目,并导入jar包 <?xml version="1.0" encoding="UTF-8"?> <project xml ...
 - Python 实现HTML 转Word
			
之前文章分享过如何使用Spire.Doc for Python库将Word文档转为HTML格式,反过来,该库也能实现HTML到Word文档的转换.通过代码进行转换,避免了手动复制粘贴费时间,并且可能会 ...
 - STM32CubeMX教程1 工程建立
			
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
 - Java 并发编程(一)理论基础
			
与计算机基础相关的线程知识在此略过 线程安全性 相关的定义如下: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在代码中不需要任何额外的同步或者协同,这个类都能 ...
 - VsCode如何配置C语言环境?
			
以前学校上C语言课程都是使用VC++6.0上课,这个学期为了复习一遍C语言,而且自己经常使用VSCode开发前端项目,所以为了方便.这里把需要的环境和插件配置在这里介绍一下. Windows环境下安装 ...
 - MySQL篇:详解MySQL卸载-Windows版
			
MySQL篇:第一章_补_MySQL卸载(Windows版) 1. 停止MySQL服务 win+R 打开运行,输入 services.msc 点击 "确定" 调出系统服务. 2. ...
 - 带你认识大模型训练关键算法:分布式训练Allreduce算法
			
摘要:现在的模型以及其参数愈加复杂,仅仅一两张的卡已经无法满足现如今训练规模的要求,分布式训练应运而生. 本文分享自华为云社区<分布式训练Allreduce算法>,原文作者:我抽签必中. ...