Remotion LabRemotion Lab
返回模板庫

網紅私訊裡充滿粉絲問題

動畫展示網紅手機私訊被粉絲問題淹沒的場景,說明 KOL 能透過粉絲 DM 精準掌握粉絲需求。

KOL行銷受眾洞察分發策略
提示詞(可直接修改內容)
import React from "react";
import {
  AbsoluteFill,
  useCurrentFrame,
  useVideoConfig,
  interpolate,
  spring,
} from "remotion";

export const INFLUENCER-DMS-DURATION-FRAMES = 180;

const DM-MESSAGES = [
  { text: "請問哪個產品好?", x: -200, y: -80, delay: 30 },
  { text: "有推薦嗎?", x: 120, y: -100, delay: 45 },
  { text: "怎麼用比較好?", x: -180, y: 20, delay: 60 },
  { text: "這個有效嗎?", x: 140, y: 0, delay: 75 },
  { text: "哪裡可以買?", x: -150, y: 110, delay: 90 },
  { text: "有優惠碼嗎?", x: 100, y: 100, delay: 105 },
];

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

  const fadeIn = interpolate(frame, [0, 8], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const fadeOut = interpolate(frame, [160, 180], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" });
  const masterOpacity = Math.min(fadeIn, fadeOut);

  const titleSpring = spring({ frame: Math.max(0, frame - 5), fps, config: { damping: 14, stiffness: 90 } });
  const phoneSpring = spring({ frame: Math.max(0, frame - 20), fps, config: { damping: 12, stiffness: 90 } });
  const dmSprings = DM-MESSAGES.map((dm) =>
    spring({ frame: Math.max(0, frame - dm.delay), fps, config: { damping: 12, stiffness: 100 } })
  );
  const insightSpring = spring({ frame: Math.max(0, frame - 130), fps, config: { damping: 12, stiffness: 80 } });

  return (
    <AbsoluteFill
      style={{
        background: "linear-gradient(135deg, #0A0E14 0%, #111825 100%)",
        display: "flex",
        flexDirection: "column",
        alignItems: "center",
        justifyContent: "center",
        opacity: masterOpacity,
        fontFamily: "'Noto Sans TC', 'Inter', sans-serif",
      }}
    >
      <div style={{ opacity: titleSpring, transform: `translateY(${(1 - titleSpring) * 20}px)`, fontSize: 57, fontWeight: 700, color: "#FFFFFF", textAlign: "center", marginBottom: 12 }}>
        網紅私訊裡<span style={{ color: "#F59E0B" }}>充滿粉絲的問題</span>
      </div>
      <div style={{ opacity: titleSpring * 0.4, fontSize: 28, color: "rgba(255,255,255,0.4)", fontFamily: "'Inter', sans-serif", fontStyle: "italic", marginBottom: 30 }}>
        Influencer DMs are filled with fan questions
      </div>

      {/* Phone + DMs */}
      <div style={{ position: "relative", width: 600, height: 380 }}>
        {/* Phone center */}
        <div style={{ position: "absolute", left: "50%", top: "50%", transform: `translate(-50%, -50%) scale(${phoneSpring})`, opacity: phoneSpring }}>
          <div style={{ width: 80, height: 140, background: "rgba(245,158,11,0.15)", border: "3px solid #F59E0B", borderRadius: 16, display: "flex", alignItems: "center", justifyContent: "center" }}>
            <div style={{ fontSize: 36 }}>📱</div>
          </div>
        </div>

        {/* DM bubbles */}
        {DM-MESSAGES.map((dm, i) => (
          <div
            key={i}
            style={{
              position: "absolute",
              left: `calc(50% + ${dm.x}px)`,
              top: `calc(50% + ${dm.y}px)`,
              transform: `translate(-50%, -50%) scale(${dmSprings[i]})`,
              opacity: dmSprings[i],
              background: "rgba(77,163,255,0.12)",
              border: "1.5px solid rgba(77,163,255,0.3)",
              borderRadius: 10,
              padding: "8px 16px",
              fontSize: 18,
              color: "rgba(255,255,255,0.7)",
              whiteSpace: "nowrap",
            }}
          >
            {dm.text}
          </div>
        ))}
      </div>

      {/* Insight */}
      <div style={{ opacity: insightSpring, transform: `translateY(${(1 - insightSpring) * 15}px)`, fontSize: 33, color: "#F59E0B", fontWeight: 700, textAlign: "center" }}>
        → 能精準掌握粉絲需要什麼
      </div>
    </AbsoluteFill>
  );
};

登入後查看完整程式碼