You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滚动吸附(Scroll Snapping)时如何实现背景色平滑过渡?

滚动吸附场景下背景色平滑切换的实现方案

针对你提到的网站效果,核心是CSS滚动驱动动画配合滚动吸附布局实现的,具体拆解如下:

1. 搭建滚动吸附基础布局

先通过CSS滚动吸附属性,让页面区块在滚动时精准对齐视口,为背景色切换提供稳定的触发节点:

.page-container {
  scroll-snap-type: y mandatory;
  overflow-y: scroll;
  height: 100vh;
}

.section {
  height: 100vh;
  scroll-snap-align: start;
}

这段代码会让每个.section滚动到视口时自动吸附到顶部,确保滚动分段清晰。

2. 用滚动驱动动画实现背景色平滑过渡

利用现代浏览器支持的滚动驱动动画特性,将滚动进度直接映射为背景色的渐变过程:

/* 绑定动画到页面滚动行为 */
.page-container {
  animation: bg-transition linear;
  animation-duration: 1ms; /* 让动画进度完全匹配滚动进度 */
  animation-timeline: scroll(root block);
}

/* 定义背景色过渡关键帧 */
@keyframes bg-transition {
  0% { background-color: #f8f8f8; }
  33% { background-color: #2a2a2a; }
  66% { background-color: #e63946; }
  100% { background-color: #457b9d; }
}

这里的核心是通过animation-timeline: scroll(root block)把动画和页面滚动绑定,极短的animation-duration让动画进度完全跟随滚动距离,从而实现滚动过程中背景色的无缝渐变。

3. 区块级精准过渡优化

如果需要每个吸附区块对应特定的背景色,可以根据区块数量计算滚动占比,在关键帧中设置对应颜色节点。比如3个区块,每个占33%左右的滚动进度,就能让滚动到每个区块时,背景色刚好完成对应阶段的过渡。

4. 旧浏览器兼容方案

如果要兼容不支持滚动驱动动画的浏览器,可以通过JS监听滚动事件,实时计算滚动进度并更新背景色:

const container = document.querySelector('.page-container');
const totalScrollHeight = container.scrollHeight - window.innerHeight;

container.addEventListener('scroll', () => {
  const scrollProgress = container.scrollTop / totalScrollHeight;
  // 用HSL颜色模式实现更顺滑的色相过渡
  const hue = scrollProgress * 360;
  container.style.backgroundColor = `hsl(${hue}, 70%, 80%)`;
});

通过requestAnimationFrame(默认事件触发频率足够)实时更新颜色,同样能达到平滑切换的效果。

内容的提问来源于stack exchange,提问作者gakun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:06:23