返回 html-video
index.html
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8" />
5 <title>Massimo Vignelli Video</title>
6 <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
7 <style>
8 body,
9 html {
10 margin: 0;
11 padding: 0;
12 background: #ffffff;
13 overflow: hidden;
14 width: 1080px;
15 height: 1920px;
16 font-family: "Helvetica", Arial, sans-serif;
17 }
18
19 /* 6-Column Grid System */
20 .grid-container {
21 position: absolute;
22 top: 0;
23 left: 0;
24 width: 1080px;
25 height: 1920px;
26 display: grid;
27 grid-template-columns: repeat(6, 1fr);
28 pointer-events: none;
29 z-index: 1000;
30 opacity: 0; /* Keep grid invisible but present for layout references */
31 }
32
33 .grid-column {
34 border-right: 1px solid rgba(204, 0, 0, 0.2); /* Vignelli Red accent */
35 }
36
37 #main-composition {
38 position: relative;
39 width: 1080px;
40 height: 1920px;
41 background: #ffffff;
42 overflow: hidden;
43 }
44
45 /* Layer Hosts */
46 #a-roll-wrapper {
47 position: absolute;
48 top: 0;
49 left: 0;
50 width: 100%;
51 height: 100%;
52 z-index: 10;
53 overflow: hidden;
54 }
55
56 #a-roll,
57 #a-roll-wrapper img.__render_frame__,
58 #a-roll-wrapper img.__preview_render_frame__ {
59 position: absolute;
60 inset: 0;
61 width: 100%;
62 height: 100%;
63 object-fit: cover;
64 }
65
66 #overlays-comp,
67 #captions-comp {
68 position: absolute;
69 top: 0;
70 left: 0;
71 width: 1080px;
72 height: 1920px;
73 pointer-events: none;
74 }
75
76 #overlays-comp {
77 z-index: 20;
78 }
79
80 #captions-comp {
81 z-index: 30;
82 }
83
84 /* Curtain Transition Layer */
85 .curtain {
86 position: absolute;
87 top: 0;
88 left: -100%;
89 width: 100%;
90 height: 100%;
91 background: #1a1a1a;
92 z-index: 25;
93 pointer-events: none;
94 }
95
96 .curtain.red {
97 background: #cc0000;
98 z-index: 26;
99 }
100 </style>
101 </head>
102 <body>
103 <div
104 id="main-composition"
105 data-composition-id="main-comp"
106 data-width="1080"
107 data-height="1920"
108 data-start="0"
109 data-duration="__VIDEO_DURATION__"
110 >
111 <!-- Transitions -->
112 <div id="curtain-black" class="curtain"></div>
113 <div id="curtain-red" class="curtain red"></div>
114
115 <!-- Overlays Composition -->
116 <div
117 id="overlays-comp"
118 data-composition-id="overlays"
119 data-composition-src="compositions/overlays.html"
120 data-start="0"
121 data-duration="__VIDEO_DURATION__"
122 data-track-index="2"
123 ></div>
124
125 <!-- Captions Composition -->
126 <div
127 id="captions-comp"
128 data-composition-id="captions"
129 data-composition-src="compositions/captions.html"
130 data-start="0"
131 data-duration="__VIDEO_DURATION__"
132 data-track-index="3"
133 ></div>
134
135 <!-- Grid Visualization -->
136 <div class="grid-container">
137 <div class="grid-column"></div>
138 <div class="grid-column"></div>
139 <div class="grid-column"></div>
140 <div class="grid-column"></div>
141 <div class="grid-column"></div>
142 <div class="grid-column"></div>
143 </div>
144
145 <script>
146 const tl = gsap.timeline({ paused: true });
147
148 // Transition: Curtain Pull logic
149 // A-roll leaves the screen at least once.
150 // Timing: Let's do a curtain pull at 3.7s (transitioning to the 62% stat)
151 // and return at 7.3s (end of attention stat).
152
153 // Curtain Out (A-roll hidden)
154 tl.to("#curtain-black", { left: "0%", duration: 0.2, ease: "power2.inOut" }, 3.5);
155 tl.to("#a-roll-wrapper", { opacity: 0, duration: 0 }, 3.7);
156 tl.to("#curtain-black", { left: "100%", duration: 0.4, ease: "power2.inOut" }, 3.7);
157
158 // Curtain In (A-roll return)
159 tl.set("#curtain-red", { left: "-100%" }, 7.1);
160 tl.to("#curtain-red", { left: "0%", duration: 0.2, ease: "power2.inOut" }, 7.1);
161 tl.to("#a-roll-wrapper", { opacity: 1, duration: 0 }, 7.3);
162 tl.to("#curtain-red", { left: "100%", duration: 0.4, ease: "power2.inOut" }, 7.3);
163
164 window.__timelines = window.__timelines || {};
165 window.__timelines["main-comp"] = tl;
166 </script>
167 </div>
168
169 <!-- A-Roll (direct child of body to avoid video_nested_in_timed_element) -->
170 <div id="a-roll-wrapper">
171 <video
172 id="a-roll"
173 src="__VIDEO_SRC__"
174 muted
175 playsinline
176 data-start="0"
177 data-duration="__VIDEO_DURATION__"
178 data-track-index="0"
179 ></video>
180 </div>
181 <audio
182 id="a-roll-audio"
183 src="__VIDEO_SRC__"
184 data-start="0"
185 data-duration="__VIDEO_DURATION__"
186 data-track-index="5"
187 data-volume="1"
188 ></audio>
189 </body>
190 </html>
191
191 lines HTML