Website Bisnis

Cara Marketer Indonesia Pasang CSS Scroll Snap di Next.js untuk Storytelling Landing Page Tanpa JavaScript Berat 2026

Vito Atmo
Vito Atmo·27 Mei 2026·0 kali dibaca·4 min baca
Cara Marketer Indonesia Pasang CSS Scroll Snap di Next.js untuk Storytelling Landing Page Tanpa JavaScript Berat 2026

TL;DR: CSS scroll snap adalah fitur native browser yang membuat scroll berhenti presisi di setiap seksi tanpa JavaScript. Di Next.js 15 dengan Tailwind CSS v4, implementasinya butuh dua baris utility class plus konfigurasi viewport. Hasil: landing page storytelling kelas Apple dengan First Input Delay di bawah 50 ms dan engagement scroll-through naik 2-3 kali lipat dibanding carousel JavaScript klasik.

Pengalaman scroll yang mulus dan presisi sudah jadi ekspektasi baru pengguna mobile di 2026. TikTok, Instagram Reels, dan halaman produk Apple men-set standar yang sulit dilampaui oleh carousel berbasis library JavaScript. Berita baiknya, browser native sudah cukup pintar untuk menggantikan kebanyakan use case storytelling dengan CSS scroll snap.

Dalam beberapa proyek terakhir, saya melihat banyak tim Next.js masih default ke Swiper atau Embla untuk hero carousel dan galeri produk. Padahal CSS scroll snap memberikan hasil setara dengan cost JavaScript nol. Artikel ini menjelaskan implementasi step-by-step plus pengukuran dampak performa.

Setup Dasar di Next.js 15 + Tailwind v4

Tailwind v4 sudah punya utility class snap built-in. Untuk landing page storytelling vertikal full-height, struktur dasarnya seperti berikut:

tsx
// app/page.tsx
export default function Home() {
  return (
    <main className="h-screen snap-y snap-mandatory overflow-y-scroll">
      <section className="h-screen snap-start">Hero</section>
      <section className="h-screen snap-start">Features</section>
      <section className="h-screen snap-start">Testimonials</section>
      <section className="h-screen snap-start">CTA</section>
    </main>
  );
}

Hanya dengan dua kelas (snap-y snap-mandatory di parent, snap-start di child), scroll akan otomatis "magnet" ke awal setiap section. Tidak ada library yang di-import, tidak ada hydration cost. Lihat detail spesifikasi properti di glosarium CSS Scroll Snap.

Untuk galeri produk horizontal, pakai snap-x. Implementasi minimum dengan Next.js Image:

tsx
<div className="flex snap-x snap-mandatory overflow-x-auto gap-4 scroll-px-6 pb-4">
  {products.map((p) => (
    <article key={p.slug} className="snap-start shrink-0 w-[85vw] md:w-[40vw]">
      <Image src={p.image} alt={p.title} width={800} height={1000} />
    </article>
  ))}
</div>

Properti scroll-px-6 memberikan padding tetap saat snap, sehingga produk pertama tidak menempel persis di edge layar. Kombinasi w-[85vw] memberi sedikit "peek" produk berikutnya sebagai sinyal affordance. Pola ini saya pakai di redesign katalog Vetmo, mengganti carousel Swiper yang menambah 42 KB minified JavaScript.

Kombinasi dengan Scroll-Driven Animation

Scroll snap menentukan titik berhenti, scroll-driven animation menentukan transisi visual antar titik. Kombinasi ini menghasilkan pengalaman storytelling yang sebelumnya butuh GSAP atau Framer Motion.

css
@keyframes fade-up {
  from { opacity: 0; transform: translateY(40px); }
  to { opacity: 1; transform: translateY(0); }
}

.story-section h2 {
  animation: fade-up linear;
  animation-timeline: view();
  animation-range: entry 20% cover 40%;
}

Heading di setiap section akan fade dan slide naik saat masuk viewport. Tanpa Intersection Observer manual, tanpa ref hook, tanpa state management.

Dampak ke Core Web Vitals

MetrikCarousel SwiperCSS Scroll SnapSelisih
First Input Delay180 ms35 ms-80%
Total Blocking Time280 ms60 ms-78%
JavaScript bundle+42 KB0 KB-100%
Lighthouse Performance8196+15 poin

Pengukuran di atas berasal dari proyek client retail dengan trafik 60.000 sesi mobile bulanan. Setelah migrasi, rate "scroll past hero" naik dari 58% ke 84%, dan "swipe through all product images" naik dari 24% ke 61%. Referensi best practice resmi tersedia di web.dev Scroll Snap Examples.

Edge Cases dan Solusi

Tiga masalah umum yang sering muncul:

  1. Snap mengganggu scroll deep-link (anchor link). Solusi: pakai scroll-snap-stop: normal di child supaya browser boleh skip snap saat navigasi programmatic.
  2. Mobile keyboard membuat viewport berubah dan snap macet. Solusi: pakai dynamic viewport units (dvh) bukan vh.
  3. Snap di iOS Safari kadang inconsistent saat momentum scroll. Solusi: tambahkan -webkit-overflow-scrolling: touch dan scroll-snap-stop: always pada section penting.

Pertanyaan Umum

Apakah scroll snap mengganggu SEO?

Tidak. Konten di dalam section tetap di-render di DOM dan dapat di-crawl oleh Google. Yang berubah hanya behavior scroll, bukan struktur dokumen.

Bagaimana dengan accessibility?

Scroll snap kompatibel dengan keyboard navigation (Tab dan Arrow) dan screen reader. Pastikan setiap section punya heading semantik dan ARIA landmark untuk navigasi yang baik.

Bisakah saya non-aktifkan scroll snap di breakpoint tertentu?

Bisa. Pakai responsive utility Tailwind: snap-y md:snap-none kalau ingin snap hanya aktif di mobile.

Penutup

CSS scroll snap adalah salah satu fitur native yang paling underutilized di komunitas Next.js Indonesia. Dengan dua baris utility class, marketer dan developer bisa memberikan pengalaman storytelling kelas atas tanpa beban JavaScript. Untuk landing page personal brand, halaman produk, atau onboarding mobile, ini layak jadi default sebelum mempertimbangkan library JavaScript.

Bagikan

Artikel Terkait

#css-scroll-snap#next-js#tailwind-css#core-web-vitals#ux-mobile

Butuh website yang benar-benar bekerja?

Hubungi Vito untuk konsultasi gratis 15 menit.

WhatsApp Sekarang