Remotion LabRemotion Lab
返回模板庫

幕簾轉場

場景 A 被一分為二,左半門向左平移、右半門向右平移,如同劇場大幕緩緩拉開,露出幕後的場景 B。

轉場幕簾分割
提示詞(可直接修改內容)
import React from "react";
import { AbsoluteFill, interpolate, useCurrentFrame } from "remotion";

const SceneA: React.FC = () => (
  <div
    style={{
      width: 1920,
      height: 1080,
      background: "linear-gradient(135deg, #1e3a5f 0%, #0f172a 100%)",
      display: "flex",
      justifyContent: "center",
      alignItems: "center",
    }}
  >
    <div
      style={{
        fontSize: 80,
        fontWeight: 700,
        color: "#ffffff",
        fontFamily: "sans-serif",
      }}
    >
      Scene A
    </div>
  </div>
);

const SceneB: React.FC = () => (
  <AbsoluteFill
    style={{
      background: "linear-gradient(135deg, #1a0533 0%, #0f0a1a 100%)",
      justifyContent: "center",
      alignItems: "center",
    }}
  >
    <div
      style={{
        fontSize: 80,
        fontWeight: 700,
        color: "#ffffff",
        fontFamily: "sans-serif",
      }}
    >
      Scene B
    </div>
  </AbsoluteFill>
);

export const CurtainTransition: React.FC = () => {
  const frame = useCurrentFrame();

  const leftTranslateX = interpolate(frame, [20, 70], [0, -960], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  const rightTranslateX = interpolate(frame, [20, 70], [0, 960], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  return (
    <AbsoluteFill style={{ overflow: "hidden" }}>
      {/* 底層:場景 B */}
      <SceneB />

      {/* 上層左半門 */}
      <div
        style={{
          position: "absolute",
          top: 0,
          left: 0,
          width: 960,
          height: 1080,
          overflow: "hidden",
          transform: `translateX(${leftTranslateX}px)`,
        }}
      >
        {/* 場景 A 靠左,顯示左半部 */}
        <SceneA />
      </div>

      {/* 上層右半門 */}
      <div
        style={{
          position: "absolute",
          top: 0,
          left: 960,
          width: 960,
          height: 1080,
          overflow: "hidden",
          transform: `translateX(${rightTranslateX}px)`,
        }}
      >
        {/* 場景 A 向左偏移 960px,顯示右半部 */}
        <div style={{ marginLeft: -960 }}>
          <SceneA />
        </div>
      </div>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