假设我们有以下设置:
#header {
background-color: #ddd;
padding: 2rem;
}
#containing-block {
background-color: #eef;
padding: 2rem;
height: 70px;
transform: translate(0, 0);
}
#button {
position: fixed;
top: 50px;
}
<div id="header">header</div>
<div id="containing-block">
containing-block
<div>
<div>
<div>
<button id="button" onclick="console.log('offsetParent', this.offsetParent)">click me</button>
</div>
</div>
</div>
</div>
其中按钮具有fixed位置并且包含块具有transform适当的属性。
这可能会让人感到意外,但按钮的位置是相对于#containing-block,而不是视口(正如人们在使用 时所期望的那样fixed)。那是因为#containing-block元素具有transform属性集。有关说明,请参阅https://developer.mozilla.org/en-US/docs/Web/CSS/position#fixed。
有没有一种简单的方法可以找出按钮的包含块?top: 50px计算的元素是哪个?假设您没有对包含块的引用,并且您不知道它有多少层。如果没有设置transform,perspective或filter属性的祖先,它甚至可能是 documentElement。
对于absolute或relative定位的元素,我们有elem.offsetParent这给了我们这个参考。fixed但是,对于元素,它设置为 null 。
当然,我可以查找 dom 并找到第一个具有或set 样式属性的元素transform,但这似乎很老套,而且没有未来的证明。perspectivefilter
谢谢!
慕工程0101907
侃侃无极
相关分类