想象一个网站的头部,它很厚,在内容的顶部和底部有大量的填充。当您向下滚动时,它会自行收缩,减少一些填充,为其他内容提供更多的屏幕空间。
通常,您需要使用一些 JavaScript 来添加类似的收缩效果,但自从引入 position: sticky
以来,可以使用 CSS 来实现这一点。

让我先说清楚:我通常不喜欢粘性头部。我认为它们占用了太多屏幕的空间。但是,您是否应该在自己的网站上使用粘性头部是一个不同的问题。这实际上取决于您的内容以及始终存在的导航是否为其添加了价值。如果您使用它,请格外注意避免无意中使用粘性区域覆盖或遮挡内容或功能——这相当于 数据丢失。
无论哪种方式,以下是如何在没有 JavaScript 的情况下实现它,从标记开始。这里没有什么复杂——一个 <header>
只有一个后代 <div>
,它反过来包含徽标和导航。
<header class="header-outer">
<div class="header-inner">
<div class="header-logo">...</div>
<nav class="header-navigation">...</nav>
</div>
</header>
就样式而言,我们将为父 <header>
(120px)声明一个高度,并将其设置为一个灵活的容器,将它的后代居中对齐。然后,我们将使其粘性。
.header-outer {
display: flex;
align-items: center;
position: sticky;
height: 120px;
}
内部容器包含所有头部元素,例如徽标和导航。内部容器在某种程度上是实际头部,而父 <header>
元素的唯一功能是使头部更高,以便有东西可以收缩。
我们将为该内部容器 .header-inner
设置一个 70px 的高度,并将其设置为粘性。
.header-inner {
height: 70px;
position: sticky;
top: 0;
}
那个 top: 0
?它在那里是为了确保容器在变为粘性时将自己安装在最顶部。
现在是诀窍!为了使内部容器真正粘在页面的“天花板”上,我们需要为父 <header>
提供一个负 top
值,该值等于两个容器之间的高度差,使其“在”视窗上方粘贴。那是 70px 减去 120px,留下了——请鼓掌——-50px。让我们添加它。
.header-outer {
display: flex;
align-items: center;
position: sticky;
top: -50px; /* Equal to the height difference between header-outer and header-inner */
height: 120px;
}
现在让我们把它们放在一起。<header>
会从框架中滑出,而内部容器会整齐地放置在视窗的顶部。
我们可以将其扩展到其他元素!如何使用持久性警报?
虽然我们可以在 CSS 中做到这一点,但这确实有限制。例如,内部和外部容器使用固定高度。这使它们容易发生变化,例如,如果导航元素因为菜单项数量超过空间而换行。
另一个限制?徽标不能缩小。这可能是最大的缺点,因为徽标通常是占用空间的最大罪魁祸首。也许有一天,我们可以根据元素的粘性应用样式……
是的,忘记容器查询,我只希望新的 CSS 中有一个
::sticky
选择器也许你会得到它:https://github.com/w3c/csswg-drafts/issues/5979
当粘贴时,自动将属性 sticky=”stuck” 添加到粘贴元素上……太糟糕了,如果只有……
属性 stuck=”true” 自动添加到粘贴元素上,当粘贴时——就像 Details 元素上的 open 属性一样。
如果只有……
克里斯,为什么 CSS 变量看起来这么糟糕!语法很糟糕,而且很麻烦。这是他们能做到的最好的吗?!?!
它们有什么不好?唯一的要求是在变量名之前添加两个连字符。没有法律规定它们不能是
--camelCased
酷!
如何使用仅 CSS 缩小字体大小?