博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解定位父级offsetParent及偏移大小
阅读量:6950 次
发布时间:2019-06-27

本文共 3023 字,大约阅读时间需要 10 分钟。

前面的话

  偏移量(offset dimension)是javascript中的一个重要的概念。涉及到偏移量的主要是offsetLeft、offsetTop、offsetHeight、offsetWidth这四个属性。当然,还有一个偏移参照——定位父级offsetParent。本文将详细介绍该部分内容

 

定位父级

  在理解偏移大小之前,首先要理解offsetParent。人们并没有把offsetParent翻译为偏移父级,而是翻译成定位父级,很大原因是offsetParent与定位有关

  定位父级offsetParent的定义是:与当前元素最近的经过定位(position不等于static)的父级元素,主要分为下列几种情况 

  【1】元素自身有fixed定位,offsetParent的结果为null

  当元素自身有时,我们知道固定定位的元素相对于视口进行定位,此时没有定位父级,offsetParent的结果为

  [注意]firefox浏览器有兼容性问题

  【2】元素自身无fixed定位,且父级元素都未经过定位,offsetParent的结果为<body>

  【3】元素自身无fixed定位,且父级元素存在经过定位的元素,offsetParent的结果为离自身元素最近的经过定位的父级元素

  【4】<body>元素的parentNode是null

console.log(document.body.offsetParent);//null

IE7-浏览器Bug

  对于定位父级offsetParent来说,IE7-浏览器存在以下bug

  【bug1】当元素本身经过或,且父级元素无经过定位的元素时,IE7-浏览器下,offsetParent是<html>

  【bug2】如果父级元素存在触发haslayout的元素或经过定位的元素,且offsetParent的结果为离自身元素最近的经过定位或触发haslayout的父级元素

  [注意]关于haslayout的详细信息

 

偏移量

  偏移量共包括offsetHeight、offsetWidth、offsetLeft、offsetTop这四个属性

offsetWidth

  offsetWidth表示元素在水平方向上占用的空间大小,无单位(以像素px计)

offsetWidth =  border-left-width + padding-left + width + padding-right + border-right-width;

offsetHeight

  offsetHeight表示元素在垂直方向上占用的空间大小,无单位(以像素px计)

offsetHeight =  border-top-width + padding-top + height + padding-bottom + border-bottom-width

  [注意]如果存在垂直,offsetWidth也包括垂直滚动条的宽度;如果存在水平滚动条,offsetHeight也包括水平滚动条的高度

offsetTop

  offsetTop表示元素的上外边框至offsetParent元素的上内边框之间的像素距离

offsetLeft

  offsetLeft表示元素的左外边框至offsetParent元素的左内边框之间的像素距离

IE7-Bug

  IE7-浏览器在offsetTop属性的处理上存在bug

  【1】若父级设置position: relative,则在IE7-浏览器下,offsetTop值为offsetParent元素的paddingBottom值

  【2】若父级设置position: aboslute(或其他触发haslayout的条件),offsetTop值为offsetParent元素的paddingBottom值和当前元素的marginTop值的较大值

 

页面偏移

  要知道某个元素在页面上的偏移量,将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,并加上offsetParent的相应方向的边框,如此循环直到根元素,就可以得到元素到页面的偏移量

  [注意]在默认情况下,IE8-浏览器下如果使用currentStyle()方法获取<html>和<body>(甚至普通div元素)的边框宽度都是medium,而如果使用(或clientTop)获取边框宽度,则是实际的数值

html,body{
border: 0;}body{
margin:0;}
function getElementLeft(element){    var actualLeft = element.offsetLeft;    var current = element.offsetParent;    while(current != null){        actualLeft += current.offsetLeft + current.clientLeft;        current = current.offsetParent;    }    return actualLeft + 'px';}function getElementTop(element){    var actualTop = element.offsetTop;    var current = element.offsetParent;    while(current != null){        actualTop += current.offsetTop + current.clientTop;        current = current.offsetParent;    }    return actualTop + 'px';}

 

注意事项

  【1】所有偏移量属性都是只读的

  【2】如果给元素设置了display:none,则它的偏移量属性都为0

  【3】每次访问偏移量属性都需要重新计算

  由上面代码对比可知,重复访问偏移量属性需要耗费大量的性能,所以要尽量避免重复访问这些属性。如果需要重复访问,则把它们的值保存在变量中,以提高性能

转载地址:http://dyuil.baihongyu.com/

你可能感兴趣的文章
Android预定义样式?android:attr/attribute、?attr/attribute和?attribute
查看>>
如何使用File APIs来读取文件
查看>>
Swift实现LRU缓存淘汰算法
查看>>
面试就像把妹
查看>>
理解runloop
查看>>
如何优雅的操作数组
查看>>
关于Spring Cloud Netflix
查看>>
行为参数化
查看>>
MapReduce过程详解
查看>>
以太坊智能合约开发第五篇:字符串拼接—Solidity
查看>>
scala代码笔记
查看>>
MarkDown说明
查看>>
运用Vue Router的进程守护修改单页的title
查看>>
Bytom的链式交易和花费未确认的交易
查看>>
Date实战案例:倒计时&日历
查看>>
【译】Vault 学习资源:1.0, 自动解印, 代理, Kubernetes
查看>>
JavaScript系列--类型判断的4种基本方法,研究jquery的type方法,空对象的检测方法,类数组对象...
查看>>
枚举工具类
查看>>
阿里云ECS服务器部署Node.js项目全过程详解
查看>>
pm2 简介与常用指令
查看>>