Panduan SEO Infinite Scroll

Cara menerapkan infinite scroll tanpa kehilangan pengindeksan: mengapa Googlebot tidak menggulir, bagaimana viewport tinggi dapat menyatukan dua halaman, solusi URL berhalaman + History API, dan kasus halaman kategori ecommerce.

Pertama kali diterbitkan: 3 Jul 2026 · Terakhir diperbarui: 22 Agu 2026 · Advanced
Bahasa

Infinite scroll memuat lebih banyak konten ketika pengguna menggulir, sedangkan Googlebot tidak pernah menggulir atau mengeklik. Google merender halaman dalam viewport sangat tinggi (sekitar 411×12 140px seluler dan 1024×9 307px desktop) sebagai cara mengatasinya, tetapi viewport yang sama dapat memicu pemuat saat rendering dan menyatukan dua halaman logis di bawah satu URL. Solusi yang tahan lama adalah URL absolut, persisten, dan unik per kelompok, tautan yang dapat di-crawl, serta History API yang menyelaraskan bilah alamat. rel=next/prev sudah usang bagi Google tetapi masih didukung Bing. Pada kategori ecommerce, gunakan sitemap atau feed Merchant Center sebagai cadangan dan verifikasi HTML hasil render melalui Alat Inspeksi URL. Penerapan produksi juga memerlukan rekonstruksi popstate/kembali-maju, status memuat/kesalahan/akhir yang jelas, serta aksesibilitas yang dirancang secara sengaja.

TL;DR — Googlebot tidak pernah menggulir atau mengeklik, sehingga konten yang bergantung pada pengguliran tidak terlihat secara bawaan. Google mengatasinya dengan merender dalam viewport yang sangat tinggi (sekitar 411×12 140px di perangkat seluler dan 1024×9 307px di desktop). Namun, tinggi yang sama dapat memicu pemuat saat proses rendering, menyatukan halaman logis berikutnya dengan halaman saat ini sehingga dua halaman terindeks sebagai satu URL. Solusi yang tahan lama bersifat arsitektural: URL absolut, persisten, dan unik untuk setiap kelompok (misalnya ?page=12), tautan yang dapat di-crawl, serta History API untuk memperbarui bilah alamat ketika kelompok utama berubah. rel=next/rel=prev sudah usang bagi Google (ditinggalkan pada 2019), tetapi masih dipakai Bing. Untuk PLP ecommerce, gunakan sitemap atau feed Merchant Center sebagai jalur penemuan cadangan. Verifikasi semuanya melalui HTML hasil render di Alat Inspeksi URL.

Evidence for this claim Google Search does not generally interact with scrolling controls, so infinite-scroll content needs crawlable paginated URLs. Scope: Current official or standards documentation. Confidence: high · Verified: Google: Lazy-loaded content Evidence for this claim The History API can update URLs for loaded page chunks without a full navigation. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: History API

Pertama, bedakan dua hal

Jika menelusuri “Google infinite scroll”, Anda akan menemukan hasil tentang pengguliran berkelanjutan milik Google pada halaman hasil penelusurannya—fitur SERP yang sempat diaktifkan lalu dihentikan pada pertengahan 2024. Itu adalah keputusan UX untuk produk Google dan tidak berkaitan dengan cara Googlebot meng-crawl situs Anda. Artikel ini membahas hal yang kedua: infinite scroll sebagai pola pemuatan pada halaman Anda sendiri dan apakah Google dapat mengindeks konten yang dimuatnya.

Kendala utama: Google tidak berinteraksi dengan halaman Anda

Semua pembahasan ini bermula dari satu fakta. Dokumentasi lazy-loading Google menyatakan: recommended patterns “don’t rely on user actions, such as scrolling or clicking, to load content, which is important as Google Search does not interact with your page.” (terjemahan) “Pola yang disarankan tidak bergantung pada tindakan pengguna, seperti menggulir atau mengeklik, untuk memuat konten; hal ini penting karena Google Penelusuran tidak berinteraksi dengan halaman Anda.” Dokumentasi paginasi menyatakannya lebih lugas: “Google’s crawlers don’t ‘click’ buttons and generally don’t trigger JavaScript functions that require user actions to update the current page contents.” (terjemahan) “Crawler Google tidak mengeklik tombol dan umumnya tidak memicu fungsi JavaScript yang memerlukan tindakan pengguna untuk memperbarui isi halaman saat ini.”

