不知道有多少人知道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. mysql数据库基础语句训练题

    ; -- ---------------------------- -- Table structure for course -- ---------------------------- DROP ...

  2. 高性能场景下,HashMap的优化使用建议

    1. HashMap 在JDK 7 与 JDK8 下的差别 顺便理一下HashMap.get(Object key)的几个关键步骤,作为后面讨论的基础. 1.1 获取key的HashCode并二次加工 ...

  3. Oracle 创建存储过程 提示权限不足或者提示表和视图不存在问题

    grant create view to hospital; --授予查询权限 grant select any table to hospital; --授予权限 grant select any ...

  4. resful

    一个完整的node resful api 一个更完整的项目 介绍

  5. 使用IDEA搭建Springboot+mybatis

    1.开发工具:Intellij idea2018.2 2.通过Spring Initializr建立项目,Project SDK选择本地的jdk就可以,我的是jdk1.8,之后点击next. 修改项目 ...

  6. Mondrian辅助组件----Schema WorkBench(架构平台简介)

    Schema WorkBech 是Pentaho套件的另一个组件,是mondrian中schema文件生成工具.通过Schema WorkBench我们可以快速生成一个schema文件,不再需要手写. ...

  7. 浅入浅出JDBC————1分钟了解JDBC

    一.了解基本的几个jdbc需要的类 1.1DriverManager类 DriverManager类是一个jdbc的驱动服务类.通常使用该类获得一个Connection对象,得到一个数据库的链接. 1 ...

  8. tofile和fromfile数组内建函数

    numpy教程:基本输入输出和文件输入输出Input and output 使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件.tofile输出的数据没有格式,因此用numpy ...

  9. Android开发中Activity状态的保存与恢复

    当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...

  10. 如何将docker镜像文件上传至Docker Hub

    一.Docker Hub中新建存储库 注册,登录Docker Hub之后,点击右上角Create Repository,创建存储库,如下图所示: 取个名字,我这里取名为lihui_demo.并且可以选 ...