Sticky 定位无效的一些坑
position: sticky
是css
中比较常见的吸顶定位方式,但使用不当很可能会导致该定位方式无效。本文记录自己在sticky定位中踩过的一些坑。
场景 ¶
在开发这个网站时,我想让顶部的导航栏/搜索栏在滚动时固定在屏幕顶部,这样会更方便用户的操作。期望的效果如下:
初步实现的代码 (无效代码😟) ¶
HTML
|
|
CSS
|
|
正如高亮部分的代码那样,我设置了.wrapper
元素的sticky
相关属性后并没有什么效果。
求助 Google 😊 ¶
搜了一圈,网上关于sticky无效的几个原因大概如下:
- 必须指定
top/bottom/left/right
这几个属性之一 - 父容器的高度要大于
sticky
元素的高度 - 任意父节点的
overflow
属性必须都是visible
在我们这个例子里,要定位的元素是.wrapper
,父容器是.header
。我们没有给.header
显式设置高度,因此它的高度是由内容撑开的,也就是说,父容器
.header
的高度等于子元素.wrapper
的高度,不满足第2点,因此sticky
定位无效。
但是这里我们又不能通过设置.header
的高度来实现,而是要基于.container
作为容器来设置sticky
,要不然就会出现下面这种奇怪的行为:
.wrapper
元素虽然会吸顶,但是当滚动距离大于.header
的高度后,会被后面的元素顶上去,也不是我们想要的。
变通办法 ¶
暂时没有找到比较好的解决方法,我们只能把.header
元素设置为sticky
定位,然后调整top
值来达到我们想要的效果。
相关代码如下:
|
|
总结 ¶
要想实现元素吸顶效果,必须设置滚动容器内的直接子元素为sticky
定位,不能是后代子元素。
Comments