Seperti yang saya tulis dalam panduan SEO JavaScript: “Googlebot tidak melakukan tindakan di halaman web. Ia tidak akan mengeklik atau menggulir, tetapi bukan berarti tidak memiliki cara lain. Selama konten dimuat ke DOM tanpa memerlukan tindakan, Google akan melihatnya. Jika konten baru dimuat ke DOM setelah klik, konten itu tidak akan ditemukan.”

Jadi, infinite scroll yang hanya terpicu oleh peristiwa pengguliran nyata sudah menjadi masalah penemuan konten sebelum menjadi masalah lainnya.

Cara Google mengatasinya: viewport yang sangat tinggi

Google tidak menyimulasikan pengguliran. Google merender halaman dalam viewport yang sangat tinggi sehingga konten beberapa layar di bawah sudah berada dalam area render. Catatan John Mueller pada 2017 menyatakan bahwa “Googlebot renders with a very tall viewport, which skews some CSS (often images). Try in Chrome dev-tools, eg 9000px high viewport.” (terjemahan) “Dengan viewport yang amat tinggi, render Googlebot dapat mengubah tampilan sejumlah CSS, terutama gambar. Uji kondisi itu di Chrome DevTools pada tinggi sekitar 9000px.”

Angka spesifik yang pernah saya dokumentasikan: untuk perangkat seluler, Google memuat halaman pada ukuran layar 411×731 piksel lalu mengubah tingginya menjadi 12 140 piksel— “pada dasarnya menjadi ponsel sangat panjang dengan ukuran layar 411×12140 piksel. Untuk desktop, Google melakukan hal serupa, dari 1024×768 piksel menjadi 1024×9307 piksel.” (Saya belum melihat pengujian ulang terbaru atas angka persis tersebut, dan hasilnya dapat berubah mengikuti panjang halaman; dimensi awal berasal dari pengujian independen peneliti SEO JR Oakes.) Intinya bukan angka piksel yang persis, melainkan Google meniru kemampuan “melihat jauh ke bawah halaman” melalui ketinggian, bukan gerakan.

Perlakukan dimensi piksel persis dan perilaku penggabungan dua halaman di bawah sebagai pengamatan lama yang bergantung pada penerapan, bukan kontrak platform yang stabil. Google tidak menerbitkan spesifikasi resmi untuk angka maupun perilaku rendering tersebut, dan keduanya dapat berubah. Jangan berasumsi situs Anda berperilaku sama; konfirmasikan perilaku terkini untuk URL Anda dengan pengujian HTML hasil render pada bagian berikutnya.

Mode kegagalan yang jarang dijelaskan: dua halaman terindeks sebagai satu

A height-triggered loader can fire during rendering and merge two logical pages under one indexed URL. Sumber: /technical-seo/javascript-seo/

A normal browser viewport stops after page one. Google's render viewport expands much taller, reaches the infinite-scroll trigger without a real user scroll, and appends page two into the same DOM. The merged DOM is then indexed as one URL instead of two separate pages.

© Patrick Stox LLC · CC BY 4.0 ·

Di sinilah viewport tinggi menimbulkan masalah. Karena viewport render sangat tinggi, pemuat berbasis pengguliran dapat terpicu selama rendering meskipun tidak ada pengguliran dalam arti manusia—tinggi DOM saja dapat memenuhi syarat IntersectionObserver atau pemeriksaan posisi gulir. Ketika itu terjadi, pemuat menambahkan konten halaman logis berikutnya ke hasil render halaman saat ini, lalu Google mengindeks hasil gabungan tersebut sebagai satu URL.

Saya sudah beberapa kali mendiagnosis masalah ini. Dari panduan SEO JavaScript saya:

“Masalah lain yang pernah saya lihat dalam penerapan ini adalah sesekali dua halaman terindeks sebagai satu. Beberapa kali orang mengatakan halaman mereka tidak dapat diindeks, tetapi saya menemukan kontennya terindeks sebagai bagian dari halaman lain— biasanya posting sebelumnya.”

“Teori saya: ketika Google memperpanjang viewport, tindakan itu memicu infinite scroll dan memuat artikel lain saat rendering. Dalam kasus ini, saya menyarankan pemblokiran berkas JavaScript yang menangani infinite scroll agar fungsi tersebut tidak terpicu.”

John Mueller menjelaskan mekanisme yang sama dalam sesi office hours 2022. Menurutnya, viewport tinggi Google “would trigger some amount of infinite scrolling,” (terjemahan) “akan memicu sejumlah pengguliran tak terbatas,” dan Google mungkin memuat “two or three of these pages loaded on one page,” (terjemahan) “dua atau tiga halaman ini dalam satu halaman,” tetapi tidak semuanya. (Kutipan ini disampaikan melalui Search Engine Journal dan belum dikonfirmasi terhadap rekaman primer.)

