F15▸A004▸framer-motion
Char Reveal
字符逐個出現
難度 ★★★★★標籤 文字 · 進場 · stagger3 min read
效果簡述
逐字進場——比 Line Stagger 更細的精緻感,但只適合英文跟少量字。 中文字符獨立性質不同,逐字進場會像「碎片散落」,請改用 F03 Line Stagger。
Claude Code Prompt
參考:A004 char reveal 技術:Framer Motion variants + 拆字符 具體行為: - Array.from(text) 拆成字符(英文用,中文不建議) - 每個字符 motion.span,display: inline-block - 空白要換成 \u00A0(不換行空白),不然 stagger 後空白會消失 - staggerChildren: 0.04(比 line stagger 更密) - 每個字符 duration: 0.4 限制: - 純英文 + 短文字(< 30 字符) - 中文一律改用 line stagger(F03) - 加 aria-label 給螢幕閱讀器讀完整字串
完整程式碼
'use client'
import { motion } from 'framer-motion'
const text = 'Visual Effects Lab'
export function CharReveal() {
const chars = Array.from(text)
return (
<motion.h2
aria-label={text}
initial="hidden"
whileInView="visible"
viewport={{ once: true, amount: 0.4 }}
variants={{ visible: { transition: { staggerChildren: 0.04 } } }}
>
{chars.map((c, i) => (
<motion.span
key={i}
aria-hidden
variants={{
hidden: { opacity: 0, y: 16 },
visible: {
opacity: 1,
y: 0,
transition: { duration: 0.4, ease: [0.4, 0, 0.2, 1] },
},
}}
style={{ display: 'inline-block' }}
>
{c === ' ' ? '\u00A0' : c}
</motion.span>
))}
</motion.h2>
)
}何時用
- ✅ 英文 Hero 標題(< 30 字符)
- ✅ Logo 文字進場
- ✅ 案例 / 作品名稱
何時別用
- ❌ 中文標題(用 F03 Line Stagger)
- ❌ 長文字(30 字以上會等到不耐煩)
- ❌ 內文段落
我踩過的坑
-
中文 char stagger 看起來像錯字:跟 F03 一樣的坑,記住中文 的字單位是「詞」或「行」,不是字符。逐字出現視覺像「字一個一個 蹦出來」很卡通。
-
空白消失問題:拆字符後空白 ' ' 不會 stagger 進來,因為
display: inline-block加在 span 上,空白沒寬度。解法:把空白 換成\u00A0(不換行空白),它有實際寬度。 -
a11y 要顧:螢幕閱讀器讀逐字 span 會逐字念「V-i-s-u-a-l」。 父層加
aria-label="Visual",子 span 加aria-hidden。
相關效果
- F03 Line Stagger Reveal — 中文必須用這個