Motion · Kết
Ba hàng đèn neon chạy chữ
Ba hàng đèn neon chạy chữ ngược chiều (BETTER/FASTER/STRONGER) cuộn vô tận, lần lượt sáng theo pha rồi mờ dần.
Nguồn: video-shotcraft (Vincent Wei) ↗ · Apache-2.0 · Composition Remotion (React/TSX) — có video preview, không có player trong trình duyệt
Khi nào dùng
Đoạn recap từ khóa chủ đề ở outro; nhịp "dư âm" cho khẩu hiệu ba từ (hạ một bậc sau cú đập của cel-flash-stomp); đoạn nhạc không lời bình
Ý đồ
Một hàng marquee chỉ là trang trí web. Xếp chồng ba hàng, đảo chiều ở hàng chẵn/lẻ, rồi cho độ sáng luân phiên theo pha, nó trở thành "các từ khóa chủ đề diễu hành trước mắt người xem". Mấu chốt là sáng luân phiên: tại mỗi thời điểm chỉ một hàng là ngôi sao neon, các hàng còn lại tối xuống thành nền viền mảnh — ba hàng cùng sáng là sự cố biển hiệu, luân phiên sáng mới là recap. Hai chiều cuộn ngược nhau (hàng trên/dưới sang phải, hàng giữa sang trái) tạo cảm giác "bao vây": mắt bị kẹp ở giữa khi chữ trôi qua liên tục từ hai bên, đọc thành "ba từ này nói không hết".
Thời lượng & năng lượng
- Thời lượng: 4–5s (demo 150f: 10f mờ vào + phần lặp + 20f mờ ra)
- Năng lượng: Trung bình cao (chuyển động liên tục + xung theo từng hàng, không có cú va chạm tức thời)
Công thức cảnh quay (bản gốc tiếng Trung — timing, easing, bảng tham số, lỗi hay gặp)
意图
一行 marquee 只是网页装饰;三行叠起来、奇偶反向、再让亮度按相位轮流 走,就成了"主题词在观众眼前列队巡游"。命门是明暗轮唱:任一时刻 只有一行是霓虹主角,其余压暗成细描边背景——三行全亮是灯牌事故, 轮流亮才是 recap。反向对滚制造"包围感":上下行向右、中行向左, 视线被夹在中间,词从两侧源源不断流过,读作"这三个词说不完"。
动效核心
- 无缝回绕:副本按固定 unitW 等距绝对定位,
(frame*speed) % unitW
取模平移——匀速 linear(marquee 类是库内 linear 豁免项)
- 空心描边字:
-webkit-text-stroke,color transparent;亮度脉冲
同时驱动三件事——描边宽 5→8px、opacity 0.35→1、双层 drop-shadow 辉光(8→30px + 20→70px)——只调 opacity 不调辉光读不出"霓虹通电"
- 轮唱相位:周期 45f,行间相位差 15f(周期/3),余弦软包络且每行
只占周期前 1/3 亮、后 2/3 归零——保证"一亮俩暗"永远成立
- 三行配色蓝/粉/琥珀(#4d9fff/#ff4dd2/#ffb347),深底 #050308;
中行反向且略快(14/17/14 px/f)——同速对滚读作镜像,破掉
- 词尾加分隔点(•)撑词间距,unitW = 估宽 + 1.3 倍字号空隙
参数表
| 参数 | 典型值 | 调节手感 | |------|--------|----------| | 字号/行距 | 300px,行距 350px 排满 1080 | 行间留白 >80px 读作三条横幅广告而非一面词墙 | | 滚速 | 14/17/14 px/f,中行反向 | >25 读不清词只见光带;三行同速同向读作整版平移 | | 脉冲周期 | 45f,相位差 15f | 周期 <30f 三行抢闪读作故障;>70f 轮唱感断掉 | | 亮度区间 | opacity 0.35→1 + stroke 5→8px | 暗态 <0.25 暗行消失,"三行"结构丢了 | | 辉光 | 双层 drop-shadow,亮态 30/70px | 单层或 <20px 读作普通描边字不读作霓虹 | | 淡入淡出 | 入 10f / 出 20f 整组 opacity | 循环体无始无终,掐头去尾全靠这两端;硬切进出读作素材没铺满 |
已知坑
- demo 在灰阶/占位素材上调校通过——参数是调校起点非实战定稿,
首次实战须以真实素材回验
- 与 page-waterfall-wall 分工:那卡是页面截图纵向瀑布做"内容体量感",
本卡是文字行横向对滚做"主题词余韵"——素材是词不是页,位置在片尾不在中段
- 与 outro-group-photo-launch 分工:全家福是峰值终镜(元素合影+发布会收场),
本卡是终镜前的 recap 铺垫或低成本备选终镜,两者可串(本卡→淡出→全家福)不可叠
- 与 cel-flash-stomp 同吃"三连词口号"文案:那卡逐词砸(高能宣告),
本卡整组滚(余韵复读)——同一组词全片最多各用一次,先砸后滚顺序不可反
- 副本数按
ceil(1920/unitW)+3留冗余——短词(≤4 字符)unitW 小,
副本不足会在回绕瞬间露右侧空缺
- 实战品牌色版:三行可统一品牌色靠明暗区分,但辉光对比须 ≥ demo 的
0.35→1 幅度,不然轮唱读不出来
参考实现
demos/outro/neon-triple-marquee/ (NeonTripleMarquee.tsx) 原片出处:clickup-30 61–64.5s
Mã nguồn tham chiếu (Remotion)
- demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx
Component import fixture chung từ demos/_fixtures và helper từ assets/lib của repo; xem SKILL.md trong repo để biết quy trình render.
Mọi thứ trên trang này đều có bản máy đọc. Đưa agent link JSON, hoặc thêm MCP server gimgs rồi bảo nó tìm motion template.
- Tải JSON — trong đó có công thức cảnh quay (timing, easing, bảng tham số, lỗi hay gặp) và toàn bộ source TSX.
- Clone repo video-shotcraft; component import fixture chung từ demos/_fixtures và helper từ assets/lib.
- Đăng ký component thành <Composition> trong project Remotion rồi render bằng `npx remotion render`, hoặc dựng lại công thức bằng engine của bạn.
curl -s https://gimgs.net/motion/neon-triple-marquee.jsongit clone https://github.com/Vincentwei1021/video-shotcraft
# component: demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx
npx remotion render <CompositionId> out.mp4claude mcp add --transport http gimgs https://gimgs.net/mcp
# then: search_motion_templates / get_motion_template("neon-triple-marquee")Prompt
Use the video-shotcraft shot recipe "Ba hàng đèn neon chạy chữ" (Remotion composition, Apache-2.0) published on gimgs.net. Recipe JSON (prompt = timing/easing/parameter table/pitfalls, files = TSX source): https://gimgs.net/motion/neon-triple-marquee.json Raw TSX: https://gimgs.net/motion/neon-triple-marquee/template.html Repository: https://github.com/Vincentwei1021/video-shotcraft (component: demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx; imports demos/_fixtures and assets/lib) Spec: 1920x1080, 30 fps, 5.06s 1. Read the JSON and follow its "prompt" section (when to use, intention, parameter table, known pitfalls). 2. Adapt it for: <describe what you want>. 3. Either clone the repo, register the component as a <Composition> in a Remotion project and run npx remotion render <CompositionId> out.mp4 — or re-implement the recipe in your own engine (HTML/WAAPI works: keep the same timing and easing).
// ===== demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx =====
// neon-triple-marquee —— clickup-30 61–64.5s
// 三行霓虹描边巨字 BETTER/FASTER/STRONGER 满屏排布,
// 奇偶行反向匀速无限滚动(marquee 允许 linear),
// 三行明暗轮流脉冲(一行亮时其余压暗),结尾整组淡出。
import React from 'react';
import { AbsoluteFill, useCurrentFrame, interpolate } from 'remotion';
const FONT = '"Arial Black", "Helvetica Neue", Arial, sans-serif';
// 单行 marquee:副本按固定 unitW 等距绝对定位,平移取模 → 回绕无缝。
const MarqueeRow: React.FC<{
word: string;
color: string;
dir: 1 | -1;
speed: number; // px/frame
frame: number;
y: number;
fontSize: number;
brightness: number; // 0..1 脉冲亮度
}> = ({ word, color, dir, speed, frame, y, fontSize, brightness }) => {
// 逐字符估宽(上限估计),保证槽位 >= 实际文本宽,副本不重叠
const est = word.length * fontSize * 0.92;
const unitW = est + fontSize * 1.3; // 词间空隙(含分隔点)
const copies = Math.ceil(1920 / unitW) + 3;
const offsetRaw = (frame * speed) % unitW;
const offset = dir === 1 ? -unitW * 1.5 + offsetRaw : -unitW * 0.5 - offsetRaw;
const strokeW = 5 + brightness * 3;
return (
<div
style={{
position: 'absolute',
top: y,
left: 0,
width: '100%',
height: fontSize * 1.1,
overflow: 'visible',
transform: `translateX(${offset}px)`,
fontFamily: FONT,
fontWeight: 900,
fontSize,
letterSpacing: 4,
lineHeight: 1,
color: 'transparent',
WebkitTextStroke: `${strokeW}px ${color}`,
opacity: 0.35 + brightness * 0.65,
filter: `drop-shadow(0 0 ${8 + brightness * 22}px ${color}) drop-shadow(0 0 ${
20 + brightness * 50
}px ${color})`,
}}
>
{Array.from({ length: copies }).map((_, i) => (
<span
key={i}
style={{ position: 'absolute', left: i * unitW, top: 0, whiteSpace: 'nowrap' }}
>
{word}
<span style={{ display: 'inline-block', transform: `translateX(${fontSize * 0.4}px)` }}>
{'•'}
</span>
</span>
))}
</div>
);
};
export const NeonTripleMarquee: React.FC = () => {
const f = useCurrentFrame();
// 三行轮流脉冲:周期 45 帧,每行占 1/3 相位,余弦软脉冲
const pulse = (idx: number) => {
const period = 45;
const phase = (((f - idx * (period / 3)) % period) + period) % period;
const t = phase / period;
if (t < 1 / 3) return 0.5 - 0.5 * Math.cos(t * 3 * Math.PI * 2);
return 0;
};
// 入场淡入 + 结尾整组淡出
const groupOpacity = interpolate(f, [0, 10, 128, 148], [0, 1, 1, 0], {
extrapolateLeft: 'clamp',
extrapolateRight: 'clamp',
});
const rows: { word: string; color: string; dir: 1 | -1; speed: number }[] = [
{ word: 'BETTER', color: '#4d9fff', dir: 1, speed: 14 },
{ word: 'FASTER', color: '#ff4dd2', dir: -1, speed: 17 },
{ word: 'STRONGER', color: '#ffb347', dir: 1, speed: 14 },
];
return (
<AbsoluteFill style={{ background: '#050308', overflow: 'hidden' }}>
<div style={{ opacity: groupOpacity, position: 'absolute', inset: 0 }}>
{rows.map((r, i) => (
<MarqueeRow
key={r.word}
word={r.word}
color={r.color}
dir={r.dir}
speed={r.speed}
frame={f}
y={40 + i * 350}
fontSize={300}
brightness={pulse(i)}
/>
))}
</div>
</AbsoluteFill>
);
};
- Read the recipePrompt = when to use, intention, parameter table with typical values and how each one feels, known pitfalls. Treat values as calibrated starting points.
- Get the codetool: git
git clone https://github.com/Vincentwei1021/video-shotcraft && cd video-shotcraft && npm install - Register + rendertool: remotion
npx remotion render <CompositionId> out.mp4 # component: demos/outro/neon-triple-marquee/NeonTripleMarquee.tsx - Or re-implementPort the timing/easing from the recipe to HTML + WAAPI (gimgs motion contract) or any engine; keep the same segment windows and easing.
| param | type | default | description |
|---|---|---|---|
| — | |||
Cùng danh mục

UI biến hình thành logo thương hiệu
Hai kiểu UI biến thành logo — icon-flip-bloom icon lật phẳng trục Y nở thành hình hoa mark + wordmark vào từng chữ, và input-morph-assemble ô nhập liệu co lại thành viên nang, ba hạt hình học tụ thành một cánh logo.

Kết phim kiểu phép trừ
Kết phim kiểu phép trừ — bấm Publish xong, toàn bộ UI trình soạn bốc hơi từng lớp lệch nhịp từ ngoài vào trong, chỉ còn lại nút vừa bấm trượt vào tâm màn hình phóng to, rồi mờ đi trao lại cho chữ hiệu định vị.

Outro ảnh nhóm ra mắt
Mọi yếu tố trong phim bay vào từ mọi hướng vây quanh wordmark chụp ảnh nhóm, dàn dựng như cảnh chốt của một sự kiện ra mắt.

Logo thu nhỏ ráp thành lockup
Vòng tròn neon cắt hở khổng lồ nhanh chóng thu về thành một chữ O trắng đặc nhỏ ở giữa kèm vượt ngưỡng rồi phanh lại, icon dịch trái nhường chỗ, các chữ cái lần lượt trượt vào hoàn thành lockup, khẩu hiệu kết thúc.