不知道有多少人知道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. Android开发 ---Media

    1.ctivity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  2. 面向对象编程其实很简单--python面向对象(初级篇)

    出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...

  3. noj快排

    1003.快速排序 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 给定一个数列,用快速排序算法把它排成升序.   输入 第一行是一个整数n(n不大于10000),表示要排序 ...

  4. react 调用webIm

    记录下遇到的问题,之前引用腾讯云的webim,一直出错,现在改好了, 引用了, 以上是在public下的index.html引用, 但是在子模块console.log(webim);会报这个错 解决也 ...

  5. js--函数声明和函数表达式--执行顺序

    思考: notice:在写JS代码的时候,有两种写法,一种是函数表达式,另外一种是函数声明方式.我们需要重点注意的是,只有函数声明形式才能被提升. function hoistFunction() { ...

  6. Windows系统,Tensorflow的Tensorboard工具细节问题

    随着跟着TensorFlow视频学习,学到Tensorboard可视化工具这里的时候. 在windows,cmd里面运行,tensorboard --logdir=你logs文件夹地址  这行代码,一 ...

  7. 五分钟带你走入MP

    一.MyBatis-Plus简介 1.1MyBatis-Plus是什么? MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化 ...

  8. LeetCode - Maximum Frequency Stack

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  9. Linq分组查询统计

    这里介绍Linq使用Group By和Count得到每个CategoryID中产品的数量,Linq使用Group By和Count得到每个CategoryID中断货产品的数量等方面. 学经常会遇到Li ...

  10. Python hashlib and hmac

    hashlib hashlib提供了常用的摘要算法:MD5, SHA1等等 摘要算法:也成哈希算法,散列算法.通过一个函数把任意长度的数据转换成一个长度固定的数据串.主要用在存储一些不能被修改和查看的 ...