纯 css 无法自动触发滚动时页眉变色,必须用 javascript 或 scroll-driven animations(sda);当前最可靠无 js 方案是 @scroll-timeline 驱动 background-color 动画,但需注意浏览器兼容性及语法限制。

纯 CSS 无法在滚动时自动触发页眉颜色变化 —— scroll 是运行时行为,CSS 本身没有监听能力。必须用 JavaScript 或原生 @scroll-timeline + animation 组合实现。当前(2026 年)最可靠、声明式最强的方案是 Scroll-driven Animations(SDA),但需注意浏览器兼容性与关键细节。
用 @scroll-timeline 驱动颜色过渡动画
这是目前唯一无需 JS 就能实现滚动驱动颜色变化的原生方式。核心是把滚动位置映射为动画时间轴,再绑定到 background-color 的 CSS 动画上。
-
@scroll-timeline必须定义在顶层作用域(不能嵌套在@media或其他规则内) - 时间轴方向默认是
block(即垂直滚动),若页眉固定在顶部,应使用source: selector(#main-container)或source: auto(指向根滚动容器) - 起始/结束偏移量用
start: 0和end: 100cqb(cqb = container query block units)更稳定,避免用px值导致跨设备失效 - 动画本身必须用
@keyframes定义,且只能作用于支持动画的属性(background-color支持,opacity也支持,但display不支持)
@scroll-timeline header-color-timeline {
source: auto;
start: 0;
end: 100cqb;
}
<p>@keyframes header-bg-change {
from { background-color: rgba(255, 255, 255, 0); }
to { background-color: rgba(255, 255, 255, 0.95); }
}</p><p>.header {
position: fixed;
top: 0;
width: 100%;
animation: header-bg-change 1s linear forwards;
animation-timeline: header-color-timeline;
}</p>
为什么直接写 animation-timeline: scroll() 会失败
常见错误是试图在样式里直接写 animation-timeline: scroll(start 0 end 100cqb) —— 这种内联语法目前(Chrome 124+、Safari 17.4+、Firefox 125+)尚未被任何浏览器完全支持。必须拆分为独立的 @scroll-timeline 规则并引用名称。
- Chrome 当前仅支持
animation-timeline: <timeline-name></timeline-name>,不支持函数式内联声明 - Safari 对
cqb单位支持不稳定,建议 fallback 到100vh或显式设置容器overflow-y: scroll - Firefox 要求
@scroll-timeline必须在 CSSOM 加载完成前注册,动态注入的 style 标签可能被忽略
JavaScript fallback:监听 scroll + requestAnimationFrame
当需要兼容 Safari 17.3 或旧版 Chrome(
- 不要用
window.onscroll或addEventListener('scroll')直接改样式 —— 触发太频繁,易卡顿 - 必须包裹在
requestAnimationFrame中,且只在scrollY变化超过阈值(如 2px)时才更新 class 或自定义属性 - 推荐用 CSS 自定义属性(
--header-bg-alpha)传值,让样式层统一处理,避免 JS 直接操作style.backgroundColor - 记得在页面 resize 或 DOM 变化后重新校准滚动阈值(例如页眉高度变化影响触发点)
.header {
background-color: rgb(255 255 255 / var(--header-bg-alpha, 0));
}
<p>// JS 中:
let lastScrollY = 0;
function updateHeaderAlpha() {
const y = window.scrollY;
const alpha = Math.min(0.95, y / 300); // 滚动 300px 后完全不透明
if (Math.abs(y - lastScrollY) > 2) {
document.documentElement.style.setProperty('--header-bg-alpha', alpha.toFixed(3));
lastScrollY = y;
}
}
window.addEventListener('scroll', () => requestAnimationFrame(updateHeaderAlpha));</p>
容易被忽略的布局陷阱
即使动画逻辑正确,页眉也可能“跳动”或遮挡内容 —— 这几乎总是由布局未预留空间导致。
- 使用
position: fixed的页眉不会占据文档流空间,必须给body或main加padding-top(值 ≥ 页眉高度) - 如果页眉高度随缩放/字体大小变化,
padding-top也要响应式调整,否则滚动初期内容会被遮盖 -
z-index必须显式设置(如z-index: 1000),尤其当页面有 modal、dropdown 等浮层时,否则变色动画可能被截断 - 在 iOS Safari 中,
fixed元素在地址栏收起/展开时可能重绘异常,建议加will-change: transform提前提示合成层
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











