不知道有多少人知道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的更多相关文章

  1. offsetParent的解释

    offsetParent是个只读属性,返回最近显示指定位置的容器元素的父级.如果元素没有指定位置,最近的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent off ...

  2. 深入理解定位父级offsetParent及偏移大小

    前面的话 偏移量(offset dimension)是javascript中的一个重要的概念.涉及到偏移量的主要是offsetLeft.offsetTop.offsetHeight.offsetWid ...

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

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

  4. JavaScript获取浏览器高度和宽度值(documentElement,clientHeight,offsetHeight,scrollHeight,scrollTop,offsetParent,offsetY,innerHeight)

    IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...

  5. offsetParent详解

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

  6. jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position

    定位应用:点击一个按钮,然后在按钮的右边弹出一个提示框 1,提示框相对于屏幕进行定位,那么使用offset来取得当前按钮相对于body的top和left,然后通过$('body').prepend(t ...

  7. DOM之parentNode与offsetParent

    DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...

  8. offsetleft、offsetTop、offsetParent的兼容性问题

    先来看看offsetParent返回的是什么值 ele.offsetParent返回的是ele元素最近的并且是定位过(relative,absolute)的父元素,如果没有父元素或者是父元素中没有一个 ...

  9. parentNode,offsetParent

    元素.parentNode : 父节点   只读 属性 当前节点的父级节点 没有兼容性问题 可放心使用 <!DOCTYPE HTML> <html> <head> ...

  10. js-特效部分学习-offsetParent、scrollHeight 、动画函数的封装

    1. offsetParent  获取的最近的定位的父元素   offsetLeft/offsetTop  是相对于offsetParent的距离 offsetHeight/offsetWidth 获 ...

随机推荐

  1. python 文件读写时用open还是codecs.open

    当我面有数据需要保存时,第一时间一般会想到写到一个txt文件中,当然,数据量比较大的时候还是写到数据库比较方便管理,需要进行网络传输时要序列化,json化.下面主要整理一下平时用的最多的写入到文件中, ...

  2. 第一个Spring 程序

    一 搭建好开发环境 JDK Eclipse 等 二 下载jar包 https://commons.apache.org/logging/ https://repo.spring.io/release/ ...

  3. 1.配置OpenCV开发环境VS2010

  4. Codeforces Round #324 (Div. 2) (哥德巴赫猜想)

    题目:http://codeforces.com/problemset/problem/584/D 思路: 关于偶数的哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和. 关于奇数的哥德巴赫猜想:任一 ...

  5. js 查找当前元素/this

    function findTabTitle(pageId) { var $ele = null; $(".page-tabs-content").find("a.menu ...

  6. sed语法2

    sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的.在shell中,使用sed来批量修改文本内容是非常方便的. sed命令的选项 sed ...

  7. java.io.IOException: Could not delete path 'D:\mycode\reactnative\SecondTest\android\app\build\generated\source\r \release\android\support\v7

    问题解决 直观上看是没有删除某个文件,产生的IOException异常,实际上是因为上次编译导致的缓存没有清空导致的. 进入到android目录下运行下面代码清除上次打包时的缓存: ./gradlew ...

  8. escu问题及解决

    ************************************************************** Qt 出现“undefined reference to `vtable ...

  9. linux权限相关操作

    Linux权限管理是Linux中一个十分重要的概念,也是系统安全性的重要保障.这里主要介绍Linux的基本权限和默认权限,通过理论讲解与实验演示,可以详细了解到权限的相关操作及其重要性. 文件权限 [ ...

  10. Cortex-M3 跳转到指定bin执行

    跳转前指定sp和msp: #if defined(__GNUC__) __attribute__(( naked )) static void set_sp(unsigned long addr) { ...