定位針落下 Logo
地點/服務類品牌 Logo 動畫。紅色定位針從畫面上方急速落下,著地瞬間產生輕微壓縮彈跳與陰影暈散,圓形部分隨即以 spring 展開放大,品牌縮寫「LC」從內部彈出,品牌名與副標語依序滑入淡出。動感十足,適合地圖、外送、旅遊類品牌。
Logo動畫定位針地圖服務品牌彈跳
提示詞(可直接修改內容)
import React from "react";
import {
AbsoluteFill,
interpolate,
spring,
useCurrentFrame,
useVideoConfig,
} from "remotion";
export const LogoPinDrop: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
// frame 0-20:定位針從 y:-300 落下到 y:0
const pinY = interpolate(frame, [0, 20], [-300, 0], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
easing: (t) => t * t, // 緩入(加速落下)
});
// frame 18-28:落地衝擊垂直方向壓縮彈跳(scaleY)
const impactScaleY = interpolate(
frame,
[18, 21, 24, 28],
[1.0, 1.08, 0.96, 1.0],
{
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
}
);
// frame 20-30:落地陰影圓圈從 scale(0)→scale(1)
const shadowScale = spring({
frame: frame - 20,
fps,
config: { damping: 25, stiffness: 300 },
durationInFrames: 10,
});
// frame 30-65:圓形部分從 120→200px(spring)
const circleExpand = spring({
frame: frame - 30,
fps,
config: { damping: 14, stiffness: 160 },
durationInFrames: 35,
});
const circleDiameter = interpolate(circleExpand, [0, 1], [120, 200], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
// frame 55-85:圓形內「LC」縮寫 scale(0)→(1)
const abbrevScale = spring({
frame: frame - 55,
fps,
config: { damping: 16, stiffness: 200 },
durationInFrames: 30,
});
// frame 80-105:「LocationCo.」文字從 y:+20→0 淡入
const nameOpacity = interpolate(frame, [80, 105], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
const nameY = interpolate(frame, [80, 105], [20, 0], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
// frame 98-118:副標語淡入
const taglineOpacity = interpolate(frame, [98, 118], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
// 定位針組合的中心 X/Y
const pinCenterX = 960;
const pinCenterY = 540 - 60;
// 尖角高度
const tipHeight = 50;
const tipBaseY = pinCenterY + circleDiameter / 2;
const tipTopY = tipBaseY + tipHeight;
const tipWidth = circleDiameter * 0.4;
return (
<AbsoluteFill
style={{
background: "#0f0f0f",
justifyContent: "center",
alignItems: "center",
}}
>
{/* 落地陰影(扁橢圓) */}
<div
style={{
position: "absolute",
left: pinCenterX - 60,
top: tipTopY + 4,
width: 120,
height: 20,
borderRadius: "50%",
background: "rgba(0,0,0,0.6)",
transform: `scaleX(${shadowScale})`,
transformOrigin: "center center",
}}
/>
{/* 定位針整體容器(含落地動畫) */}
<div
style={{
position: "absolute",
left: pinCenterX,
top: pinCenterY,
transform: `translateX(-50%) translateY(${pinY}px) scaleY(${impactScaleY})`,
transformOrigin: "bottom center",
display: "flex",
flexDirection: "column",
alignItems: "center",
}}
>
{/* 圓形部分 */}
<div
style={{
width: circleDiameter,
height: circleDiameter,
borderRadius: "50%",
background: "#ef4444",
display: "flex",
justifyContent: "center",
alignItems: "center",
flexShrink: 0,
position: "relative",
zIndex: 1,
}}
>
{/* 品牌縮寫「LC」 */}
<div
style={{
fontSize: 80,
fontWeight: 700,
color: "#ffffff",
fontFamily: "sans-serif",
letterSpacing: "-0.04em",
lineHeight: 1,
transform: `scale(${abbrevScale})`,
userSelect: "none",
}}
>
LC
</div>
</div>
{/* 尖角(等邊三角形,指向下方) */}
<div
style={{
width: 0,
height: 0,
borderLeft: `${tipWidth / 2}px solid transparent`,
borderRight: `${tipWidth / 2}px solid transparent`,
borderTop: `${tipHeight}px solid #ef4444`,
marginTop: -2,
flexShrink: 0,
}}
/>
</div>
{/* 品牌名「LocationCo.」 */}
<div
style={{
position: "absolute",
left: "50%",
top: tipTopY + 36,
transform: `translateX(-50%) translateY(${nameY}px)`,
fontSize: 44,
fontWeight: 600,
color: "#ffffff",
fontFamily: "sans-serif",
letterSpacing: "-0.01em",
opacity: nameOpacity,
whiteSpace: "nowrap",
}}
>
LocationCo.
</div>
{/* 副標語 */}
<div
style={{
position: "absolute",
left: "50%",
top: tipTopY + 36 + 56,
transform: "translateX(-50%)",
fontSize: 16,
fontWeight: 400,
color: "#6b7280",
fontFamily: "sans-serif",
letterSpacing: "2px",
opacity: taglineOpacity,
whiteSpace: "nowrap",
}}
>
Find your place.
</div>
</AbsoluteFill>
);
};登入後查看完整程式碼