mcpField
G
gsap-text

gsap-text

github.com/iotron设计与 UI938 次安装31 周前更新
代码仓库

关于 gsap-text

gsap-text 是为前端开发者提供 SplitText 与 ScrambleText 动画配方的技能,涵盖文字遮罩揭示、滚动触发效果及 useReveal 的使用。还列出字体加载、响应式拆分和清理等注意事项。

主要功能

  1. 01SplitText 文字拆分与遮罩
  2. 02ScrambleText 解码动画
  3. 03useReveal 组合式函数
  4. 04滚动触发文字揭示
  5. 05动画实现注意事项

适用场景

  1. 01制作标题逐词揭示效果
  2. 02为文字添加乱码解码动画
  3. 03创建滚动触发的文字动画
  4. 04在组件卸载时清理拆分效果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iotron/gsap-cookbook --skill gsap-text

安装后在 Claude Code 中输入/gsap-text确认已加载。

附带文件references/learnings.mdreferences/text-patterns.md

详细介绍

GSAP Text — SplitText + ScrambleText

流程:gsap-setup → gsap-animate → gsap-text → gsap-optimise → gsap-test 关键文件:composables/useReveal.js、plugins/gsap.js、assets/css/tailwind.css

配套内容:如需查阅 SplitText/ScrambleText API 参考,请调用 gsap-plugins。本技能仅介绍文本动画方案。需要:greensock/gsap-skills


1. SplitText 设置

// Preferred — useReveal handles everything:
const { init, hero, scroll, split } = useReveal(sectionRef)
onMounted(() => init(() => scroll()))

// Manual setup:
const { $gsap: gsap, $lazyLoadSplitText, $lazyLoadScramble } = useNuxtApp()
let SplitText, ctx
const splits = []

onMounted(async () => {
  await document.fonts.ready               // CRITICAL: fonts before split
  SplitText = await $lazyLoadSplitText()
  ctx = gsap.context(() => { /* ... */ }, scopeRef.value)
})

onUnmounted(() => {
  splits.forEach(s => s.revert())
  splits.length = 0
  ctx?.revert()
})
创建拆分
const s = SplitText.create(el, { type: 'words', mask: 'words' })
splits.push(s)
gsap.set(s.words, { y: '100%' })
gsap.set(el, { visibility: 'visible' })

2. 带遮罩的单词上滑(生产模式)

这是 25+ 个组件中通用的标题显示效果。

ctx = gsap.context(() => {
  const s = SplitText.create(el, { type: 'words', mask: 'words' })
  splits.push(s)
  gsap.set(s.words, { y: '100%' })
  gsap.set(el, { visibility: 'visible' })

  gsap.to(s.words, {
    y: '0%', duration: 0.8, ease: 'power4.out', stagger: 0.06, force3D: true,
    scrollTrigger: {
      trigger: el, start: 'top 85%',
      toggleActions: 'play none none reverse', invalidateOnRefresh: true,
    },
  })
}, scopeRef.value)
通过 useReveal(首选)
<div ref="sectionRef">
  <div class="reveal">
    <h2 class="text-reveal">HEADING TEXT</h2>
  </div>
</div>
const { init, scroll } = useReveal(sectionRef)
onMounted(() => init(() => scroll()))

3. ScrambleText 解码

ScrambleText API 参考请见 gsap-plugins 技能。方案:

gsap.to(el, {
  duration: 0.8 + el.textContent.length * 0.005,
  scrambleText: { text: 'FINAL TEXT', chars: '▓░▒█▀▄╬╠╣▐▌■□', revealDelay: 0.3, speed: 0.4 },
})

4. 注意事项总结

完整详情和代码示例请参阅 references/learnings.md。

  • 在 SplitText.create() 之前等待 document.fonts.ready
  • autoSplit: true 仅用于行(响应式重排);单词/字符不需要。务必搭配 onSplit()
  • 父元素使用 autoAlpha、子元素使用遮罩时:使用 visibility,不要使用 autoAlpha
  • 切勿在 scramble 前清空 textContent
  • 并列的逐词补间动画设置 overwrite: false
  • SplitText 会保留 <span>;渐变样式请使用 :deep(div)
  • CSS .reveal + .text-reveal 预隐藏类可防止 FOUC

5. useReveal Composable 参考

方法描述
init(fn)异步:等待字体加载,延迟加载 SplitText + Scramble,并创建 gsap.context
hero(selector?, overrides?)为首屏内容立即显示效果。自动检测 .text-reveal 子元素
scroll(selector?, overrides?)为每个元素创建带 .reveal + .text-reveal 的 ScrollTrigger 显示效果
split(target)SplitText 包装器:创建带遮罩的单词拆分,并跟踪以便清理
// Hero (above-fold, immediate)
const { init, hero } = useReveal(sectionRef)
onMounted(() => init(() => hero('.reveal', { textDelay: 0.2 })))

// Scroll (below-fold, per-element ScrollTrigger)
const { init, scroll } = useReveal(sectionRef)
onMounted(() => init(() => scroll('.reveal', { start: 'top 75%', once: true })))

自动清理:onUnmounted 会还原 gsap.context 和所有 SplitText 实例。


参考资料

  • references/text-patterns.md — 组合裁剪+扰乱、动感字符拆分、弹性字体组装、滚动文本(3D 老虎老虎机)、水平文本(containerAnimation)、带遮罩的行显示、搭配 ScrollTrigger 使用 autoSplit
  • references/learnings.md — 生产调试中发现的 7 个关键注意事项

评论

支持 Markdown