Dari sini muncul dua konsekuensi:

  1. Tidak ada jaminan berapa banyak yang ikut dimuat. Mungkin tidak ada tambahan, mungkin dua atau tiga halaman, tetapi tidak pernah dapat diandalkan untuk memuat semuanya. Infinite scroll saja bukan cara andal untuk mengindeks konten yang dalam.
  2. “Tidak terindeks” dapat menjadi diagnosis yang keliru. Halaman yang tampak hilang mungkin sebenarnya terindeks sebagai bagian dari URL sebelumnya. Solusinya berbeda dari perbaikan masalah pengindeksan biasa.

Cara mendiagnosisnya

Gunakan Alat Inspeksi URL di Search Console dan baca HTML hasil render, bukan kode sumber mentah. Dokumentasi Google menjelaskan: “Anda dapat menggunakan Alat Inspeksi URL di Search Console untuk melihat apakah seluruh konten sudah dimuat. Periksa HTML hasil render untuk memastikan konten Anda ada di sana dengan mencarinya melalui Alat Inspeksi URL.” Cari konten yang seharusnya hanya ada di halaman 1. Jika konten halaman 2 (atau artikel berikutnya) muncul dalam hasil render halaman 1, Anda telah mereproduksi bug penggabungan.

Anda juga dapat mereplikasi viewport tinggi secara lokal: buka Chrome DevTools, atur viewport khusus yang sangat tinggi (Mueller menyarankan sekitar 9000px), lalu muat halaman untuk melihat apakah pemuat terpicu tanpa pengguliran.

Solusi: URL berhalaman + History API

Solusi tahan lama bersifat arsitektural dan berasal langsung dari dokumentasi lazy-loading Google saat ini. Agar infinite scroll dapat diindeks, “pastikan situs Anda mendukung pemuatan berhalaman untuk kelompok-kelompok konten ini”:

  • “Berikan URL persisten dan unik kepada setiap kelompok.”
  • “Pastikan konten yang ditampilkan pada setiap URL tetap sama setiap kali dimuat di browser”—Google menyarankan nomor halaman absolut seperti ?page=12.
  • “Hindari elemen relatif seperti ?date=yesterday dalam URL tersebut”—alamat yang mengembalikan konten berbeda pada setiap pemuatan tidak dapat menjadi kanonis.
  • “Tautkan secara berurutan ke masing-masing URL agar mesin pencari dapat menemukan URL dalam rangkaian paginasi”—gunakan tautan <a href> nyata, bukan penangan klik.
  • “Ketika kelompok halaman baru dimuat sebagai respons atas pengguliran dan menjadi elemen utama yang terlihat, perbarui URL yang ditampilkan menggunakan History API.”

Poin terakhir adalah bagian yang elegan. history.pushState() / replaceState() mengganti URL di bilah alamat saat pengguna melewati setiap batas, sehingga URL yang terlihat selalu cocok dengan konten utama dan pengguna dapat memuat ulang, membagikan, serta menautkan ke posisi yang tepat. Sementara itu, URL ?page=N yang dapat di-crawl tetap tersedia secara mandiri, sehingga Google dapat mencapai setiap kelompok secara langsung, terlepas dari apakah renderer pernah memicu pengguliran.

Dua catatan penerapan yang penting:

  • Gunakan IntersectionObserver (atau lazy-loading bawaan browser), bukan listener scroll mentah. Kinerjanya jauh lebih baik karena tidak membebani setiap pengguliran, dan mekanisme “muat saat terlihat” ini direkomendasikan Google untuk konten tertunda.
  • Pastikan rangkaian paginasi dapat ditemukan secara independen dari JavaScript. Sediakan anchor nyata dalam DOM dan/atau cantumkan URL ?page=N dalam sitemap XML. Apa pun yang ditangkap renderer, lapisan sitemap dan tautan menjadi jalur cadangan.

Jika situs aktif sudah mengalami bug penggabungan dan Anda perlu menghentikan dampaknya sebelum membangun ulang, perbaikan darurat yang lugas adalah memblokir berkas JavaScript yang memicu infinite scroll di robots.txt agar tidak dapat dijalankan saat rendering. Langkah ini memberi waktu untuk menerapkan arsitektur URL berhalaman yang semestinya.

Status navigasi: kembali, maju, muat ulang, dan berbagi harus merekonstruksi tampilan yang sama

