Remotion LabRemotion Lab
返回模板庫

分割螢幕片頭

畫面左右兩格分別從螢幕外側以彈性動畫滑入,搭配藍色中央分隔線消逝效果,左格呈現副標題、右格依序滑入主標題與下方說明文字,打造強烈的雙欄視覺衝擊。

片頭分割螢幕彈性動畫
提示詞(可直接修改內容)
import React from "react";
import { AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion";

export const SplitScreenIntro: React.FC = () => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  // 左格從左外側滑入:frame 0-40,spring damping 22 stiffness 120
  const leftSpring = spring({ frame, fps, config: { damping: 22, stiffness: 120 } });
  const leftX = interpolate(leftSpring, [0, 1], [-960, 0]);

  // 右格從右外側滑入:frame 0-40,同 spring
  const rightSpring = spring({ frame, fps, config: { damping: 22, stiffness: 120 } });
  const rightX = interpolate(rightSpring, [0, 1], [960, 0]);

  // 分隔線 frame 90 消失
  const dividerOpacity = interpolate(frame, [85, 100], [1, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // 左格副標題 frame 30 fade in
  const subtitleOpacity = interpolate(frame, [30, 55], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // 右格主標題 frame 45 從下方滑入
  const titleSpring = spring({ frame: frame - 45, fps, config: { damping: 22, stiffness: 120 } });
  const titleY = interpolate(titleSpring, [0, 1], [60, 0]);
  const titleOpacity = interpolate(frame, [45, 75], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 100:右格下方副標題淡入
  const bottomSubtitleOpacity = interpolate(frame, [100, 125], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  return (
    <AbsoluteFill
      style={{
        background: "#0f172a",
        overflow: "hidden",
      }}
    >
      {/* 左格 */}
      <div
        style={{
          position: "absolute",
          top: 0,
          left: 0,
          width: 960,
          height: 1080,
          background: "#1e293b",
          transform: `translateX(${leftX}px)`,
          display: "flex",
          flexDirection: "column",
          alignItems: "center",
          justifyContent: "center",
          overflow: "hidden",
        }}
      >
        <div
          style={{
            opacity: subtitleOpacity,
            fontSize: 28,
            color: "#94a3b8",
            fontFamily: "sans-serif",
            letterSpacing: "4px",
            textTransform: "uppercase",
            fontWeight: 400,
            textAlign: "center",
          }}
        >
          Subtitle Text
        </div>
      </div>

      {/* 右格 */}
      <div
        style={{
          position: "absolute",
          top: 0,
          left: 960,
          width: 960,
          height: 1080,
          background: "#0f172a",
          transform: `translateX(${rightX}px)`,
          display: "flex",
          flexDirection: "column",
          alignItems: "center",
          justifyContent: "center",
          gap: 32,
          overflow: "hidden",
        }}
      >
        {/* 主標題 */}
        <div
          style={{
            opacity: titleOpacity,
            transform: `translateY(${titleY}px)`,
            fontSize: 72,
            fontWeight: 800,
            color: "#ffffff",
            fontFamily: "sans-serif",
            textAlign: "center",
            lineHeight: 1.1,
          }}
        >
          Main Title
        </div>

        {/* 右格下方副標題 */}
        <div
          style={{
            opacity: bottomSubtitleOpacity,
            fontSize: 24,
            color: "#94a3b8",
            fontFamily: "sans-serif",
            textAlign: "center",
            fontWeight: 300,
            letterSpacing: "2px",
          }}
        >
          Additional Subtitle
        </div>
      </div>

      {/* 中間分隔線(4px 亮線) */}
      <div
        style={{
          position: "absolute",
          top: 0,
          left: 958,
          width: 4,
          height: 1080,
          background: "#3b82f6",
          opacity: dividerOpacity,
          zIndex: 10,
        }}
      />
    </AbsoluteFill>
  );
};

登入後查看完整程式碼