全部
我对元素的位置感到困惑。让我从如何获取/设置元素的左属性开始。
首先,有一种设置元素左侧位置的方法,使用 element.style.left。我将定义从http://www.w3schools.com/cssref/pr_pos_left.asp复制到下面:
- 对于绝对定位的元素,left 属性将元素的左边缘设置为其包含元素左边缘的左/右单位。
- 对于相对定位的元素,left 属性将元素的左边缘设置为向左/向右到其正常位置的单位。
所以我的问题是:
- 在定义 1 中,包含元素是否等于 element.parentNode?
- 在定义 2 中,如何获得元素的正常位置?
其次,我们可以通过element.offsetLeft来获取左边的位置。如果我尝试这种方式,我应该知道哪个元素是元素的 offsetParent。我还从下面的互联网复制了我的定义:
- offsetParent 属性是指最近的定位(非静态)祖先元素。如果没有这样的元素,offsetParent 将引用 body 元素
我编写了一个测试 Html 文件并尝试获取 offsetParent。
<div id="div_1">
<p id="p_1">
Lorum ipsum...
</p>
</div>
<div id="div_2" style="position: relative;">
<p id="p_2">
Lorum ipsum...
</p>
</div>
<table id="table_1">
<th>
<tr>
<td id="td_1">Cell</td>
<td>Cell</td>
</tr></th>
</table>
元素 p_1 的 offsetParent 是 body,元素 p_2 的 offsetParent 是 div_2,到目前为止,一切都很好。但是我尝试获取元素td_1的offsetParent,结果是table_1,而不是body。为什么?根据定义,我认为应该是doby,因为没有最近的定位(非静态)祖先元素。
嗨,claustrofob,感谢您的重播,我想您已经回答了我的部分问题,关于为什么 td 的 offsetParent 是表。但是根据您关于 style.left 的另一个答案,我不同意。我写了一个新的测试文件,下面是片段:
<div id="div_2" style="border:2px solid red; width: 500; height: 300;position: relative;">
<div id="div_3" style="border:2px solid blue;left:100px; width: 300; height: 100;">
<p id="p_2" style="position: relative;left: 30px">
Lorum ipsum...
</p>
</div>
</div>
<script>
var p_2 = document.getElementById('p_2');
document.write("<div>The position property of Element p_2 is "+ p_2.style.position +"</div>")
document.write("<div>The style.left of Element p_2 is "+ p_2.style.left +"</div>")
document.write("<div>The offsetParent of Element p_2 is "+ p_2.offsetParent.id +"</div>")
document.write("<div>The offsetLeft of Element p_2 is "+ p_2.offsetLeft +"</div>")
document.write("<br/>")
var div_3 = document.getElementById('div_3');
document.write("<div>The position property of Element div_3 is "+ (div_3.style.position ? div_3.style.position : 'not defined') +"</div>")
document.write("<div>The style.left of Element div_3 is "+ div_3.style.left +"</div>")
document.write("<div>The offsetParent of Element div_3 is "+ div_3.offsetParent.id +"</div>")
document.write("<div>The offsetLeft of Element div_3 is "+ div_3.offsetLeft +"</div>")
</script>
输出是:
元素 p_2 的位置属性是相对的
Element p_2 的 style.left 为 30px
Element p_2 的 offsetParent 是 div_2
Element p_2 的 offsetLeft 为 30
元素 div_3 的 position 属性未定义
Element div_3 的 style.left 为 100px
Element div_3 的 offsetParent 是 div_2
Element div_3 的 offsetLeft 为 0
如果你关注关于元素 div_3 的输出,你可以明显地发现 style.left 不等于从元素到 element.offsetParent 的距离。