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

如何用JS实现页面向下滚动时文本从左到右动画显示效果

滚动触发文本从左到右展示实现方案

核心逻辑分两块:一是精准判断目标元素滚动到视口的时机,二是用CSS过渡实现文本从左到右的展开效果,全程原生JS+CSS就能实现,不需要额外依赖。

核心实现代码

1. HTML + CSS 基础结构

先写基础页面结构,文本初始状态设为宽度0、溢出隐藏,加宽度过渡属性:

<style>
/* 撑出页面滚动高度,方便测试效果 */
.page-wrap {
  min-height: 200vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.animate-text {
  font-size: 2rem;
  font-weight: 600;
  /* 动画初始状态 */
  width: 0;
  white-space: nowrap;
  overflow: hidden;
  /* 展开动画配置,时长、缓动函数可自行调整 */
  transition: width 1.2s cubic-bezier(0.2, 0.8, 0.2, 1);
}
/* 触发动画时的状态 */
.animate-text.active {
  width: fit-content;
}
</style>

<div class="page-wrap">
  <p class="animate-text">滚动到这里就会看到我从左到右滑出来啦</p>
</div>

2. JavaScript 交互逻辑

优先用IntersectionObserver做视口判断,比传统scroll事件监听性能好很多,不会造成滚动卡顿:

const textEl = document.querySelector('.animate-text')

// 兼容处理:如果fit-content有兼容问题,提前拿文本实际宽度
// const realWidth = textEl.scrollWidth

const viewObserver = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    // 元素露出40%的时候触发动画,阈值可自行调整
    if (entry.isIntersecting) {
      textEl.classList.add('active')
      // 用固定宽度的话就写 textEl.style.width = `${realWidth}px`
      // 动画只需要触发一次的话,触发后取消观察
      viewObserver.unobserve(textEl)
    }
  })
}, {
  threshold: 0.4
})

viewObserver.observe(textEl)

可选调整方向

  • 如果需要兼容IE等老浏览器,可以降级为scroll事件监听+getBoundingClientRect判断元素位置,记得给监听函数加节流,避免频繁触发计算
  • 要做逐字/逐行动画的话,把目标文本拆成单个字/单行的span标签,给每个span加递增的动画延迟即可,核心逻辑不变
  • 想要更丰富的动效,可以在展开的同时加透明度变化,比如初始opacity设为0,active状态下设为1,过渡和宽度同步就行

注意:如果目标文本是动态加载的,记得等文本渲染完成后再初始化观察器、获取文本宽度,不然会出现宽度计算不准的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:21