基于滚动位置的样式

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费信用额度!

Rik Schennink 文档 一个系统,可以编写 CSS 选择器,在页面滚动到某个位置时对页面进行样式设置。如果您像我一样,您已经在寻找 document.addEventListener('scroll' ... 并对性能感到恐惧。Rik 通过 防抖 函数以及将事件标记为 passive 来立即解决这个问题。

最终结果是在 <html> 元素上添加一个 data-scroll 属性,该属性可以在 CSS 中使用。这意味着如果您向下滚动页面 640px,则有 <html data-scroll="640">,并且可以编写类似的 选择器

html:not([data-scroll='0']) {
  padding-top: 3em;
}
html:not([data-scroll='0']) header {
  position: fixed;
}

查看 Pen
编写 Dumb JS 🧟‍♂️ 和 Smart CSS 👩‍🔬
by Rik Schennink (@rikschennink)
CodePen 上。

不幸的是,我们在 CSS 中没有大于 (>) 小于 (<) 选择器来处理诸如编号属性之类的事情,因此 CSS 样式设置的潜力在这里相当有限。您可能最终需要更新 JavaScript 函数,使其根据您的数学运算应用其他类或数据属性。但是您已经为这里良好的性能做好了准备。

“当用户从顶部滚动时应用样式” 是一个合法的用例。这让我想到一个 once 函数(就像我们在 jQuery 中拥有的一样),其中任何滚动事件只会触发一次,然后不再触发。他们滚动过!因此,根据定义,他们不再处于顶部!但这并不能解决他们何时返回到顶部的問題。

我发现使用 IntersectionObserver 来根据滚动位置对事物进行样式设置通常更有用。使用它,您可以执行类似“此元素是否已滚动到视图中或超出视图”的操作,这通常很有用,并且可以用于从顶部滚动的物品。

这是一个示例,如果用户滚动到页面下方 500px 处的隐藏像素位置,则添加或删除一个类。

查看 Pen
使用 IntersectionObserver 固定标题
by Chris Coyier (@chriscoyier)
CodePen 上。

这也是高效的,完全避免了任何滚动事件处理程序。

说到 IntersectionObserver,请查看 “信任是好的,观察是更好的——Intersection Observer v2”.