Poin History API di atas baru mencakup separuh kontrak: memperbarui bilah alamat ketika sebuah kelompok menjadi utama. Separuh lainnya adalah memastikan setiap jalur masuk kembali ke URL tersebut merekonstruksi konten yang tepat, bukan hanya posisi gulir yang tepat:

  • Gunakan pushState() ketika sebuah kelompok menjadi konten utama yang terlihat untuk pertama kalinya. Itu merupakan langkah navigasi nyata dan membuat tombol kembali bermakna.
  • Gunakan replaceState() untuk koreksi yang tidak perlu membuat titik berhenti tersendiri, seperti menyelaraskan URL setelah pengguliran cepat melewati beberapa kelompok sekaligus.
  • Dengarkan popstate, lalu render ulang (atau ambil ulang) kelompok yang cocok dengan URL pada peristiwa tersebut. Perilaku kembali/maju bawaan browser memulihkan posisi gulir, bukan status daftar dinamis yang dibangun JavaScript. Jika pemuat telah menambahkan 40 item, Anda harus merekonstruksi item milik halaman itu, bukan sekadar menggulir ke sana.
  • Jangan mengandalkan pemulihan gulir otomatis saja. Fitur itu mengatur posisi viewport, bukan konten yang tersedia. Jika daftar dapat berubah antarkunjungan, posisi gulir tanpa rekonstruksi konten dapat menempatkan pengguna dalam konteks yang salah.

Ini adalah disiplin yang sama dengan solusi URL berhalaman: URL sebuah kelompok harus mengembalikan konten yang dijanjikannya ketika dibuka langsung, dimuat ulang, dan diuji secara langsung di Search Console—bukan hanya saat pertama kali diambil di tengah guliran.

Status pemuatan, kesalahan, dan akhir hasil

Penerapan untuk produksi memerlukan lebih banyak status daripada sekadar “memuat” dan “dimuat”:

  • Pemuatan awal—kelompok pertama seharusnya sudah ada dalam HTML mentah yang dikirim server, bukan seluruhnya dirakit JavaScript sesudahnya.
  • Memuat kelompok berikutnya—tampilkan indikator proses agar pengguna dan penguji teknologi bantu mengetahui bahwa pengambilan data sedang berlangsung.
  • Kosong—sediakan status khusus untuk nol hasil, bukan ruang kosong yang tampak rusak.
  • Kesalahan / coba lagi—pengambilan yang gagal tidak boleh membuat halaman buntu tanpa cara mencoba lagi; percobaan ulang juga tidak boleh menggandakan atau mengubah urutan item.
  • Akhir hasil—tampilkan sinyal yang jelas, bukan indikator berputar tanpa akhir, ketika tidak ada lagi yang dapat dimuat.

Semua ini tidak khusus untuk Google, tetapi mencerminkan keandalan yang juga dibutuhkan solusi URL berhalaman. Jika pemuat dapat diam-diam gagal di tengah pengambilan, Anda tidak dapat memastikan suatu crawl atau sesi pengguna menangkap kelompok yang seharusnya.

Aksesibilitas dan performa: dua hal yang tidak otomatis diberikan infinite scroll

Infinite scroll tidak memiliki dampak Core Web Vitals yang melekat, baik atau buruk; hasilnya sepenuhnya bergantung pada penerapan. Setiap kelompok tambahan memperbesar DOM, dan DOM yang cukup besar meningkatkan biaya tata letak serta penghitungan ulang gaya. Pantau biaya penambahan, pemuatan gambar, pergeseran tata letak akibat ruang yang tidak dicadangkan, dan tugas panjang ketika daftar membesar. Pada halaman sangat panjang, pertimbangkan virtualisasi kelompok yang sudah jauh di luar tampilan dengan menghapus node DOM-nya agar DOM tidak tumbuh tanpa batas.

Aksesibilitas memerlukan rancangan khusus, bukan asumsi bahwa “jika dapat dirender berarti sudah baik”:

  • Pengguna keyboard harus dapat mencapai konten baru serta footer atau navigasi akhir halaman tanpa urutan tab terus bergeser akibat halaman yang diam-diam memanjang.
  • Pengguna pembaca layar perlu mendapat pemberitahuan tentang konten baru tanpa gangguan; region status yang sopan biasanya lebih tepat daripada peringatan yang menginterupsi.
  • Pola desain feed WAI-ARIA dibuat untuk kasus ini: region setingkat artikel dalam kontainer feed, dengan perilaku keyboard yang jelas untuk berpindah antaritem dan mencapai konten sebelum maupun sesudah feed.
  • Fokus tidak boleh berpindah atau hilang tanpa penjelasan ketika kelompok baru dimuat.

