关于offsetParent
不知道有多少人知道JavaScript中有offsetParent这么个属性。
关于offsetParent,我最开始见到他,是在《JavaScript高级程序设计(第3版)》第321页,介绍元素大小—偏移量,引申出来的。看一下具体内容:
offsetLeft和offsetTop属性与包含元素有关,包含元素的引用保存在offsetParent属性中。
offsetParent属性不一定与parentNode的值相等。
例如:td元素的offsetParent是作为其祖先元素的table元素,因为table是在DOM层次中距td最近的一个具有大小的元素。
我的第一反应,也就是大多数情况下,offsetParent与parentNode是相等的,为了验证收结果,特意写了个demo来进行测试,其实主要的目的是测试offsetLeft和offsetTop的,offsetParent只能说是个顺带产品。
<div class="closest">
<div class="pr">
<div id="test">offsetLeft和offsetTop属性与包含元素有关,包含元素的引用保存在offsetParent属性中。</div>
</div>
</div>
当然,是没有写任何css的。
var current = document.querySelector("#test");
console.log(current.offsetLeft, current.offsetParent)
当我打开控制台,查看结果时:发现了一个令人尴尬无比的结果,current.offsetParent居然返回了body,苍天啊,你怎么就返回body了?
不得已,去到MDN查询一下吧!

原来是“定位元素”,这才是结果吧!
也就是说,他沿着当前元素,向祖先元素查找,一直找到一个position属性有定义,并且不为static的祖先元素。
注意事项:1、如果当前元素或者其祖先元素,有设置属性:display:none;则offsetParent返回null。
2、如果当前元素有设置属性: position:fixed也返回null。
既然能够明白offsetParent了,当然就顺带引申出了一个小需求:获取当前元素,距离页面顶部(左侧)的距离。
那我们就来做一个简单的封装吧!
function getElemOffset(elem) {
var offset = {
left: elem.offsetLeft,
top: elem.offsetTop
}
var parent = elem.offsetParent;
while (parent != null) {
offset.left += parent.offsetLeft;
offset.top += parent.offsetTop;
parent = parent.offsetParent;
}
return offset;
}
调用的时候,直接将当前元素当做参数传入getElemOffset即可。
关于offsetParent的更多相关文章
- offsetParent的解释
offsetParent是个只读属性,返回最近显示指定位置的容器元素的父级.如果元素没有指定位置,最近的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent off ...
- 深入理解定位父级offsetParent及偏移大小
前面的话 偏移量(offset dimension)是javascript中的一个重要的概念.涉及到偏移量的主要是offsetLeft.offsetTop.offsetHeight.offsetWid ...
- javascrip中parentNode和offsetParent之间的区别
首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...
- JavaScript获取浏览器高度和宽度值(documentElement,clientHeight,offsetHeight,scrollHeight,scrollTop,offsetParent,offsetY,innerHeight)
IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...
- offsetParent详解
offsetParent与parentNode一样,都是获取父节点,但是offsetParent却有很大的不同之处: offsetParent找有定位的父节点,没有定位默认是body,ie7以下定位在 ...
- jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position
定位应用:点击一个按钮,然后在按钮的右边弹出一个提示框 1,提示框相对于屏幕进行定位,那么使用offset来取得当前按钮相对于body的top和left,然后通过$('body').prepend(t ...
- DOM之parentNode与offsetParent
DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...
- offsetleft、offsetTop、offsetParent的兼容性问题
先来看看offsetParent返回的是什么值 ele.offsetParent返回的是ele元素最近的并且是定位过(relative,absolute)的父元素,如果没有父元素或者是父元素中没有一个 ...
- parentNode,offsetParent
元素.parentNode : 父节点 只读 属性 当前节点的父级节点 没有兼容性问题 可放心使用 <!DOCTYPE HTML> <html> <head> ...
- js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装
1. offsetParent 获取的最近的定位的父元素 offsetLeft/offsetTop 是相对于offsetParent的距离 offsetHeight/offsetWidth 获 ...
随机推荐
- haxe相关的计划安排
用多少写多少.先从入门开始,再到怎么写DSL解析器.最后自举(只是做个示范而已 在深入haxe的过程中,多少会跟typescript有交集,这些会边走边总结. 因为只是for example,所以这个 ...
- webpack常用插件配置记录
github仓库:https://github.com/llcMite/webpack.git 1)html-webpack-plugin (用于模板生成html,自动引入output文件) c ...
- Charles设置HTTPS抓包
1. 配置 Charles 根证书 点击 Help -> SSL Proxying -> Install Charles Root Certificate 之后会弹出钥匙串,如果不弹出,请 ...
- vuex-Module
Vuex 允许将 store 分割成模块(module). 每个模块拥有自己的 state.mutation.action.getter.甚至是嵌套子模块 const moduleA = { stat ...
- linux 服务发布脚本升级,远程发布,指定拉取远程dev,test等分支代码
1.本地发布脚本 publish.sh #!/bin/sh currentDay=`date +%Y%m%d` currentTime=`date +%Y%m%d%H%M%S` tomcat1=/da ...
- Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)
题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...
- 基于Verilog的串口发送程序
一.模块框图及基本思路 tx_bps_module:波特率时钟产生模块 tx_control_module:串口发送的核心控制模块 tx_module:前两个模块的组合 control_module: ...
- Python 管道
from multiprocessing import Process,Pipe def f1(conn): from_zhujincheng = conn.recv() print("我是 ...
- U-Boot shell脚本语法
/********************************************************************** * U-Boot shell脚本语法 * 说明: * 之 ...
- WEBBASE篇: 第八篇, JavaScript知识2
JavaScript 2 一,数据类型: 作用: 约束了数据在内存中所占空间大小问题的: JS数据类型分类: 基本数据类型(值类型) (1) number 类型: 数字类型,可以表示32位的整数或64 ...