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

如何实现随浏览器滚动百分比变化的文本填充动画?

实现滚动关联的文本填充颜色进度动画

核心思路

用两层相同文本叠加(底层显示默认色,上层显示填充色),结合滚动监听计算元素在视口中的可见进度,动态裁剪上层文本的显示宽度,就能实现随滚动从左到右填充、反向滚动时撤销填充的效果。


步骤1:HTML结构

需要一个容器包裹两层文本,保证内容完全一致:

<div class="fill-text-container">
  <span class="fill-text-bottom">滚动填充的示例文本</span>
  <span class="fill-text-top">滚动填充的示例文本</span>
</div>

步骤2:CSS样式

设置容器定位让两层文本重叠,上层文本默认隐藏,靠clip-path控制显示范围:

.fill-text-container {
  position: relative;
  font-size: 48px;
  font-weight: bold;
  width: fit-content;
  margin: 200vh 0; /* 加足够上下间距,方便测试滚动 */
}

.fill-text-bottom {
  color: #ccc; /* 底层文本用灰色当底色 */
}

.fill-text-top {
  position: absolute;
  top: 0;
  left: 0;
  color: #2563eb; /* 填充用的蓝色 */
  clip-path: inset(0 100% 0 0); /* 默认完全隐藏 */
  transition: clip-path 0.1s ease; /* 可选:加过渡让动画更丝滑 */
}

步骤3:JavaScript逻辑

监听滚动事件,计算元素的可见进度,动态更新上层文本的裁剪区域:

// 获取目标元素和上层文本
const container = document.querySelector('.fill-text-container');
const fillTextTop = document.querySelector('.fill-text-top');

function handleScroll() {
  // 获取元素相对于视口的位置信息
  const rect = container.getBoundingClientRect();
  // 视口高度
  const viewportHeight = window.innerHeight;
  
  // 计算滚动进度:元素从进入视口到完全离开的过程中,进度从0到100
  const progress = Math.max(0, Math.min(100, ((viewportHeight - rect.top) / (viewportHeight + rect.height)) * 100));
  
  // 更新裁剪区域:右侧保留(100 - progress)%的显示范围,实现从左到右填充
  fillTextTop.style.clipPath = `inset(0 ${100 - progress}% 0 0)`;
}

// 添加滚动监听
window.addEventListener('scroll', handleScroll);
// 页面加载时执行一次,避免初始状态异常
handleScroll();

关键细节说明

  • getBoundingClientRect():用来获取元素在视口中的位置,是计算滚动进度的核心。
  • clip-path: inset():通过调整右侧的裁剪百分比,控制上层文本的显示宽度,实现填充效果。
  • 进度计算:确保元素在视口内时进度线性变化,完全离开视口后进度固定在0或100。
  • 性能优化:如果滚动时动画卡顿,可以用requestAnimationFrame包裹逻辑,提升流畅度:
function handleScroll() {
  requestAnimationFrame(() => {
    // 原逻辑代码
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:42:13