【发布时间】:2019-07-12 02:37:57
【问题描述】:
我有一个两列布局,我希望右列为position: sticky,以便在滚动较长的左列时保持在视图中。
这是两个引导列,所以我要做的第一件事就是删除浮动(而是使用display: inline-block)。
这本身就可以正常工作,或者在这个特定页面的 DOM 顶部附近,但是在呈现的位置(唉,大约有 30 个左右的 div 深......别问...... ) 我无法让它工作。两列都在继续滚动。
我知道父元素是否有一个 overflow 属性而不是 visible 可以破坏 position: sticky 但这似乎不是这里的问题。如果 any 链上的父元素设置了溢出设置,它会破坏粘性定位吗?
我只是确定在这种情况下要寻找什么,以确定在这种情况下是什么破坏了它。在粘性定位方面还有其他需要注意的关键事项吗?
编辑:我改写了我的问题,因为它确实出现(经过进一步调查和测试)问题是 DOM 顶部附近的父元素设置为 overflow-x: hidden。由于这是共享代码,我必须找出原因以及它存在的原因。
但是...在此期间,是否有任何已知的解决方法...可以使用 DOM 树更下方的元素作为定位为粘性的项目的包含元素?
在下面的示例中,如果您从.theproblem 中删除溢出,则页面会按照我的意愿运行(当您滚动页面时,右列会“粘住”)。
.theproblem {
overflow-x: hidden;
}
.column {
display: inline-block;
width: 45%;
vertical-align: top;
}
.column1 {
border: 1px solid red;
height: 1000px;
}
.column2 {
border: 1px solid green;
position: sticky;
top: 1px;
}
<div class="theproblem">
<div class="columnwrapper">
<div class="column column1">
This is column 1 (the tall one)
</div>
<div class="column column2">
This is column 2 (the sticky one)
</div>
</div>
</div>
【问题讨论】:
-
是的,我相信“可见”以外的
overflow值定义了一个滚动容器。粘性元素粘在它最近的滚动容器祖先上。作为参考,请参阅this answer:“...如果您在粘性元素的任何祖先上将溢出设置为隐藏,那么该祖先元素将成为粘性元素的滚动容器”。 -
@showdev 是的,这就是我的发现。本质上,溢出:隐藏在粘性元素上方的 DOM 中的任何位置都会“破坏”它。 (我意识到它在技术上符合规范,但从本质上破坏了此功能的实用性)
-
我发现它也限制了某些布局。您可以考虑发布您的具体实现,看看是否有人能找到解决方案。
-
@showdev 好电话。添加了示例代码。谢谢!
-
一种解决方案可能是使用Stickyfill polyfill。尽管它说它“在溢出的块中不起作用”并且“滚动祖先会导致粘性粘住,滚动窗口不会”,但它似乎有效。确保使用
forceSticky()“[f]orce-enable polyfill,即使浏览器本身支持position: sticky”。 Here's a demonstration。另见position sticky polyfill with overflow support。