Scroll Video
video.currentTime = video.duration * self.progress is called on every scroll update via onUpdate. The video element must be loaded (loadedmetadata event) before attaching ScrollTrigger so video.duration is available. Setting currentTime directly scrubs frames with scroll.
video.currentTime = video.duration * self.progress를 onUpdate를 통해 매 스크롤 업데이트마다 호출합니다. ScrollTrigger를 연결하기 전에 loadedmetadata 이벤트를 대기해 video.duration을 사용할 수 있어야 합니다. currentTime을 직접 설정하면 스크롤로 프레임을 스크러브합니다.
Source Code script.js
gsap.registerPlugin(ScrollTrigger);
const video = document.getElementById('vid');
const timecode = document.getElementById('timecode');
// Pause the video immediately — scroll will drive playback
video.pause();
function init() {
ScrollTrigger.create({
trigger: '.pin-wrap',
start: 'top top',
end: '+=3000',
pin: true,
scrub: true,
onUpdate(self) {
const t = self.progress * video.duration;
video.currentTime = t;
timecode.textContent = t.toFixed(2) + 's';
},
});
}
// Init after metadata so video.duration is available
if (video.readyState >= 1) {
init();
} else {
video.addEventListener('loadedmetadata', init, { once: true });
}