Видео по скроллу
jobyaviation.com Карусель-слайдер →

Появление изображений

Видео по скроллу

Видео приколото к экрану и проматывается прокруткой — вперёд и назад. Их компонент ScrollVideo.

Скрольте медленно сквозь сцену.

видео проматывается скроллом · вперёд и назад

Код
<section class="video-scene">  <!-- высота 300vh -->
  <div class="stick">
    <video muted playsinline preload="auto" src="clip.mp4"></video>
  </div>
</section>

<style>
.video-scene { position: relative; height: 300vh; }
.video-scene .stick { position: sticky; top: 0; height: 100vh; overflow: hidden; }
.video-scene video { width: 100%; height: 100%; object-fit: cover; }
</style>

<script>
var scene = document.querySelector(".video-scene");
var video = scene.querySelector("video");
var cur = NaN;
function loop() {
  var r = scene.getBoundingClientRect();
  var t = Math.min(Math.max(-r.top / (r.height - innerHeight), 0), 1);
  if (isNaN(cur)) cur = t;
  cur += (t - cur) * 0.1;                     // доводка — плавный ход
  if (video.duration) {
    video.currentTime = cur * (video.duration - 0.05);
  }
  requestAnimationFrame(loop);
}
if (!matchMedia("(prefers-reduced-motion: reduce)").matches)
  requestAnimationFrame(loop);
</script>
Промпт для ИИ
Сделай видео, проматываемое скроллом, как ScrollVideo на jobyaviation.com: секция 300vh со sticky-экраном, внутри video (muted, playsinline, preload=auto, object-fit:cover). В rAF считай прогресс секции t = clamp(-rect.top/(rect.height-innerHeight),0,1) с лерп-доводкой 0.1 и ставь video.currentTime = прогресс * (duration - 0.05). Видео должно быть с частыми кейфреймами (перекодируй ffmpeg -g 15), иначе перемотка дёргается. При prefers-reduced-motion просто autoplay loop.