offsetParent用的最普遍的就是来计算元素在页面中的位置,前面的日志理讲了 通过getBoundingClientRect() 来获取页面中元素的位置,不过这只支持最新的浏览器,如果要兼容像Opera9.2和Firefox2以及Safair任何版本都只能通过offsetParent该属性来循环获计算获得元素的位置,效率不太好。贴一段缩减了来自YUI里的代码:

function getElementXY(el){ //el 要获取位置的元素对象
var pos = [el.offsetLeft, el.offsetTop]; //首先获得该元素相对第一个非流布局父元素的位置
var parentNode = el.offsetParent; //获得该元素的第一个非流布局父元素
if (parentNode != el) {
while (parentNode) {
pos[0] += parentNode.offsetLeft;
pos[1] += parentNode.offsetTop;
parentNode = parentNode.offsetParent; //循环定义非流布局父元素
}
}
}

MSDN解释offsetParent在大多时候返回的是Body,其实是返回第一个非流布局的父级元素,也就是postion的值是 absolute,relative,fixed,(inherit 继承父元素也是前三者)其中之一,当然如果父级元素都是流布局最后返回的肯定是Body,由此可见offsetParent本身在获取的时候要通过页面不断查找父元素,尤其在代码多层嵌套的时候,需要向上查找未知的层次,直到获取到第一个非流布局元素。

offsetLeft和offsetTop分别返回相对offsetParent的位置,也就是返回相对第一个非流布局父级元素的位置。

上面的代码可以看出这个方法是通过不断循环获得相对非流布局父元素的位置相加来最后计算得到要获取的位置。

IE7对offsetParent解释有个BUG,貌似始终返回父元素。

parentNode就不用解释了,父节点。

实验:

<body>
<div id="div1">
div1
<div id="div3">
<div id="div2">
div2
</div>
</div>
</div> </body>
#div1{
position:relative;
width:300px;
height:300px;
border:1px solid red;
}
#div2{
position:absolute;
top:20px;
width:200px;
height:100px;
background:#ccc;
}

var obj=document.getElementById("div2");
console.log(obj.parentNode); //输出: div#div3
console.log(obj.offsetParent); //输出:div#div1.

可以看到,parentNode只是返回表面意义上的节点,而offsetParent则返回该节点相对定位的containing block。

body元素

document.body.parentNode 为html。

document.body.offsetParent 为null。

参考了:http://www.cnblogs.com/qieqing/archive/2008/10/06/1304614.html

offsetParent和parentNode区别的更多相关文章

  1. javascrip中parentNode和offsetParent之间的区别

    首先是 parentNode 属性,这个属性好理解,就是在 DOM 层次结构定义的上下级关系,如果元素A包含元素B,那么元素B就可以通过 parentElement 属性来获取元素A. 要明白 off ...

  2. DOM创建节点

    1.DOM--document object model 常用的节点类型: 元素节点:(标签) 属性节点:(标签里的属性) 文本节点:(文本节点) 2,document有个属性叫nodetype,返回 ...

  3. offsetParent详解

    offsetParent与parentNode一样,都是获取父节点,但是offsetParent却有很大的不同之处: offsetParent找有定位的父节点,没有定位默认是body,ie7以下定位在 ...

  4. 关于offsetParent

    不知道有多少人知道JavaScript中有offsetParent这么个属性. 关于offsetParent,我最开始见到他,是在<JavaScript高级程序设计(第3版)>第321页, ...

  5. DOM

    DOM:Document Object Model 文档对象模型文档:html页面文档对象:页面中的元素文档对象模型:定义为了能够让程序(js)去操作页面中的元素DOM会把文档看作是一棵树docume ...

  6. scrollWidth,offsetWidth,clientWidth,width;scrollHeight,offsetHeight,clientHeight,height;offsetTop,scrollTop,top;offsetLeft,scrollLeft,left还有谁

    题中的那么多属性让人头都大了,他们到底是什么意思?不同浏览器的实现是一样的吗?以下所有结论来自chrome版本 53.0.2785.89 (64-bit)和firefox版本52.0.2,操作系统ub ...

  7. offset系列,client系列,scroll系列回顾

    一 scroll系列属性      ——滚动

  8. js ·节点的知识点

    1. DOM document object model (1) 节点树状图 Document>documentElement>body>tagname 2. 我们常用的节点类型 元 ...

  9. 11-14 dom

    1.DOM document object model (1) 节点树状图:Document>documentElement>body>tagname 2.我们常用的节点类型 元素节 ...

随机推荐

  1. PHP扩展开发之PHP的启动与终止

    PHP程序的启动可以看做是两个概念上的启动,终止也有两个概念上的终止.其中一个是PHP作为Apache(拿它举例,板砖勿扔)的一个模块的启动与终止, 这次启动php会初始化一些必要数据,比如与宿主Ap ...

  2. ssh username@10.2.1.23无法连接

    ssh username@10.2.1.23无法连接 经过排查各种openSSH版本等,最终因为两个机器不是一个段(A:255.255.0.0 B:255.255.255.0)造成的. 关于IP需要以 ...

  3. 使用PHP自动部署GIT代码

    最近在使用Coding的代码托管,顺便设置了WebHook自动部署,过程还是挺艰辛的,主要还是没搞懂Linux的权限控制,不过好在弄好了,分享一下获益最深的一篇文章,供大家参考,原文是英文版的,我的英 ...

  4. C++ 前置声明 和 包含头文件 如何选择

    假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1 ...

  5. 仿制的ActivityIndicatorView

    仿制Github上CSS3效果制作的几个简单的ActivityIndicator,复习一下IOS动画操作. 原效果连接:https://github.com/tobiasahlin/SpinKit 代 ...

  6. 跟我开发NSP(网上查询平台):如何选择开发项目

    我想通过一个真实的项目开发的全过程,记录一下开发过程的点点滴滴,记录一下过程中的前思后想.这个全过程包括,如何选择项目.如何分析项目.如何组织项目开发.如何设计开发流程.如何设计软件的总体架构.如何建 ...

  7. Java的Git管理工具Gitblit

    From:http://www.oschina.net/p/gitblit Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库.相当于 Git 的 Java 管理工具. 下载地 ...

  8. CDOJ 631 敢说敢做 记忆化搜索and动规

    //跟沈爷学的 传送门http://www.cnblogs.com/Xiper/p/4639636.html #include<cstdio> #include<iostream&g ...

  9. 命令行解释器(shell)

    unix> ./hello hello world unix> ll 显示当前目录下文件信息. shell为命令行解释器,第一个单词可以是内置的外壳命令,也可以是一个可执行文件名.

  10. oracle表空间创建及管理

    一.数据文件和数据库逻辑存储结构: 一个表空间包含一个或多个数据文件,一个表空间包含一个或多个段,一个段包含一个或多个区,一个区包含一个或多个连续的数据库块,一个数据库块包含一个或多个操作系统块.段是 ...