代碼中 div2 的 offsetParent 是 div1,但 div1.offsetLeft 輸出 0 而非預期 100 (margin-left)。
#div1 {
width: 500px; height: 500px;
margin-left: 100px;
border: solid 1px black;
/* 缺少 position: relative/absolute/fixed */
}
#div2 {
width: 300px; height: 300px;
margin-left: 50px;
border: solid 1px red;
}
元素的
offsetParent是最近的已定位祖先元素 (position ≠ static)。若無,則為<body>(或標準模式下<html>)。
div1 無定位 → div2.offsetParent = bodybody.offsetLeft = 0 (相對視口)#div1 {
position: relative; /* 或 absolute/fixed */
width: 500px; height: 500px;
margin-left: 100px;
border: solid 1px black;
}
現在:
div2.offsetParent = div1div1.offsetLeft = 100 (含 margin-left)<style>
#div1 { position: relative; width: 500px; height: 500px; margin-left: 100px; border: 1px solid black; }
#div2 { width: 300px; height: 300px; margin-left: 50px; border: 1px solid red; }
</style>
<body>
<div id="div1"><div id="div2"></div></div>
</body>
<script>
function ww() {
var obj = document.getElementById("div2");
var par1 = obj.offsetParent; // div1
console.log('offsetParent:', par1.id); // "div1"
console.log('offsetLeft:', par1.offsetLeft); // 108 左右
}
ww();
</script>
| 屬性 | 含義 | 參考系 |
|---|---|---|
offsetLeft | 元素左邊框到 offsetParent 左內邊距的距離 | offsetParent |
offsetTop | 元素上邊框到 offsetParent 上內邊距的距離 | offsetParent |
offsetWidth | 元素寬度 (含 padding+border+滾動條) | 自身 |
offsetHeight | 元素高度 (同上) | 自身 |
offsetParent | 最近的已定位祖先,無則為 body/html | - |
offsetLeft/Top 定位,**父容器必須有定位** (relative/absolute/fixed/sticky)margin 計入 offsetLeft,但 transform 不計入 (會創建新的 containing block)getBoundingClientRect() 更可靠:rect.left + window.scrollX<td> 的 offsetParent 是 <table>,而非 <tr>一句話:無定位父元素,offsetParent 指向 body,offsetLeft 恆為 0。