lower-thirds
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseLower Thirds
Lower Third
Build a clean, branded lower third — the name/role caption that lives in the bottom band of the frame — that animates in, holds long enough to read, and exits without stealing the shot. The craft is restraint: a crisp reveal, a strong type hierarchy, correct safe-area placement, and one template that drives a whole roster of speakers.
制作一个简洁、符合品牌风格的Lower Third——即位于画面底部区域的姓名/职位字幕条——它能平滑入场、停留足够时长供人阅读,退场时不会干扰画面内容。核心设计原则是克制:清晰的揭示动画、明确的字体层级、符合安全区域的布局,以及可复用的模板来批量生成所有演讲者的字幕条。
When to use
使用场景
- Speaker/interview name tags, panel rosters, talking-head captions.
- Broadcast-style titles, news straps, podcast/webinar name plates.
- Templating one design across a list of names/titles → many clips (the payoff).
- 演讲者/受访者姓名标签、嘉宾名单、访谈字幕条
- 广播风格标题、新闻条、播客/网络研讨会姓名牌
- 基于单一设计模板批量生成多组姓名/职位对应的字幕条(核心优势)
Anatomy
组成结构
A lower third is two text lines plus a graphic bed, placed in the lower band:
| Element | Role | Type treatment |
|---|---|---|
| Name (primary) | Who | Largest, heaviest, tightest tracking |
| Role/title (secondary) | What/where | ~45–60% of name size, lighter weight, often a brand accent color |
| Bar / panel / accent | Reads against any background | Solid or 70–85% opacity; an accent rule ties to brand |
Keep it to two lines. A name line + role line is the whole job — extra lines erode the hierarchy and crowd the safe area.
Lower Third由两行文本加一个背景图形组成,放置在画面底部区域:
| 元素 | 作用 | 字体处理 |
|---|---|---|
| 姓名(主元素) | 展示人物身份 | 字号最大、字重最粗、字距最紧凑 |
| 职位/头衔(次元素) | 展示人物角色/所属机构 | 字号为姓名的45-60%、字重更轻,通常使用品牌强调色 |
| 背景条/面板/装饰元素 | 确保在任何背景下都清晰可读 | 纯色或70-85%透明度;装饰线条需符合品牌规范 |
严格控制在两行内容。姓名行+职位行就是全部内容——多余的行会破坏层级结构,挤占安全区域。
Three rules that prevent cheap-looking titles
避免廉价感标题的三条规则
- Never hard-cut a title on or off. A bare appear/disappear reads as a mistake. Even a 12-frame fade or slide makes it feel produced.
- Stagger, don't slam. Animate the bar first, then the name, then the role, each offset by 3–6 frames. Everything arriving at once feels flat; a short cascade feels designed.
- Hold long enough to read twice. Roughly 3–5s on screen (read it aloud twice). Too short and it's missed; too long and it nags. Animate in/out, never mid-segment.
- 绝对不要硬切标题的显示/隐藏。直接出现或消失会显得像失误。哪怕是12帧的淡入淡出或滑动动画,也能让整体显得专业。
- 分步入场,而非同步弹出。先让背景条动画入场,再是姓名,最后是职位,每个元素间隔3-6帧。同步入场会显得平淡,短时间的依次入场会更具设计感。
- 停留时长足够读两遍。大约在屏幕上停留3-5秒(大声读两遍的时间)。太短会被忽略,太长会让人厌烦。仅在片段开头和结尾添加动画,不要在片段中间动效。
Enter & exit animations
进出动画
Pick one motion language and reuse it. The most reliable, premium-reading reveals:
| Reveal | Feel | How |
|---|---|---|
| Slide + fade | Clean, default | Translate in ~24–40px while fading; ease-out on enter |
| Wipe bar | Broadcast | A bar scales/sweeps in ( |
| Mask reveal | Premium | Clip text to a moving rectangle so letters "wipe on" |
Use asymmetric easing: a snappy () on enter, a quicker on exit. Exit faster than you entered (~⅔ the duration) so the title gets out of the way.
ease-outcubic-bezier(.22,1,.36,1)ease-incss
/* Mask reveal: text wipes on left→right, no plugin needed */
.lt-name { clip-path: inset(0 100% 0 0); animation: wipe .5s cubic-bezier(.22,1,.36,1) forwards; }
@keyframes wipe { to { clip-path: inset(0 0 0 0); } }选择一种动效语言并保持统一。以下是最可靠、质感高级的揭示方式:
| 揭示方式 | 风格 | 实现方法 |
|---|---|---|
| 滑动+淡入 | 简洁、默认风格 | 平移24-40px的同时淡入;入场时使用缓出效果 |
| 背景条擦除 | 广播风格 | 背景条缩放/扫入( |
| 蒙版揭示 | 高级质感 | 通过移动的矩形裁剪文本,实现文字“擦除式出现” |
使用不对称缓动:入场时使用明快的(),退场时使用更快的。退场时长要短于入场时长(约为入场的⅔),让标题快速让出画面空间。
ease-outcubic-bezier(.22,1,.36,1)ease-incss
/* Mask reveal: text wipes on left→right, no plugin needed */
.lt-name { clip-path: inset(0 100% 0 0); animation: wipe .5s cubic-bezier(.22,1,.36,1) forwards; }
@keyframes wipe { to { clip-path: inset(0 0 0 0); } }In/out timing & dwell
进出时间与停留时长
Think in three phases. Budget frames, not vibes (at 30fps):
| Phase | Budget | Note |
|---|---|---|
| Enter | 12–18f (0.4–0.6s) | Staggered: bar → name → role |
| Hold | 90–150f (3–5s) | The readable dwell; scale with line length |
| Exit | 8–12f (0.27–0.4s) | Faster than enter |
In code, drive every state from the current frame (or a paused timeline), not wall-clock time — a video renderer demands deterministic frames. Express enter/hold/exit as a single progress curve so the same component works live in a browser and frame-by-frame in a renderer.
分为三个阶段。按帧数计算(以30fps为例),而非凭感觉:
| 阶段 | 帧数预算 | 说明 |
|---|---|---|
| 入场 | 12-18帧(0.4-0.6秒) | 分步入场:背景条 → 姓名 → 职位 |
| 停留 | 90-150帧(3-5秒) | 可读停留时长;根据文本长度调整 |
| 退场 | 8-12帧(0.27-0.4秒) | 比入场更快 |
在代码中,所有状态都由当前帧(或暂停的时间线)驱动,而非实际时间——视频渲染器需要确定的帧序列。将入场/停留/退场表达为单一进度曲线,这样同一个组件既能在浏览器中实时运行,也能在渲染器中逐帧渲染。
Safe area & broadcast conventions
安全区域与广播规范
The lower third must survive every screen and platform UI. Compose inside the title-safe area (inner ~90% / margin 5%) and respect platform chrome:
| Frame | Anchor | Avoid |
|---|---|---|
| 16:9 (1920×1080) | Left edge at ~5% margin; baseline ~80–85% down | Outer 5% (title-safe), action-safe outer 10% |
| 9:16 (1080×1920) | Same left margin; lift the band up | Bottom ~18% (captions/UI), top ~12% |
| 1:1 (1080×1080) | Lower band, center-left | Outer 5% |
Anchor to the left and grow rightward so names of different lengths stay pinned and never re-center awkwardly. Keep the role line within the same left margin as the name. For 9:16, do not park the title at the very bottom — platform captions and buttons sit there.
Lower Third必须适配所有屏幕和平台的UI。在标题安全区域(内部约90%区域/边距5%)内布局,并尊重平台界面元素:
| 画幅比例 | 定位方式 | 需避开区域 |
|---|---|---|
| 16:9(1920×1080) | 左边缘距约5%;基线位于画面下方80-85%处 | 外部5%区域(标题安全区),动作安全区外部10% |
| 9:16(1080×1920) | 左边缘距相同;将字幕条上移 | 底部约18%区域(字幕/UI),顶部约12%区域 |
| 1:1(1080×1080) | 底部区域,靠左居中 | 外部5%区域 |
锚定左侧并向右延伸,这样不同长度的姓名会保持固定位置,不会尴尬地重新居中。职位行的左边缘需与姓名行对齐。对于9:16画幅,不要将标题放在最底部——平台字幕和按钮通常位于此处。
Type hierarchy & brand styling
字体层级与品牌样式
Hierarchy is the whole design. Make the name unmistakably dominant:
- Size contrast ≥ 1.6× (name vs role). If unsure, push the name bigger, not the role.
- Weight + color: name in bold/near-white; role in a lighter weight and a brand accent color (one accent, used consistently).
- Contrast for legibility: text rides over unknown footage. Use a solid/semi-opaque bar, a subtle scrim, or a soft text shadow so it reads over both bright and dark plates.
- Brand lock: pin font, accent color, bar style, and corner radius in one theme object so every title across a series matches.
层级结构是设计的核心。要让姓名的主导地位一目了然:
- 字号对比 ≥1.6倍(姓名 vs 职位)。不确定时,放大姓名,而非职位。
- 字重+颜色:姓名使用粗体/近白色;职位使用更轻的字重和品牌强调色(统一使用一种强调色)。
- 可读性对比:文本要在未知背景上清晰可读。使用纯色/半透明背景条、微妙的遮罩或柔和的文本阴影,确保在明亮和黑暗背景上都能看清。
- 品牌锁定:将字体、强调色、背景条样式和圆角半径统一在一个主题对象中,确保系列内容中的所有标题风格一致。
Templating one design across a list
基于列表批量生成模板
The reason to build this in code: change the text/data, re-export — no re-animating. Make name/role/theme props, never hardcoded, then map a roster to instances.
jsx
const ROSTER = [
{ name: "Ada Lovelace", role: "Founder, Analytical Engines" },
{ name: "Grace Hopper", role: "Rear Admiral, US Navy" },
{ name: "Alan Turing", role: "Mathematician" },
];
// One <LowerThird> design; map the list → many instances (sequence them in a renderer)
{ROSTER.map((p, i) => <LowerThird key={p.name} {...p} theme={BRAND} startFrame={i * 150} />)}In a renderer, make the roster an input prop and render once per row () to emit one branded clip per person — same animation, same brand, only the text changes. See for the full runnable component and batch script.
--propsreferences/lower-third-component.md用代码实现的优势:修改文本/数据后重新导出即可——无需重新制作动画。将姓名/职位/主题设为属性,而非硬编码,然后将名单映射为多个实例。
jsx
const ROSTER = [
{ name: "Ada Lovelace", role: "Founder, Analytical Engines" },
{ name: "Grace Hopper", role: "Rear Admiral, US Navy" },
{ name: "Alan Turing", role: "Mathematician" },
];
// 一个<LowerThird>设计;将列表映射为多个实例(在渲染器中按顺序排列)
{ROSTER.map((p, i) => <LowerThird key={p.name} {...p} theme={BRAND} startFrame={i * 150} />)}在渲染器中,将名单设为输入属性,每行渲染一次(),为每个人生成一个符合品牌风格的片段——动画和品牌样式一致,仅文本不同。完整可运行组件和批量脚本请参考。
--propsreferences/lower-third-component.mdOutput checklist
输出检查清单
- Two lines only: dominant name, secondary role (≥1.6× size contrast).
- Animated in and out (no hard cut); enter staggered bar→name→role; exit faster.
- Hold 3–5s (readable twice); motion only at the ends, never mid-segment.
- Left-anchored inside title-safe; 9:16 band lifted above the bottom-18% UI zone.
- Text legible over any plate (bar/scrim/shadow); one brand accent throughout.
- Name/role/theme are props — one template renders the whole roster.
- 仅两行内容:主导姓名、次要职位(字号对比≥1.6倍)。
- 带有入场和退场动画(无硬切);入场时背景条→姓名→职位分步进行;退场速度更快。
- 停留3-5秒(可读两遍);仅在开头和结尾有动效,片段中间无动效。
- 左锚定在标题安全区内;9:16画幅的字幕条需上移至底部18%的UI区域之上。
- 文本在任何背景上都清晰可读(背景条/遮罩/阴影);全程使用统一的品牌强调色。
- 姓名/职位/主题为属性——单一模板可渲染整个名单。
Deliver & verify (rendered stills → MP4)
交付与验证(渲染静帧→MP4)
Packaged helper (): tile your stills withscripts/, then assert the encode withscripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png. Seescripts/probe-mp4.sh out.mp4 [WxH] [fps].scripts/README.md
The lower third ships as a Remotion composition ( + zod + , name/role/theme as props) — enter/dwell/exit all driven by , never / / timers. Deliverable = + the project (re-render per roster row). 9:16 vertical (1080×1920) is the default.
<Composition>schemadefaultPropsuseCurrentFrame()Date.now()Math.random()out/*.mp4Verify loop — render stills → inspect → encode. Sample the three phases so you catch a stagger or safe-area bug before encoding (or batching the whole roster).
bash
undefined打包工具():使用scripts/拼接静帧,然后使用scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png验证编码。详见scripts/probe-mp4.sh out.mp4 [WxH] [fps]。scripts/README.md
Lower Third以Remotion合成组件形式交付( + zod + ,姓名/职位/主题为属性)——入场/停留/退场均由驱动,绝不使用 / / 计时器。交付物 = + 项目文件(可按名单行重新渲染)。默认画幅为9:16竖屏(1080×1920)。
<Composition>schemadefaultPropsuseCurrentFrame()Date.now()Math.random()out/*.mp4验证流程——渲染静帧→检查→编码。采样三个阶段的帧,在编码(或批量渲染整个名单)前发现分步入场或安全区域的问题。
bash
undefinedStills at enter / dwell / exit — WITH SHIPPED PROPS (a real roster row, not defaults)
渲染入场/停留/退场阶段的静帧——使用真实名单行属性(而非默认值)
npx remotion still LowerThird out/f-enter.png --frame=10 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-dwell.png --frame=75 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-exit.png --frame=N --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-enter.png --frame=10 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-dwell.png --frame=75 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion still LowerThird out/f-exit.png --frame=N --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
Inspect each PNG — focus the DWELL frame (fully on screen):
检查每个PNG——重点关注停留帧(完全显示状态):
- hierarchy holds: name dominant (>=1.6x role), role in brand accent; both fully revealed, not mid-wipe
- 层级清晰:姓名主导(字号≥职位1.6倍),职位使用品牌强调色;两者完全显示,非半擦除状态
- brand lock: font, accent color, bar/scrim correct; legible over the plate
- 品牌统一:字体、强调色、背景条/遮罩正确;在背景上清晰可读
- 9:16 safe area: band LIFTED above the bottom ~20-35% UI zone, clear of top ~12% and the right action rail; left-anchored inside title-safe
- 9:16安全区域:字幕条上移至底部约20-35%的UI区域之上,避开顶部约12%区域和右侧操作栏;左锚定在标题安全区内
- enter/exit frames show partial reveal (animation actually runs), not a hard cut
- 入场/退场帧显示部分揭示状态(动画实际运行),而非硬切
npx remotion render LowerThird out/lower-third.mp4 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion render LowerThird out/demo.gif --codec=gif # README proof clip
**Batch roster**: verify ONE row via stills *before* rendering all names — catch a layout/overflow bug once, not N times. Use `npx remotion compositions` for `durationInFrames`/`fps` to pick the dwell + exit frames.
**Before you finish:**
1. Stills render cleanly at enter, dwell, and exit — no missing font/brand assets.
2. At the dwell frame: name dominant over role, brand accent + bar correct, fully (not partly) revealed.
3. The band is inside the 9:16 safe area — lifted above the bottom UI zone, clear of top and right rail — at every checked frame.
4. Frame-driven only — no `Date.now()` / `Math.random()` / timers; enter/exit show motion, never a hard cut.
5. A real roster row (not `defaultProps`) renders correctly; MP4 encoded, GIF optional.npx remotion render LowerThird out/lower-third.mp4 --props='{"name":"Ada Lovelace","role":"Founder, Analytical Engines"}'
npx remotion render LowerThird out/demo.gif --codec=gif # README演示动图
**批量渲染名单**:在渲染所有姓名前先验证一行——只需要发现一次布局/溢出问题,而非N次。使用`npx remotion compositions`获取`durationInFrames`/`fps`来选择停留和退场帧。
**完成前检查**:
1. 入场、停留、退场阶段的静帧渲染正常——无缺失字体/品牌资源。
2. 停留帧:姓名比职位更突出,品牌强调色+背景条正确,完全显示(非部分显示)。
3. 字幕条位于9:16安全区域内——上移至底部UI区域之上,避开顶部和右侧操作栏——所有检查帧均符合要求。
4. 仅由帧驱动——无`Date.now()` / `Math.random()` / 计时器;入场/退场显示动效,无硬切。
5. 真实名单行(非`defaultProps`)渲染正常;MP4已编码,GIF可选。Reference files
参考文件
- — a complete runnable lower-third: a Remotion component with staggered spring enter, readable hold, and faster exit driven purely by frame; a typed theme object for brand lock; the list→many-instances sequencing pattern; a per-row batch render script; plus a dependency-free CSS/HTML version of the same design with mask-reveal and wipe-bar variants.
references/lower-third-component.md
- —— 完整可运行的Lower Third组件:基于Remotion的组件,包含分步弹性入场、可读停留、帧驱动的快速退场;用于品牌统一的类型化主题对象;列表→多实例的序列模式;逐行批量渲染脚本;以及无依赖的CSS/HTML版本,包含蒙版揭示和背景条擦除变体。
references/lower-third-component.md