Remotion LabRemotion Lab
返回模板庫

極簡圓點 Logo

Apple/Nike 極簡風格 Logo 動畫。畫面中央一個白色小圓點從無到有,以 spring 緩慢展開為 120px 圓形 icon,內部出現抽象「進展」箭頭符號,品牌名從右側淡入滑出,下方細橫線展開,最後 tagline 帶著大字距淡入。大量留白,強調精緻感。

Logo動畫極簡圓形品牌科技
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  interpolate,
  spring,
  useCurrentFrame,
  useVideoConfig,
} from "remotion";

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

  // frame 0-30:中央小圓點 scale(0)→scale(1) spring
  const dotInitScale = spring({
    frame,
    fps,
    config: { damping: 20, stiffness: 200 },
    durationInFrames: 30,
  });

  // frame 25-60:圓點直徑從 12→120px(spring,輕微 overshoot)
  const dotExpandScale = spring({
    frame: frame - 25,
    fps,
    config: { damping: 12, stiffness: 160 },
    durationInFrames: 35,
  });

  // 圓點當前直徑
  const dotDiameter = interpolate(dotExpandScale, [0, 1], [12, 120], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // 最終視覺直徑(phase 1 先把點縮放出來,phase 2 再展開)
  const currentDiameter = frame < 25 ? 12 * dotInitScale : dotDiameter;

  // frame 55-80:icon 內部斜線 opacity 0→1
  const iconLineOpacity = interpolate(frame, [55, 80], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 70-95:品牌名「Dot Studio」淡入 + translateX
  const brandOpacity = interpolate(frame, [70, 95], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });
  const brandX = interpolate(frame, [70, 95], [20, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 88-108:品牌名下方細橫線展開(clip-path)
  const lineClip = interpolate(frame, [88, 108], [100, 0], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // frame 102-120:tagline 淡入
  const taglineOpacity = interpolate(frame, [102, 120], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
  });

  // 水平排列:icon 在左,文字在右
  const iconCenterX = 960 - 160;
  const iconCenterY = 540;

  return (
    <AbsoluteFill
      style={{
        background: "#0f0f0f",
        justifyContent: "center",
        alignItems: "center",
      }}
    >
      {/* 左側 icon 圓形 */}
      <div
        style={{
          position: "absolute",
          left: iconCenterX - currentDiameter / 2,
          top: iconCenterY - currentDiameter / 2,
          width: currentDiameter,
          height: currentDiameter,
          borderRadius: "50%",
          background: "#ffffff",
          display: "flex",
          justifyContent: "center",
          alignItems: "center",
          overflow: "hidden",
        }}
      >
        {/* 內部抽象「進展」符號:斜線從左下到右上 */}
        <svg
          width={currentDiameter}
          height={currentDiameter}
          viewBox="0 0 120 120"
          style={{ opacity: iconLineOpacity }}
        >
          {/* 左下到右上斜線 */}
          <line
            x1="28"
            y1="88"
            x2="92"
            y2="32"
            stroke="#0f0f0f"
            strokeWidth="6"
            strokeLinecap="round"
          />
          {/* 右上端箭頭(短横線) */}
          <line
            x1="92"
            y1="32"
            x2="72"
            y2="30"
            stroke="#0f0f0f"
            strokeWidth="6"
            strokeLinecap="round"
          />
          <line
            x1="92"
            y1="32"
            x2="90"
            y2="52"
            stroke="#0f0f0f"
            strokeWidth="6"
            strokeLinecap="round"
          />
        </svg>
      </div>

      {/* 右側文字區 */}
      <div
        style={{
          position: "absolute",
          left: iconCenterX + 72,
          top: iconCenterY - 50,
          display: "flex",
          flexDirection: "column",
          gap: 0,
        }}
      >
        {/* 品牌名 */}
        <div
          style={{
            fontSize: 56,
            fontWeight: 300,
            color: "#ffffff",
            fontFamily: "sans-serif",
            letterSpacing: "-0.01em",
            lineHeight: 1.1,
            opacity: brandOpacity,
            transform: `translateX(${brandX}px)`,
            whiteSpace: "nowrap",
          }}
        >
          Dot Studio
        </div>

        {/* 細橫線 */}
        <div
          style={{
            height: 1,
            background: "#ffffff",
            marginTop: 10,
            clipPath: `inset(0 ${lineClip}% 0 0)`,
            width: 260,
          }}
        />

        {/* tagline */}
        <div
          style={{
            marginTop: 10,
            fontSize: 13,
            fontWeight: 400,
            color: "#6b7280",
            fontFamily: "sans-serif",
            letterSpacing: "6px",
            opacity: taglineOpacity,
            whiteSpace: "nowrap",
          }}
        >
          Less. Better.
        </div>
      </div>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