Ini bukan pekerjaan tambahan yang opsional. Inilah perbedaan antara infinite scroll yang berfungsi bagi semua orang dan penerapan yang hanya berfungsi bagi pengguna mouse, JavaScript, dan jalur ideal.

Konteks historis: rel=next/prev sudah usang

Jika Anda mempelajari paginasi bertahun-tahun lalu, Anda mengenal rel="next" / rel="prev". Google memperkenalkannya pada 2011 dan memasangkannya dengan “rekomendasi infinite scroll yang ramah penelusuran” pada 2014 (membuat paginasi konten dan menyediakan halaman komponen). Pada 2019, Google mengumumkan bahwa tag tersebut sudah bertahun-tahun tidak digunakan dan resmi meninggalkannya. Dokumentasi paginasi kini menegaskan: “Dahulu, Google menggunakan <link rel="next" href="..."> dan <link rel="prev" href="..."> untuk mengidentifikasi hubungan halaman berikutnya dan sebelumnya. Google tidak lagi menggunakan tag tersebut, meskipun tautannya mungkin masih dipakai mesin pencari lain.”

Jadi, resep Google saat ini adalah URL unik + tautan yang dapat di-crawl + History API; rel=next/rel=prev tidak diwajibkan. Namun, “mesin pencari lain” mencakup Bing, yang masih menggunakannya. Menyimpan tag tersebut dalam markup dapat memberi manfaat lintas mesin dan aksesibilitas. Bing tidak menerbitkan panduan khusus infinite scroll; posisinya bermuara pada peringatan umum tentang rendering JavaScript: bingbot dapat merender JavaScript, tetapi “sulit bagi bingbot untuk memproses JavaScript dalam skala besar”. Karena alasan yang sama seperti pada Google, cadangan paginasi yang dapat di-crawl membantu Bing.

Halaman kategori ecommerce: kasus dengan risiko terbesar

Penggunaan infinite scroll yang paling umum adalah pada halaman kategori / daftar produk (PLP) ecommerce, dan di sinilah risikonya menimbulkan kerugian nyata. Jika produk dalam katalog yang dalam, setelah layar pertama, tidak pernah terindeks, produk tersebut tidak dapat memperoleh peringkat dan Anda kehilangan trafik organik long-tail di tingkat produk. Materi halaman kategori membahas wilayah yang sama secara mendalam; infinite scroll menjadi alasan tambahan mengapa UX tersebut memerlukan struktur yang dapat di-crawl.

Dua jalur cadangan penting dalam kasus ini:

  • Sitemap XML yang mencantumkan setiap produk kanonis dan URL kategori berhalaman, sehingga penemuan tidak bergantung pada renderer.
  • Feed produk Merchant Center, yang memberikan data produk kepada Google secara independen dari apa pun yang ditangkap renderer halaman kategori.

Analisis Lumar terhadap peritel fesyen terkemuka di Inggris menyebut infinite scroll sebagai “pihak yang paling dirugikan dalam hal kemampuan pengindeksan dan keramahan SEO” di antara berbagai pola paginasi. Ini mengingatkan bahwa masalah tersebut bukan kasus tepi teoretis, melainkan kegagalan bawaan UX PLP yang sangat populer. (Baca angka persentase spesifik Lumar dari laporan langsungnya sebelum mengutip angka persis.)

Infinite scroll dibanding paginasi dan tombol muat lebih banyak

Dokumentasi paginasi Google menyajikan tiga pola UX dan menjelaskan pertukarannya secara terbuka. Infinite scroll “menggunakan satu halaman untuk semua konten” dan terasa “intuitif—pengguna hanya perlu terus menggulir”, tetapi dapat “menimbulkan kelelahan menggulir karena ukuran hasil tidak jelas” serta “tidak dapat menangani hasil dalam jumlah sangat besar”. Paginasi bernomor klasik paling tangguh untuk SEO karena setiap halaman secara bawaan memiliki URL nyata. “Muat lebih banyak” berada di tengah: baik jika tombolnya merupakan atau membungkus tautan nyata ke URL berhalaman, tetapi tidak berguna untuk SEO jika hanya berupa penangan klik.

Pertanyaannya bukan “pola mana yang diizinkan”—ketiganya diizinkan. Pertanyaannya: “UX mana yang Anda inginkan, dan apakah Anda sudah membangun lapisan URL yang dapat di-crawl di bawahnya?” Ringkasan Mueller pada 2023 mencakup semuanya: “jika setiap bagian atau halaman virtual juga dapat diakses dan ditemukan melalui URL unik, secara umum infinite scroll seharusnya tidak bermasalah.”

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.