返回 html-video
02-card-to-logo.html
1 <template id="02-card-to-logo-template">
2 <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
3
4 <div
5 data-composition-id="02-card-to-logo"
6 data-start="0"
7 data-duration="4"
8 data-width="1920"
9 data-height="1080"
10 >
11 <div class="stage-02">
12 <div class="grid-floor"></div>
13
14 <div class="red-card">
15 <div class="card-gloss"></div>
16 <div class="card-label">JIRA-2847</div>
17 </div>
18
19 <div class="linear-symbol">
20 <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
21 <defs>
22 <linearGradient id="grad-02" x1="0" y1="0" x2="1" y2="1">
23 <stop offset="0%" stop-color="#5E6AD2"/>
24 <stop offset="100%" stop-color="#A9B0F0"/>
25 </linearGradient>
26 </defs>
27 <path d="M 25 18 L 75 18 L 75 34 L 41 34 L 41 82 L 25 82 Z" fill="url(#grad-02)" />
28 </svg>
29 </div>
30
31 <div class="light-pillar"></div>
32 <div class="morph-streak"></div>
33 <div class="vignette"></div>
34 <div class="grain"></div>
35 </div>
36
37 <style>
38 [data-composition-id="02-card-to-logo"] {
39 position: absolute; inset: 0; overflow: hidden; background: #000;
40 }
41 [data-composition-id="02-card-to-logo"] .stage-02 { position: absolute; inset: 0; }
42 [data-composition-id="02-card-to-logo"] .grid-floor {
43 position: absolute; inset: 0;
44 transform: perspective(900px) rotateX(60deg) translateY(25%);
45 background:
46 repeating-linear-gradient(0deg, rgba(255,255,255,0.045) 0 1px, transparent 1px 80px),
47 repeating-linear-gradient(90deg, rgba(255,255,255,0.045) 0 1px, transparent 1px 80px);
48 background-color: #000;
49 }
50 [data-composition-id="02-card-to-logo"] .red-card {
51 position: absolute;
52 top: 50%; left: 50%;
53 width: 420px; height: 260px;
54 border-radius: 24px;
55 background:
56 linear-gradient(135deg, #e10b1f 0%, #a8081a 60%, #6a050f 100%);
57 box-shadow:
58 inset 0 1px 0 rgba(255,255,255,0.35),
59 0 30px 80px rgba(225,11,31,0.35);
60 transform: translate(-50%, -50%) perspective(900px) rotateX(10deg) rotateY(-6deg);
61 transform-origin: center center;
62 filter: blur(0px);
63 will-change: transform, opacity, filter;
64 }
65 [data-composition-id="02-card-to-logo"] .card-gloss {
66 position: absolute; inset: 0;
67 background: linear-gradient(120deg, rgba(255,255,255,0.25) 0%, transparent 45%);
68 border-radius: 24px;
69 pointer-events: none;
70 }
71 [data-composition-id="02-card-to-logo"] .card-label {
72 position: absolute;
73 top: 28px; left: 32px;
74 font: 700 22px/1 "SF Mono", ui-monospace, monospace;
75 letter-spacing: 0.15em;
76 color: rgba(255,255,255,0.85);
77 }
78 [data-composition-id="02-card-to-logo"] .linear-symbol {
79 position: absolute;
80 top: 50%; left: 50%;
81 width: 300px; height: 300px;
82 transform: translate(-50%, -50%) scale(0.6);
83 opacity: 0;
84 filter: drop-shadow(0 0 40px rgba(94,106,210,0.6));
85 will-change: transform, opacity;
86 }
87 [data-composition-id="02-card-to-logo"] .linear-symbol svg { width: 100%; height: 100%; }
88 [data-composition-id="02-card-to-logo"] .light-pillar {
89 position: absolute;
90 top: 10%; left: 50%;
91 width: 6px; height: 80%;
92 transform: translateX(-50%) scaleY(0);
93 transform-origin: center bottom;
94 background: linear-gradient(180deg, transparent 0%, rgba(169,176,240,0.5) 50%, transparent 100%);
95 filter: blur(4px);
96 opacity: 0;
97 }
98 [data-composition-id="02-card-to-logo"] .morph-streak {
99 position: absolute;
100 top: 50%; left: 0;
101 width: 80%; height: 14px;
102 background: linear-gradient(90deg, transparent, rgba(255,255,255,0.95), rgba(169,176,240,0.7), transparent);
103 filter: blur(10px);
104 transform: translate(-150%, -50%);
105 opacity: 0;
106 z-index: 20;
107 }
108 [data-composition-id="02-card-to-logo"] .vignette {
109 position: absolute; inset: 0; pointer-events: none;
110 background: radial-gradient(ellipse at center, transparent 30%, rgba(0,0,0,0.95) 95%);
111 opacity: 0.75;
112 }
113 [data-composition-id="02-card-to-logo"] .grain {
114 position: absolute; inset: 0; pointer-events: none;
115 opacity: 0.08;
116 background-image:
117 radial-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
118 radial-gradient(rgba(255,255,255,0.02) 1px, transparent 1px);
119 background-size: 3px 3px, 5px 5px;
120 }
121 </style>
122
123 <script>
124 (() => {
125 const SLOT = 4;
126 const tl = gsap.timeline({ paused: true });
127 const sel = (q) => `[data-composition-id="02-card-to-logo"] ${q}`;
128
129 tl.fromTo(sel('.red-card'),
130 { x: '-50%', y: '-150%', opacity: 0, filter: 'blur(20px)' },
131 { y: '-50%', opacity: 1, filter: 'blur(0px)', duration: 0.8, ease: 'power3.out' }, 0.1);
132
133 tl.to(sel('.red-card'),
134 { rotate: 3, duration: 1.5, ease: 'sine.inOut' }, 0.9);
135
136 tl.set(sel('.morph-streak'), { opacity: 1 }, 1.9);
137 tl.fromTo(sel('.morph-streak'),
138 { xPercent: -150, scaleX: 0.5 },
139 { xPercent: 250, scaleX: 1.8, duration: 0.5, ease: 'power3.in' }, 1.9);
140
141 tl.to(sel('.red-card'),
142 { x: '30%', scale: 0.4, opacity: 0, filter: 'blur(30px)', duration: 0.5, ease: 'power3.in' }, 2.0);
143
144 tl.fromTo(sel('.linear-symbol'),
145 { x: '-80%', scale: 0.4, opacity: 0, filter: 'blur(30px)' },
146 { x: '-50%', scale: 1, opacity: 1, filter: 'blur(0px)', duration: 0.6, ease: 'power3.out' }, 2.15);
147
148 tl.to(sel('.light-pillar'),
149 { opacity: 1, scaleY: 1, duration: 0.4, ease: 'power2.out' }, 2.9);
150
151 tl.fromTo(sel('.linear-symbol'),
152 { rotateY: 0 },
153 { rotateY: 360, duration: 1.0, ease: 'power2.inOut' }, 3.0);
154
155 tl.to(sel('.linear-symbol'),
156 { filter: 'drop-shadow(0 0 70px rgba(169,176,240,0.85))', duration: 0.5, yoyo: true, repeat: 1, ease: 'sine.inOut' }, 3.0);
157
158 tl.to({}, { duration: SLOT }, 0);
159 window.__timelines = window.__timelines || {};
160 window.__timelines['02-card-to-logo'] = tl;
161 })();
162 </script>
163 </div>
164 </template>
165
165 lines HTML