Горизонтальный скролл
GSAP-классика Пин-шаги →

Sticky-сцены

Горизонтальный скролл

Вертикальная прокрутка везёт ленту панелей горизонтально — с инерционной доводкой.

Скрольте вниз как обычно.

01
02
03
04
Код
<section class="hscroll">   <!-- 340vh -->
  <div class="stick">
    <div class="track">
      <div class="panel">01</div>
      <div class="panel">02</div>
      <div class="panel">03</div>
    </div>
  </div>
</section>

<style>
.hscroll { position: relative; height: 340vh; }
.hscroll .stick { position: sticky; top: 0; height: 100vh;
  overflow: hidden; display: flex; align-items: center; }
.track { display: flex; gap: 3vw; padding: 0 8vw; will-change: transform; }
.panel { flex: 0 0 62vw; aspect-ratio: 16/10; }
</style>

<script>
// вертикальный скролл двигает ленту горизонтально
var scene = document.querySelector(".hscroll");
var track = scene.querySelector(".track");
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;                     // лерп-доводка
  var dist = track.scrollWidth - innerWidth;  // сколько ехать
  track.style.transform = "translate3d(" + (-cur * dist) + "px,0,0)";
  requestAnimationFrame(loop);
}
if (!matchMedia("(prefers-reduced-motion: reduce)").matches)
  requestAnimationFrame(loop);
</script>
Промпт для ИИ
Сделай горизонтальную скролл-секцию: секция высотой 340vh, внутри sticky-экран с overflow:hidden и flex-лентой панелей (каждая 60-65vw). Прогресс вертикальной прокрутки секции p = clamp(-rect.top/(rect.height - innerHeight),0,1) с лерп-доводкой 0.1; лента сдвигается translate3d(-p * (track.scrollWidth - innerWidth), 0, 0). Высоту секции подбирай пропорционально длине ленты. При prefers-reduced-motion — обычная вертикальная раскладка.