嘿, 我是Mofei!
CSS position: sticky
发布于 2023年5月1日 18:07

对于"老前端"来们来说,实现这样一个效果:在网页滚动到一定高度之后,让一部分内容(比如导航,目录列表等)固定在页面中显示。我们第一直觉可能是:使用JS监听scroll事件,然后通过修改对应元素的css或者style来实现。

比如如下示例中的nav模块:

sticky example

1. 现代CSS如何实现?

我不得不在这一节的标题中加入了现代两个字,因为如果你去问活跃在2019或者2020年之前的前端同学下面这个问题:CSS的position有哪些属性?我想你得到的答案大概率是:staticrelativeabsolutefixedinherit,毕竟这是经典八股文以及CSS面试“可能”必考的题目之一。实际上position还有一个值sticky,通过使用这个值,我们只需要两行简单的CSS就能实现上述效果:

position: sticky;
top: 0px;

2. 理解 sticky

sticky 虽然好用,但它并不像fix或者absolute一样好理解。如果你百度一下,可能会看到一堆使用条件,比如:父元素不能overflow:hidden或者overflow:auto属性, 父元素的高度不能低于sticky元素的高度 等等。

实际上我们并不需要去特别记忆这些奇奇怪怪的规,只要理解 黏性元素(sticky item),黏贴容器(sticky container)两个概念即可。其中 sticky item 是指被设置成 position: sticky的元素,sticky container 是指这个元素的父元素。比如,下图中,我们设置了.navposition: sticky之后他的父元素(灰色虚线边框的元素)就自动成为了sticky container

sticky item and container

然后我们只要记住一个规则就可以了:当sticky container滚动的时候, sticky item 距离sticky container可见区域达到我们定义的条件之后就会被固定下来,如果sticky container的剩余空间不足以放置 sticky itemsticky item也会变回正常状态。

具体来说(Demo在文章末尾):

  1. 在案例Demo中我们设置了top: 50px;,一开始sticky item 距离sticky container顶部可见区域大于50px,所以会随着页面滚动 sticky item move
  2. 继续滚动,当sticky item 距离sticky container顶部可见区域小于50px的时候(并且sticky container能容纳下sticky item),sticky item 就会固定在页面中 sticky item fix
  3. sticky container的可见区域无法容纳sticky item 的时候,sticky item会变回正常状态随着页面滚动sticky item continue move

Try Demo(codepen.io链接):

兼容性

随着几年的发展,除了旧的IE,所有主流的现代浏览器都支持sticky。

caniuse 链接

Can I use

📱 喜欢这篇文章?关注我的公众号

博客文章会第一时间发布,然后按类型同步到对应公众号

👨‍👩‍👧‍👦生活公众号

疯狂的超级奶爸在北欧

家庭生活 • 育儿日常 • 北欧生活

生活公众号二维码

🏠 芬兰生活分享

👨‍💻技术公众号

Mofie

前端开发 • AI技术 • 编程经验

技术公众号二维码

🚀 技术灵感与实战

THE END
上一篇
做一个牧羊人寻找那林中的白色驯鹿 - 呼伦贝尔五日游
下一篇
神奇的 CSS 属性:box-decoration-break

更多精彩文章

如果有任何疑问或者不同意见,欢迎留言一起讨论!

avatar

Mofei's Friend (点击编辑)

你的一小步,我的一大步!
还没有评论
成为第一个评论的人吧!

HI. I AM MOFEI!

NICE TO MEET YOU!