卡拉 OK 高亮
整行先以暗色显示,每个词被念到时填上品牌色。
实时循环 · 8 秒 · 1920×1080 · 24 fps
参数
| 参数 | 类型 | 作用 |
|---|---|---|
| lines (必填) | [{text, start, end, words?}] | 字幕行,时间是镜头内毫秒;可选逐词时间 words [{text, start, end}] |
| kicker | string | lowerThird:文字上方的短标签 |
| size | px | 字号(默认按变体 48–72) |
| maxChars | number默认: 38 / 16 CJK | 超过这个字数就拆成两行均衡的字幕 |
| bottom | px默认: 120 | 离底边的距离(在标题安全区内) |
| ease | {"<move>": ease} | 重调任一具名动作(见本条的动作表):预设名("out-expo")、三次贝塞尔 [x1, y1, x2, y2]、{spring: [频率, 阻尼]} 或 {trapezoid: [加速, 减速]}。动作名或曲线写错会直接报错,绝不悄悄退回默认。参考片里量出来的动作(复刻工作台 measure/*.json,按帧号存)不用手工转换:MV.fitEase(doc, "x", {from: 133, to: 142}) 或 motion-fit <文件> --measure x --from 133 --to 142 --ease 直接得到曲线 |
| brand | hex默认: #6B5BFF | 网站的品牌色;组件由它推出强调色(在舞台上对比度 ≥ 3:1)、面板色和文字色 |
| stage | "dark" | "light"默认: "dark" | 组件所在的舞台:深色或浅色 |
| display | font stem默认: "Inter-Bold" | 标题字体;在调用里写出它的名字,运行时才会加载 |
| body | font stem默认: "Inter-Regular" | 界面 / 正文字体;在调用里写出它的名字,运行时才会加载 |
| start_ms | ms默认: 300 | 组件开始的时间,镜头内的毫秒数 |
| background | boolean默认: false | 画出舞台背景(关闭时透明,叠在镜头自己的背景上) |
| place | {x, y, w, h, z?} | 组件在镜头布局里的位置:把它 1920x1080 的构图缩放进这个舞台矩形(居中、保持比例);z 决定组件之间的前后。默认整个舞台 |
动作与缓动曲线
每个动作都有自己的缓动。用 ease: { "<动作>": <曲线> } 重调其中一个,可写曲线名或贝塞尔手柄。
| 动作 | 曲线 | 作用 |
|---|---|---|
| line.in | out-cubic | 开口前这一行上移 16 px 淡入 |
| line.out | in-quad | 说完后这一行淡出 |
| word.wipe | linear | 说到哪个词品牌色就扫过哪个词(跟着声音,保持线性) |
本演示的取值
| variant | "karaoke" |
|---|---|
| lines | [{"text":"贴一个链接,LaunchReel 写好脚本。","start":300,"end":3600},{"text":"再把每个镜头做成动画。","start":3800,"end":6800}] |
| brand | #6B5BFF |
| stage | dark |
<script src="/vendor/motion-vocab.js"></script>
MV.bind("s3", MV.captions(el, {"variant":"karaoke","lines":[{"text":"贴一个链接,LaunchReel 写好脚本。","start":300,"end":3600},{"text":"再把每个镜头做成动画。","start":3800,"end":6800}],"brand":"#6B5BFF","stage":"dark","display":"NotoSansSC-Bold","body":"NotoSansSC-Regular"}));在发布片里什么时候用
有旁白但多半静音观看的片子:观众按说话人的速度跟读。
为什么有效
填色标出正在念的词而不移动文字,阅读不被打断。
不要和这些一起用
- 没有旁白的行(高亮就没有节拍)
- 超过约 60 个字符的文字(手机 720p 上像一堵墙)
在片中的作用
自然时长
2.0–12.0 秒