无定位父元素时offsetParent为body,但是offsetTop/offsetLeft计算距离从html开始
来源:互联网 发布:sql获取当前时间 编辑:程序博客网 时间:2024/05/08 01:08
问题1:什么是offsetParent?
解答:返回的是被定位的祖先元素,如果没有被定位的元素是body元素!
问题2:发生margin重叠以后,我们怎么计算到offsetParent的距离?
注意:下面的例子都是在标准模式下测试的结果
<div style="width:200px;height:200px;margin-top:10px;" id="outer"> <div style="width:100px;margin-top:200px;height:200px;border:1px solid red;" id="div"> </div></div>上面这种情况肯定会发生margin重叠
//offsetParent如果没有被定位的元素的情况下,如果和body发生了margin重叠,那么所有元素的offsetTop值都是相当于html而不是body元素来计算的! var outer=$('#outer')[0].offsetTop; console.log(outer); //打印200 var div=$('#div')[0].offsetTop; console.log(div); //打印200因为body的margin默认是8px,#outer元素的margin-top是10px,而#div元素的margin-top为200px,所以发生重叠以后outer,div,body元素都在html元素的基础上往下移动了200px(可以阅读 body元素和html元素之间的一些表现一文)!这时候,如果是按照body来计算的,也就是offsetParent是body元素,那么显然#outer,#div元素的offsetTop应该是0,但是结果不是这样,从上面的打印结果我们知道#outer,#div元素的offsetTop是200px,是怎么回事?
其实我也不清楚,既然下面一个例子说offsetParent是body元素,那么显然我不是相对于body来定位的啊!
我猜测:如果DOM树中没有一个元素被定位,那么这时候offsetParent虽然打印了body,但是定位是相当于与html元素的,也就是所有元素距离offsetParent的距离是距离html元素的距离!还有一点请注意:虽然offsetTop是相对html元素定位,但是浏览器打印的是body元素,所以获取body元素的offsetTop时候始终是0!
按照我上面的逻辑,在这种情况下,offsetParent是body元素,但是计算offsetParent的距离是计算到html的距离我来举一个例子:
<div style="width:100px;height:100px;" id="test"></div>如果说是按照body定位的,那么body只有默认的margin,那么offsetTop应该是0
var test=$('#test')[0];//打印bodyconsole.log(test.offsetParent.tagName);//打印8pxconsole.log(test.offsetTop);但是结果是不对的,他的offsetTop是8px,所以我猜测offsetTop在没有定位父元素时候,其距离的计算是相对于html来说的!
我们首先来看一看每一个元素的offsetParent是谁?
var outer=$('#outer')[0];var div=$('#div')[0]; var body=$('body')[0];console.log(outer.offsetParent.tagName);//打印bodyconsole.log(div.offsetParent.tagName);//打印body console.log(body.offsetParent); //打印null
很显然,对于div元素,outer元素其offsetParent是body元素,所以,很显然body元素的offsetParent是不存在的为null!
问题3:如果没有父元素被定位,那么offsetTop获取的就是到html的距离,那么这有什么用?
<div style="width:100px;height:100px;" id="test1"></div><div style="width:100px;height:100px;margin-top:100px;" id="test2"></div>我们也给元素设定一个css样式
html { background-color:blue; } body { margin-top:10px; }我们可以通过这个特性获取两个兄弟元素之间的距离
var test1=$('#test1')[0];var test2=$('#test2')[0];console.log(test2.offsetTop-test1.offsetTop);//打印200,就是#test1的height加上#test2的marginTop!这也就是告诉我们,不管元素的父元素的css多么复杂,我都可以用这种方法获取到子元素的兄弟节点之间的距离,同时更加有用的是,可以通过offsetTop获取到元素距离最顶部的距离,也就是html的距离(这个和html本身的移动即marginTop值是没有关系的)!
0 0
- 无定位父元素时offsetParent为body,但是offsetTop/offsetLeft计算距离从html开始
- 获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft
- offsetParent,offsetLeft,offsetTop Update
- offsetParent,offsetLeft,offsetTop
- offsetLeft,offsetTop,offsetParent详解
- offsetWidth、offsetHeight、offsetLeft、offsetTop、offsetParent
- SD9018: IE6 IE7 IE8(Q) 在某些情况下 DOM 元素的 offsetTop、offsetLeft 的返回值参照元素以及 offsetParent 为距离其最近的触发了 hasLay
- getBoundingClientRect计算页面元素的offsetLeft、offsetTop
- offsetTop、offsetLeft、offsetWidth、offsetHeight、offsetParent、offsetrect
- 理清offsetparent()、offsetLeft/offsetTop、offset()、position()
- 【转】js中offsetLeft,offsetTop,offsetParent详解
- offsetLeft offsetHeight offsetTop offsetWidth offsetParent学习笔记
- offsetTop.offsetLeft,offsetWidth,offsetHeight,offsetParent,scrollTop,scrollLeft,scrollWidth,scrollHeight区别
- HTML中常见的各种位置距离(clientTop clientLeft clientWidth ClientHeight offsetleft offsettop offsetwidth offset
- Html元素与body元素之间的偏移距离
- 如何获取页面中任意元素的offsetLeft和offsetTop
- 5offsetLeft,offsetParent,getBoundingClientRect
- offsetTop,offsetWidth,offsetParent
- swift函数式编程-函数基础
- Android Studio中文字体显示乱码
- class_create() and device_create()
- 《Effective java》读书记录-第13条-使类和成员的可访问性最小化
- 统计学习笔记(2)——感知机模型
- 无定位父元素时offsetParent为body,但是offsetTop/offsetLeft计算距离从html开始
- 在Android中使用OpenGL效果渲染
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
- 对JavaEE中session的理解
- win7安装Beautiful Soup
- HTML5之---Manifest 文件--离线缓存
- 统计学习笔记(3)——k近邻法与kd树
- javaweb学习总结(一):Servlet开发(一)
- Hive metastore三种存储方式