Türkçe çeviri: Infinite Scroll SEO
nasıl -e implement infinite scroll olmadan losing sizin dizine ekleme — neden Googlebot yapmaz scroll, tall-viewport render trick şu flattens two sayfalar -e bir, paginated-URL + History API düzelt, ve ecommerce category-sayfa durum.
Diller
Infinite scroll loads daha bençerik olarak siz scroll, yerine via numbered sayfalar — ve Googlebot never scrolls veya tıklamalar, bu nedenle anything gated behind şu action dır invisible tarafından default. Google renders in bir çok tall viewport (hakkında 411×12 140px mobile, 1024×9 307px desktop) olarak bir workaround, ama şu aynı tall viewport -ebilir trigger scroll loader during rendering ve fold two logical sayfalar -e bir dizine eklenmiş URL — bir başarısızlık mode nerede bir 'değil dizine eklenmiş' sayfa dır aslında dizine eklenmiş olarak part of başka bir. düzelt dır architectural: ver her chunk bir gerçek, persistent, absolute URL (like ?sayfa=2), bağlantı them ile crawlable anchors, ve update adres bar ile History API olarak kullanıcı scrolls. rel=sonraki/prev dır legacy (Google dropped o in 2019; Bing hâlâ supports o). On ecommerce category sayfalar, back o tümü ile sitemaps veya bir Merchant Center feed ve verify in URL Inspection araç's rendered HTML. bir production oluştur ayrıca gerektirir bir gerçek popstate/back-forward contract, distinct loading/error/end states, ve deliberate accessibility — none of şu comes bençin free sadece çünkü dizine ekleme düzelt dır in place.
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 APITL;DR — Infinite scroll loads daha bençerik olarak siz scroll down, yerine making siz click -e sayfa 2, sayfa 3, ve bu nedenle on. catch: Googlebot yapmaz scroll ve yapmaz click. bu nedenle eğer sizin products veya articles yalnızca görün once bir ziyaretçben scrolls, Google -ebilir never see them. düzelt dır -e ver her “page” of bençerik bir gerçek URL of onun kendi, bu nedenle arama motorları sahip something -e tarama hatta gerçben onlar never touch sizin scroll.
ne infinite scroll dır
siz’ve kullanılan o bir hundred times olmadan naming o. On bir social feed, bir shopping category, veya bir uzun article, siz koru scrolling ve daha stuff keeps appearing — no “Next page” button, no sayfa numbers. şu’s infinite scroll: JavaScript watches nasıl far siz’ve scrolled ve, olarak siz near bottom, quietly fetches ve adds sonraki batch of bençerik.
o feels seamless bençin kişiler. sorun dır şu arama motorları değildir kişiler.
neden o’s risky bençin SEO
Google bulur ve reads sizin sayfalar ile bir automated program called Googlebot. Googlebot loads sizin sayfa, ama o yapar değil behave like bir human ziyaretçben:
- o yapmaz scroll down sayfa.
- o yapmaz click buttons.
bu nedenle herhangi bir bençerik şu yalnızca loads sonra someone scrolls (veya tıklamalar “Load more”) basitçe değildir orada olarak far olarak Googlebot dır concerned. eğer sizin category sayfa shows 24 products up front ve loads rest on scroll, Google -ebilir yalnızca ever see şunlar ilk 24.
bir kural şu keeps o safe
burada’s whole trick in bir sentence: her chunk of bençerik gerektirir onun kendi gerçek web adres.
yerine relying yalnızca on scrolling, bir arama-friendly setup ayrıca sahiptir plain,
crawlable sayfalar behind scenes — example.com/shoes?page=2,
?page=3, ve bu nedenle on — linked together ile olağbir bağlantılar Google -ebilir izle.
infinite scroll dır nice experience bençin humans; numbered URLs dır
safety net bençin arama motorları. Modern implementations hatta swap adres in
sizin browser bar olarak siz scroll, bu nedenle -erseniz kopya URL siz land back in exact
aynı spot.
ne en çok kişiler al yanlış
- “Google can render JavaScript now, so it’ll figure it out.” Google -ebilir çalıştır sizin JavaScript — ama o hâlâ won’t scroll veya click -e trigger loader. olma able -e render değildir aynı olarak taking action.
- “A ‘Load more’ button is safer than auto-scroll.” yalnızca eğer şu button dır bir gerçek bağlantı -e bir gerçek sayfa. bir button şu sadece runs bir click handler dır invisible -e Google de.
- “If a page isn’t indexed, Google is ignoring it.” ile infinite scroll, “değil dizine eklenmiş” bazen anlamına gelir bençerik aldı merged -e başka bir sayfa tarafından accident — bu da bir farklı sorun ile bir farklı düzelt.
Infinite scroll değildir banned veya penalized. Done yapğru — ile gerçek URLs underneath — o’s completely fine. iste mechanics of neden two sayfalar bazen al dizine eklenmiş olarak bir, plus gerçek code pattern -e implement o? Switch -e Advanced tab.
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 APITL;DR — Googlebot never scrolls ve never tıklamalar, bu nedenle scroll-gated bençerik dır invisible tarafından default. Google’s workaround dır -e render in bir çok tall viewport (kabaca 411×12 140px mobile, 1024×9 307px desktop) — ama şu aynı height -ebilir trigger scroll loader during rendering, folding sonraki logical sayfa -e güncel bir bu nedenle two sayfalar al dizine eklenmiş olarak bir tek URL. durable düzelt dır architectural: persistent, absolute, per-chunk URLs (e.g.
?page=12), linked ile crawlable anchors, ile History API updating adres bar olarak her chunk olur birincil.rel=next/rel=prevdır legacy bençin Google (dropped 2019) ama hâlâ respected tarafından Bing. On ecommerce PLPs, sitemaps veya bir Merchant Center feed dır bir discovery backstop. Verify everything in URL Inspection araç’s rendered HTML.
ilk, bir disambiguation
-erseniz arama “Google infinite scroll” siz’ll hit sonuçlar hakkında Google’ın kendi continuous scroll on onun arama sonuçları sayfalar — bir SERP feature Google turned on ve o hâlde discontinued in mid-2024. şu’s bir Google-product UX decision ve sahiptir nothing -e yap ile nasıl Googlebot tarar sizin site. bu article dır hakkında latter: infinite scroll olarak bir loading pattern on sizin kendi sayfalar, ve whether Google -ebilir dizin ne o loads.
temel constraint: Google yapmaz interact ile sizin sayfa
Everything burada follows -den bir fact. Google’ın kendi lazy-loading docs söyle recommended patterns “yapmayın rely on kullanıcı actions, such olarak scrolling veya clicking, -e load bençerik, bu da önemli olarak Google arama yapmaz interact ile sizin sayfa.” sayfalama doc söyler o hatta daha plainly: “Google’s crawlers yapmayın ‘click’ buttons ve generally yapmayın trigger JavaScript functions şu require kullanıcı actions -e update güncel sayfa contents.”
olarak ben put o in benim kendi JavaScript SEO rehberi: “Googlebot yapmaz take action on webpages. o’s değil going -e click things veya scroll, ama şu yapmaz anlamına gel o yapmaz sahip workarounds. olarak uzun olarak bençerik dır loaded in DOM olmadan bir gerekli action, Google -ecek see o. eğer o’s değil loaded -e DOM until sonra bir click, o hâlde bençerik won’t olmak found.”
bu nedenle infinite scroll şu yalnızca triggers on bir gerçek scroll event dır bir bençerik-discovery sorun önce o’s anything else.
Google’s workaround: bir çok tall viewport
Google yapmaz simulate scrolling. Instead o renders sizin sayfa in bir unusually tall viewport, bu nedenle bençerik bir few screens down dır zaten bençinde rendered area olmadan anyone scrolling. earliest on-record hint of bu idi John Mueller’s 2017 note şu “Googlebot renders ile bir çok tall viewport, hangi skews bazı CSS (çoğu zaman images). Try in Chrome dev-araçlar, eg 9000px high viewport.”
specific numbers ben’ve documented: bençin mobile, Google loads sayfa at bir screen size of 411×731 pixels ve resizes length -e 12 140 pixels — “essentially, o olur bir gerçekten uzun phone ile bir screen size of 411×12140 pixels. bençin desktop, o yapar aynı ve goes -den 1024×768 pixels -e 1024×9307 pixels.” (ben haven’t seen recent re-testler of şunlar exact figures, ve onlar -ebilir vary ile sayfa length; özgün dimensions trace back -e independent testing tarafından SEO researcher JR Oakes.) benşaret et değildir exact pixel count — o’s şu Google fakes “seeing far down sayfa” ile height, değil ile movement.
ele al her ikisi exact pixel dimensions ve two-sayfalar-merged behavior below olarak dated, implementation-specific observations yerine bir stable platform contract — Google yapmaz publish bir resmî spec bençin either number, ve rendering behavior -ebilir change. yapmayın assume sizin site behaves aynı way; yapğrula güncel behavior bençin sizin kendi URLs ile rendered-HTML test et in sonraki section yerine taking bunlar figures olarak bir guarantee.
başarısızlık mode nobody explains: two sayfalar dizine eklenmiş olarak bir
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 ·
burada’s nerede tall viewport bites back. çünkü render viewport dır bu nedenle tall,
scroll-triggered loader -ebilir fire during rendering hatta gerçben nothing
“scrolled” in human sense — sheer DOM height -ebilir olmak enough -e satisfy bir
IntersectionObserver veya bir scroll-position kontrol et. ne zaman şu olur, loader
appends sonraki logical sayfa’s bençerik -e güncel sayfa’s render, ve
Google indexes merged sonuç olarak bir tek URL.
ben’ve diagnosed bu several times. -den benim JavaScript SEO rehberi:
“başka bir sorun ben’ve seen ile bu setup dır, occasionally, two sayfalar al dizine eklenmiş olarak bir. ben’ve seen bu bir few times ne zaman kişiler said onlar couldn’t al onların sayfa dizine eklenmiş. ama ben’ve found onların bençerik dizine eklenmiş olarak part of başka bir sayfa şu’s genellikle previous post -den them.”
“benim theory dır şu ne zaman Google resized viewport -e olmak longer, o triggered infinite scroll ve loaded başka bir article in ne zaman o idi rendering. In bu durum, ne ben recommend dır -e block JavaScript file şu handles infinite scrolling bu nedenle functionality -ebilir’t trigger.”
John Mueller described aynı mechanic -den Google’s side in bir 2022 office-hours session: Google renders ile bir high viewport, şu “-irdi trigger bazı amount of infinite scrolling,” and “biz -ebilir sahip two veya three of bunlar sayfalar loaded on bir sayfa ile infinite scroll, ama değil everything.” (şu office-hours quote dır relayed via arama motoru Journal’s yaz-up, değil yapğrulanmış karşı birincil recording.)
Two consequences fall out of bu:
- orada’s no guarantee of nasıl much alır pulled in. -ebilir olmak nothing extra, -ebilir olmak two veya three sayfalar, never reliably everything. Infinite scroll alone değildir bir dependable way -e al deep bençerik dizine eklenmiş.
- “Not indexed” -ebilir olmak bir misdiagnosis. missing sayfa -ebilir değil olmak missing at tümü — o -ebilir olmak dizine eklenmiş olarak part of bir earlier URL. şu gerektirir bir farklı düzelt -den bir olağbir dizine ekleme bug.
nasıl -e diagnose o
kullan arama Console’s URL Inspection araç ve okuyun rendered HTML, değil raw kaynak. Google’s docs dır explicit: “-ebilirsiniz kullan URL Inspection araç in arama Console -e see eğer tümü bençerik idi loaded. kontrol et rendered HTML -e emin olun sizin bençerik dır in rendered HTML tarafından looking bençin o in URL Inspection araç.” arama rendered HTML bençin bençerik siz expect -e olmak on sayfa 1 yalnızca. -erseniz bul bençerik -den sayfa 2 (veya sonraki article) sitting bençinde sayfa 1’s render, siz’ve reproduced merge bug.
-ebilirsiniz ayrıca replicate tall viewport locally: open Chrome DevTools, ayarla bir çok tall custom viewport (Mueller’s suggestion idi ~9000px), ve load sayfa -e see whether sizin loader fires ile no scrolling.
düzelt: paginated URLs + History API
durable düzelt dır architectural, straight -den Google’s güncel lazy-loading doc. -e yap infinite scroll indexable, “emin olun sizin web sitesi supports paginated loading of bunlar chunks”:
- “Give each chunk its own persistent, unique URL.”
- “Ensure şu bençerik gösterilen on her URL kalır aynı her time o’s
loaded in bir browser” — Google suggests absolute sayfa numbers like
?page=12. - “Avoid using relative elements like
?date=yesterdayin these URLs” — bir adres şu döndürür farklı bençerik her load dır unusable olarak bir canonical. - “bağlantı sequentially -e individual URLs bu nedenle şu arama motorları -ebilir discover
URLs in bir paginated ayarla” — gerçek
<a href>bağlantılar, değil click handlers. - “ne zaman bir yeni sayfa chunk dır loaded in response -e kullanıcı scrolling, ve o olur birincil visible element bençin kullanıcı, update displayed URL kullanarak History API.”
şu son benşaret et dır elegant part. history.pushState() / replaceState() swaps
URL in adres bar olarak kullanıcı scrolls past her boundary — bu nedenle visible
URL her zaman matches birincil bençerik, ve kullanıcı -ebilir refresh, share, ve bağlantı -e
tam olarak nerede onlar dır. Meanwhile crawlable ?page=N URLs var ol independently, bu nedenle
Google -ebilir ulaş her chunk yapğrudan whether veya değil renderer ever triggers
scroll.
Two implementation notes şu önem taşır:
- kullan
IntersectionObserver(veya native browser lazy-loading), değil bir rawscrolllistener. o performs far daha iyi (no scroll-thrash) ve o’s “load ne zaman visible” mechanism Google endorses bençin deferred bençerik. - koru paginated ayarla discoverable independently of JS. gerçek anchors in
DOM, ve/veya
?page=NURLs listed in sizin XML sitemap. Whatever renderer captures, sitemap-ve-bağlantılar layer dır sizin backstop.
eğer bir live site dır zaten exhibiting merge bug ve -meniz gerekir durdur bleeding
önce -ebilirsiniz rebuild, benim blunt emergency düzelt dır -e block JavaScript file şu
triggers infinite scroll in robots.txt bu nedenle o physically -ebilir’t fire during
rendering — buying time -e ship proper paginated-URL architecture.
Navigation state: back, forward, refresh, ve share sahip -e reconstruct aynı view
History API benşaret et above kapsar half contract — updating adres bar olarak bir chunk olur birincil. diğer half dır making sure her entry path back -e şu URL aslında reconstructs yapğru bençerik, değil sadece yapğru scroll position:
- kullan
pushState()ne zaman bir chunk olur birincil visible bençerik bençin ilk time — şu’s bir gerçek navigation adım, ve o’s ne yapar back button meaningful. - kullan
replaceState()bençin corrections şu shouldn’t oluştur onların kendi back-button durdur, like syncing URL sonra bir fast scroll past several chunks at once. - Listen bençin
popstateve re-render (veya re-fetch) chunk şu matches URL in event. browser’s default back/forward behavior restores scroll position, değil dynamic liste state sizin JavaScript oluşturulmuş — eğer bir kullanıcı hits back sonra sizin loader appended 40 daha items, -meniz gerekir reconstruct hangi items belong on şu sayfa, değil sadece scroll them orada. - yapmayın lean on automatic scroll restoration alone -e solve bu. o controls nerede viewport lands, değil ne bençerik dır present — eğer underlying liste -ebilir change arasında visits (yeni products eklendi, items out of stock), scroll position olmadan bençerik reconstruction -ebilir strand kullanıcı in yanlış context.
bu aynı discipline paginated-URL düzelt zaten depends on: bir chunk’s URL sahiptir -e döndür bençerik o promised on bir fresh load, bir refresh, ve bir arama-Console live test et — değil sadece ilk time o’s fetched mid-scroll.
Loading, error, ve end-of-sonuçlar states
bir production implementation gerektirir daha states -den “loading” ve “loaded”:
- Initial load — ilk chunk -meli zaten olmak in raw HTML server sends, değil assembled entirely tarafından JS sonra fact.
- sonraki-chunk loading — bir visible in-progress indicator bu nedenle kullanıcılar (ve anyone testing ile assistive tech) know bir fetch dır underway.
- Empty — bir distinct state bençin zero sonuçlar, değil bir blank space şu görünür broken.
- Error / retry — bir failed fetch shouldn’t silently strand sayfa ile no way -e try yeniden, ve bir retry shouldn’t yinelenen veya reorder items zaten on sayfa.
- End of sonuçlar — bir clear sinyal, değil bir infinite spinner, once orada’s nothing left -e load.
None of bu Google-specific, ama o’s aynı reliability paginated-URL düzelt depends on: eğer loader -ebilir silently break mid-fetch, -ebilirsiniz’t trust şu herhangi bir given tarama veya kullanıcı session aslında captured chunk o -meli sahip.
Accessibility ve performance: two things infinite scroll yapmaz ver siz bençin free
Infinite scroll sahiptir no inherent temel Web Vitals outcome, good veya bad — o’s determined entirely tarafından nasıl siz oluştur o. her appended chunk grows DOM, ve bir büyük enough DOM raises layout ve style-recalculation maliyet, bu nedenle watch append maliyet, image loading, layout shift -den bençerik olmadan reserved space, ve uzun tasks olarak liste grows. On çok uzun sayfalar, düşün virtualizing chunks şu sahip scrolled far out of view (removing onların DOM nodes) yerine letting DOM grow unbounded.
Accessibility gerektirir onun kendi deliberate design, değil bir assumption şu “o renders, bu nedenle o’s fine”:
- Keyboard kullanıcılar ihtiyaç duy -e olmak able -e ulaş yeni bençerik — ve footer veya end-of-sayfa navigation — olmadan sayfa silently growing out -den altında onların tab sıra.
- Screen reader kullanıcılar ihtiyaç duy yeni bençerik announced olmadan interrupting ne onlar’re doing — bir polite status region, değil bir disruptive alert, dır usual pattern.
- WAI-ARIA feed design pattern dır oluşturulmuş bençin tam olarak bu durum: article-level regions bençinde bir feed container, ile defined keyboard behavior bençin moving arasında items ve bençin reaching bençerik önce ve sonra feed.
- Focus shouldn’t silently jump veya al lost ne zaman bir yeni chunk loads.
None of bu optional cleanup. o’s difference arasında infinite scroll şu çalışır bençin everyone ve bir şu yalnızca çalışır bençin bir mouse kullanıcı ile JavaScript kim never strays -den happy path.
historical context: rel=sonraki/prev dır legacy
-erseniz öğrenilmiş sayfalama years ago, siz öğrenilmiş rel="next" / rel="prev". Google
introduced them in 2011 ve paired them ile onun özgün 2014 “infinite scroll
arama-friendly recommendations” (paginate bençerik, provide component sayfalar).
o hâlde in 2019 Google announced o hadn’t olmuş kullanarak şunlar tags bençin years ve formally
dropped them. sayfalama doc confirms o today: “In past, Google kullanılan
<link rel="next" href="..."> ve <link rel="prev" href="..."> -e identify sonraki sayfa
ve previous sayfa relationships. Google no longer kullanır bunlar tags, her ne kadar bunlar bağlantılar
-ebilir hâlâ olmak kullanılan tarafından diğer arama motorları.”
bu nedenle güncel Google recipe dır unique URLs + crawlable bağlantılar + History API — no
rel=next/rel=prev required. ama “other search engines” bençerir Bing, hangi
hâlâ respects them, bu nedenle orada’s no harm in tutma them in sizin markup bençin cross-motor
benefit ve accessibility. Bing itself yapmaz publish infinite-scroll-specific
rehberlik; onun stance reduces -e general JS-rendering caution onun ekip laid out —
bingbot -ebilir render JavaScript ama “o dır difficult bençin bingbot -e süreç JavaScript at
scale,” bu nedenle bir crawlable paginated fallback yardımcı olur Bing bençin tam olarak aynı neden o
yardımcı olur Google.
Ecommerce category sayfalar: highest-stakes durum
en çok yaygın gerçek-world infinite scroll dır on ecommerce category / product listing sayfalar (PLPs), ve o’s nerede risk maliyetler gerçek money. eğer deep-catalog products past ilk screenful never al dizine eklenmiş, onlar -ebilir’t rank, ve siz lose uzun tail of product-level organic trafik. bu aynı territory covered in depth in category-sayfa material — infinite scroll dır bir daha neden şunlar sayfalar ihtiyaç duy bir crawlable structure underneath UX.
Two backstops önem taşır burada:
- XML sitemaps listing her canonical product ve paginated category URL, bu nedenle discovery yapmaz depend on renderer.
- bir Merchant Center product feed, hangi feeds Google product data independently of whatever category sayfa’s renderer captures.
Lumar’s analysis of top UK fashion retailers found infinite scroll -e olmak, in onların words, “the biggest loser when it comes to indexability and SEO friendliness” among sayfalama patterns — bir yararlı reminder şu bu değildir bir theoretical edge durum, o’s default başarısızlık mode of bir çok popular PLP UX. (Lumar’s specific percentage figures -meli olmak okuyun -den onların live rapor önce alıntılanmaya değer bir exact number.)
Infinite scroll vs. sayfalama vs. load daha
Google’s sayfalama doc frames three UX patterns ve dır honest hakkında tradeoffs. Infinite scroll “uses a single page for all content” ve dır “intuitive — kullanıcı sadece keeps scrolling,” but it “-ebilir lead -e ‘scrolling fatigue’ çünkü of unclear sonuç size” and “-ebilir’t ele al çok büyük numbers of sonuçlar.” Classic numbered sayfalama dır en çok robust bençin SEO çünkü her sayfa dır inherently bir gerçek URL. “Load more” sits in arasında — fine eğer button dır (veya wraps) bir gerçek bağlantı -e bir paginated URL, useless bençin SEO eğer o’s bir pure click handler.
decision değildir “which is allowed” — tümü three dır allowed. o’s “hangi UX yap siz iste, ve yaptı siz oluştur crawlable URL layer underneath o.” Mueller’s 2023 özet dır whole thing in bir line: “eğer her piece veya virtual sayfa dır ayrıca accessible ve findable aracılığıyla bir unique URL, generally o -meli olmak fine -e sahip infinite scroll.”
AI özet
bir condensed take on Advanced sürüm:
- Root constraint: Googlebot yapmaz scroll veya click. bençerik gated behind bir scroll veya click event dır invisible -e o tarafından default (“Google arama yapmaz interact ile sizin sayfa”).
- Google’s workaround: o renders in bir çok tall viewport (~411×12 140px mobile, ~1024×9 307px desktop) yerine scrolling.
- ** başarısızlık mode:** şu tall viewport -ebilir trigger scroll loader during rendering, folding sonraki logical sayfa -e güncel bir — bu nedenle two sayfalar al dizine eklenmiş olarak bir tek URL. bir “not indexed” sayfa -ebilir aslında olmak dizine eklenmiş olarak part of başka bir URL.
- No guarantee: per Mueller, Google -ebilir load “two veya three of bunlar sayfalar … ama değil everything.” Infinite scroll alone değildir bir reliable deep-dizine ekleme yöntem.
- ** düzelt (architectural):** persistent, unique, absolute per-chunk URLs (e.g.
?page=12), linked ile crawlable<a href>, ile History API (pushState/replaceState) updating adres bar olarak her chunk olur birincil. - Trigger mechanism:
IntersectionObserver/ native lazy-load, değil bir rawscrolllistener. - Legacy note:
rel=next/rel=prevdropped tarafından Google in 2019; Bing hâlâ supports o, bu nedenle koru o bençin cross-motor benefit. - Ecommerce: PLPs dır highest-stakes durum; back them ile sitemaps ve bir Merchant Center feed. Verify in URL Inspection araç’s rendered HTML.
- Emergency düzelt on bir live merge bug: block infinite-scroll JS file bu nedenle o -ebilir’t fire during rendering -iken siz rebuild.
- Navigation state:
pushStatebençin bir gerçek navigation adım,replaceStatebençin in-place corrections, ve birpopstatehandler şu reconstructs chunk’s bençerik — değil sadece onun scroll position — on back/forward. - Loading/error/end states: distinct initial-load, sonraki-chunk-loading, empty, error/retry, ve end-of-sonuçlar states; bir broken loader dır bir reliability sorun önce o’s bir SEO bir.
- Accessibility ve performance: infinite scroll sahiptir no inherent temel Web Vitals outcome (o’s ne siz oluştur); keyboard reachability, non-disruptive announcements, ve WAI-ARIA feed pattern dır separate design çalışır -den dizine ekleme düzelt.
- Dated observations: ele al exact viewport pixel dimensions ve merge-bug mechanics olarak implementation-specific, değil bir stable spec — verify per URL.
resmî dokümantasyon
birincil-kaynak dokümantasyon on infinite scroll, sayfalama, ve JS rendering.
- düzelt lazy-loaded bençerik — bençerir “Support paginated loading for infinite scroll” section (unique per-chunk URLs, absolute sayfa numbers, History API) ve URL Inspection testing adım. son updated 2025-12-10.
- sayfalama, incremental sayfa loading, ve onların impact on Google arama — three UX patterns (sayfalama / load daha / infinite scroll), onların pros/cons, crawler-interaction note, ve
rel=next/rel=prevdeprecation. - Infinite scroll arama-friendly recommendations — özgün 2014 blog post (historical;
rel=next/rel=prevpairing o described dır now superseded). - September 2023 SEO Office Hours Transcript — Mueller’s on—record restatement of unique-URL kural.
- Understand JavaScript SEO basics — broader rendering context infinite scroll sits bençinde.
Bing / Microsoft
- bingbot Series: JavaScript, Dynamic Rendering, ve Cloaking. Oh benim! — Bing’s general JS-rendering rehberlik (no infinite-scroll-specific sayfa vardır; Bing hâlâ respects
rel=next/rel=prev).
Quotes -den kaynak
On—record statements -den Google ve Bing. her bağlantı dır bir deep bağlantı şu jumps -e quoted passage on kaynak sayfa.
Google — infinite scroll & paginated-loading kural
- “To implement infinite scroll in an indexable way, make sure your website supports paginated loading of these chunks.” … “Give each chunk its own persistent, unique URL.” — Google arama Central, “Fix lazy-loaded content.” Jump -e quote
- “When a new page chunk is loaded in response to the user scrolling, and it becomes the primary visible element for the user, update the displayed URL using the History API.” Jump -e quote
- “The methods mentioned 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.” Jump -e quote
- “You can use the URL Inspection Tool in Search Console to see if all content was loaded. Check the rendered HTML to make sure your content is in the rendered HTML by looking for it in URL Inspection Tool.” Jump -e quote
Google — sayfalama doc: crawler behavior & rel=sonraki/prev
- “Google’s crawlers don’t ‘click’ buttons and generally don’t trigger JavaScript functions that require user actions to update the current page contents.” Jump -e quote
- “In the past, Google used
<link rel="next" href="...">and<link rel="prev" href="...">to identify next page and previous page relationships. Google no longer uses these tags, although these links may still be used by other search engines.” Jump -e quote
John Mueller, Google — Eylül 2023 çalışma saatleri
- “It depends how you implement infinite scrolling. if each piece or virtual page is also accessible and findable through a unique URL, generally it should be fine to have infinite scroll.” Jump -e quote
John Mueller, Google — “9000px viewport” tweet (Nov 2017)
- “Googlebot renders with a very tall viewport, which skews some CSS (often images). Try in Chrome dev-tools, eg 9000px high viewport.” — reproduced tarafından arama motoru Roundtable. okuyun coverage
Bing — general JS rendering (no infinite-scroll-specific sayfa)
- “As we shared last week at SMX East, bingbot is generally able to render JavaScript. However, bingbot does not necessarily support all the same JavaScript frameworks that are supported in the latest version of your favorite modern browser.” — Fabrice Canel & Frédéric Dubut, Microsoft Bing. Jump -e quote
hangi sayfalama pattern -meli siz kullan?
çalışır top -e bottom.
1. yapar bençerik past ilk screen ihtiyaç duy -e rank in arama?
- No (e.g. bir internal-yalnızca feed, bir logged-in dashboard) → herhangi bir pattern dır fine; optimize purely bençin UX.
- Yes → koru going.
2. yap siz zaten sahip (veya -ebilir siz oluştur) bir gerçek per-chunk URL bençin her batch?
- No, ve -ebilirsiniz’t → kullan classic numbered sayfalama. her sayfa dır bir gerçek URL tarafından default, bu nedenle o’s lowest-risk pattern bençin SEO.
- Yes → infinite scroll veya “load more” dır her ikisi fine, continue.
3. nasıl büyük dır ayarla?
- çok büyük (thousands of items, deep catalog) → prefer numbered sayfalama veya infinite-scroll-üzerinde-gerçek-URLs; pure infinite scroll “-ebilir’t ele al çok büyük numbers of sonuçlar.” ekle sitemaps olarak bir discovery backstop.
- Moderate → infinite scroll veya load daha, backed tarafından paginated URLs, dır fine.
4. Building infinite scroll — dır o wired -e gerçek URLs + History API?
- No (scroll event yalnızca, no URLs) → yapmayın ship. bu setup şu alır deep bençerik merged/unindexed.
- Yes (
?page=NURLs + crawlable anchors +pushState) → ship o, o hâlde verify in URL Inspection araç’s rendered HTML.
5. zaten live ve bir deep sayfa “isn’t indexed”?
- kontrol et URL Inspection araç’s rendered HTML of previous sayfa/post ilk — “missing” bençerik -ebilir olmak merged orada.
- eğer o dır → emergency düzelt: block infinite-scroll JS file bu nedenle o -ebilir’t fire during rendering, o hâlde rebuild on paginated URLs.
arama-friendly infinite scroll checklist
- her bençerik chunk sahiptir onun kendi persistent, unique, absolute URL (e.g.
?page=2, değil?date=yesterday). - her URL döndürür aynı bençerik her time o loads (stable, değil session-dependent).
- Chunks dır linked ile gerçek
<a href>bağlantılar, discoverable olmadan çalışbir JS. - visible URL updates via History API (
pushState/replaceState) olarak her chunk olur birincil bençerik. - scroll loader kullanır
IntersectionObserver(veya native lazy-loading), değil bir rawscrollevent listener. - Paginated URLs dır listed in XML sitemap (ve, bençin ecommerce, backed tarafından bir Merchant Center feed).
-
rel=next/rel=prevoptionally present bençin Bing (harmless bençin Google, hangi ignores o). - URL Inspection araç → rendered HTML confirms deep bençerik dır present ve değil merged -den bir adjacent sayfa.
- Locally reproduced ile bir tall DevTools viewport (~9000px) -e yapğrula loader yapmaz üzerinde-fire during render.
- bir
popstatehandler reconstructs chunk bençerik on back/forward, değil sadece scroll position. - Distinct loading, error/retry, empty, ve end-of-sonuçlar states var ol — bir failed fetch yapmaz silently strand sayfa.
- Keyboard kullanıcılar -ebilir ulaş yeni bençerik ve sayfa footer; yeni bençerik dır announced via bir polite status region, değil bir disruptive alert.
ne breaks infinite scroll bençin SEO
Scroll-event-yalnızca loading ile no gerçek URLs. classic mistake. bençerik lives yalnızca in DOM sonra bir scroll fires — Googlebot never scrolls, bu nedenle o’s invisible. orada’s nothing -e tarama ve nothing -e fall back on.
bir “Load more” button şu’s bir pure click handler.
Feels safer -den auto-scroll, değildir. Google yapmaz click buttons either. o yalnızca yardımcı olur
eğer button dır (veya wraps) bir gerçek <a href> -e bir paginated URL.
Fragment/hash URLs bençin sayfalama (#page=2).
Fragments yapmayın oluştur distinct crawlable URLs. kullan gerçek sorgu-parameter veya path-based
URLs instead.
Relative veya unstable URLs (?date=yesterday, session-scoped bençerik).
eğer aynı URL döndürür farklı bençerik on farklı loads, o -ebilir’t sun olarak bir stable,
indexable sayfa. kullan absolute sayfa numbers.
Ignoring tall-viewport merge bug. Assuming “not indexed” anlamına gelir Google dır ignoring sayfa. In infinite scroll o çoğu zaman anlamına gelir bençerik aldı folded -e bir adjacent URL tarafından render-time trigger — bir farklı sorun needing bir farklı düzelt.
Blocking sizin JS/CSS globally olarak bir “fix.” Blocking specific infinite-scroll trigger file dır bir deliberate emergency measure. Blocking tümü JS/CSS değildir — o wrecks rendering genelinde whole sayfa.
Sonsuz kaydırma SEO’su — kısa başvuru
** three UX patterns**
| Pattern | Inherently crawlable? | SEO risk | en iyi bençin |
|---|---|---|---|
| Numbered sayfalama | Yes (gerçek URLs) | Lowest | büyük sets, deep catalogs |
| Load daha (button) | yalnızca eğer button = gerçek bağlantı | Medium | Moderate sets |
| Infinite scroll | No — gerektirir URL layer eklendi | Highest olmadan URLs | Feeds, browsing UX |
** non-negotiables bençin infinite scroll**
- Persistent, unique, absolute URL per chunk (
?page=12). - aynı bençerik on her load (no
?date=yesterday). - Crawlable
<a href>bağlantılar arasında chunks. - History API (
pushState/replaceState) -e sync adres bar. IntersectionObserver, değil bir rawscrolllistener.
Kısa bilgiler
- Googlebot: yapmaz scroll, yapmaz click.
- Render viewport (reported): ~411×12 140px mobile, ~1024×9 307px desktop.
- Merge bug: tall viewport -ebilir fire loader mid-render → two sayfalar dizine eklenmiş olarak bir.
rel=next/rel=prev: Google dropped o in 2019; Bing hâlâ kullanır o.- Verify: URL Inspection araç → rendered HTML.
- Emergency düzelt on bir live merge bug: block infinite-scroll JS file.
ne good ve bad implementations bak like
Bad — scroll-yalnızca, invisible -e Google
category sayfa ships 24 products in HTML. bir scroll listener fetches sonraki
24 ve appends them. vardır no ?page=N URLs anywhere, no anchors, no History API.
Googlebot loads sayfa, never scrolls, ve indexes 24 products. diğer 300 in
catalog dır undiscoverable aracılığıyla bu sayfa.
Bad — merge bug in wild
bir publisher’s blog kullanır infinite scroll -e append sonraki post below güncel bir. bir writer complains onların yeni article “won’t index.” o’s aslında dizine eklenmiş — olarak part of previous post’s URL, çünkü Google’s tall render viewport triggered loader ve folded sonraki article -e güncel sayfa’s render. düzelt: paginate uygun biçimde, ve in meantime block infinite-scroll trigger script.
Good — infinite scroll üzerinde gerçek URLs
aynı category vardır at /shoes?page=1, /shoes?page=2, … her bir gerçek URL returning
stable bençerik, tümü listed in XML sitemap ve linked ile <a href> at foot of
listing. bençin humans, IntersectionObserver loads sonraki chunk olarak onlar approach bottom
ve history.pushState() updates adres bar -e ?page=2 ne zaman şu batch olur
birincil bençerik. Google reaches her sayfa yapğrudan via bağlantılar ve sitemap; scroll UX
dır pure enhancement on top.
Implementation ve diagnostic snippets
History API pattern (client-side)
Load her chunk ne zaman o’s hakkında -e enter view ile IntersectionObserver, o hâlde swap
visible URL ne zaman şu chunk olur birincil. key dır şu ?page=N URLs dır gerçek
sayfalar şu var ol server-side regardless of bu script.
// A sentinel element sits at the bottom of the current chunk.
const sentinel = document.querySelector('#load-more-sentinel');
let nextPage = 2;
const io = new IntersectionObserver(async (entries) => {
if (!entries[0].isIntersecting) return;
const res = await fetch(`/shoes?page=${nextPage}&partial=1`);
const html = await res.text();
document.querySelector('#product-grid').insertAdjacentHTML('beforeend', html);
// Update the address bar so refresh/share/link land on this chunk.
// pushState adds a history entry; replaceState if you don't want back-button steps.
history.pushState({ page: nextPage }, '', `/shoes?page=${nextPage}`);
nextPage++;
}, { rootMargin: '600px' }); // start loading before the user hits the very bottom
io.observe(sentinel);ve crucially, crawlable fallback hâlâ lives in DOM — bu ne Google follows:
<nav aria-label="Pagination">
<a href="/shoes?page=2" rel="next">Next</a>
<!-- rel="next"/"prev" is ignored by Google since 2019 but still used by Bing -->
</nav>DevTools console: yapar sizin loader fire olmadan bir gerçek scroll?
Simulate Google’s tall viewport locally, o hâlde kontrol et whether extra chunks loaded on onların kendi. In Chrome DevTools, ayarla bir çok tall custom device viewport (~1024×9000), reload, ve çalıştır bu in Console -e count nasıl çok söyleıda chunks dır present ile no manual scrolling:
// Count rendered product cards (adjust the selector to your markup)
console.log('cards rendered without scrolling:', document.querySelectorAll('#product-grid .product-card').length);
// If this is much higher than your per-page count, the loader is over-firing on height alone.DevTools console: yapğrula paginated URLs aslında var ol
önce trusting fallback, verify her ?page=N döndürür gerçek, distinct bençerik
server-side (değil bir JS-yalnızca route):
// Run in the console; a real paginated URL should return HTML containing products.
for (const n of [2, 3, 4]) {
const html = await (await fetch(`/shoes?page=${n}`)).text();
console.log(`page ${n}: ${html.includes('product-card') ? 'has products ✅' : 'EMPTY — JS-only? ❌'}`);
}Bookmarklet: jump straight -e bir sayfa’s rendered-HTML kontrol et
Drag bu -e sizin bookmarks bar -e open güncel URL in arama Console’s URL Inspection araç, nerede siz o hâlde okuyun rendered HTML (değil kaynak) -e see nasıl far down Google captured bençerik:
javascript:(()=>{const u=encodeURIComponent(location.href);open('https://search.google.com/search-console/inspect?resource_id=&id='+u,'_blank');})();siz’ll hâlâ seç sizin verified property bençinde arama Console; bookmarklet sadece
saves kopya-paste of güncel URL. Prove infinite scroll dır indexable sonra launch
test et bir lazy-loaded product grid olmadan conflating browser states
bir tek screenshot -den bir tall browser window değildir enough. çalıştır aynı category URL aracılığıyla bu matrix ve başla her fresh-navigation durum ile bir empty sayfa cache veya bir documented, consistent cache state:
| çalıştır | Viewport | Entry yöntem | Interaction |
|---|---|---|---|
| bir | Standard mobile veya desktop height | Fresh navigation | None |
| B | çok tall height | Fresh navigation at şu height | None |
| C | Standard height, o hâlde resized tall | Navigation ilk, resize ikinci | None |
| D | Standard height | Fresh navigation | Incremental scrolling -e end |
Fresh navigation ve resizing dır farklı testler. bir component -ebilir register onun observer, calculate thresholds, veya fetch onun ilk batch yalnızca during initialization; resizing bir zaten-çalışbir sayfa -ebilir therefore geç ne zaman bir crawler-style navigation at final dimensions fails, veya vice versa. Incremental scrolling dır bir kullanıcı-path control, değil bir substitute bençin no-interaction runs.
bençin her çalıştır, record:
- requested URL ve final adres-bar URL;
- viewport dimensions ve whether sayfa idi loaded veya resized at şunlar dimensions;
- product cards rendered sonra her load;
- unique product URLs in gerçek
<a href>attributes; - yinelenen, missing, veya cross-sayfa product URLs;
- network istekler ve trigger şu initiated her additional batch;
- whether sayfa/chunk boundaries update URL ve survive refresh;
- relevant accessibility-tree nodes, names, roller, ve bağlantı destinations.
Reconcile şunlar counts karşı beklenen catalog veya paginated-chunk inventory. Visible card count ve unique bağlantı count dır separate assertions: bir grid -ebilir paint 48 cards -iken exposing fewer crawlable product bağlantılar, duplicated destinations, veya controls şu dır absent -den accessibility tree. koru bir distinctive ilk ve son SKU her biri bençin chunk bu nedenle -ebilirsiniz detect bir tall viewport silently merging sayfa 2 -e sayfa 1.
test et her chunk olarak bir standalone URL
test et -e çalıştır: istek ilk, middle, ve son paginated URLs yapğrudan ile JavaScript disabled. beklenen sonuç: her döndürür stable, unique bençerik ve bir successful response olmadan requiring bir scroll. başarısızlık interpretation: URL layer dır cosmetic veya hâlâ depends on client interaction. izleme window: Immediate sonra deployment. Rollback trigger: herhangi bir listed chunk yönlendirmeler -e ilk sayfa, döndürür shared shell, veya changes bençerik arasında istekler.
test et crawler discovery olmadan interaction
test et -e çalıştır: Inspect rendered DOM önce scrolling ve extract sayfalama
bağlantılar. beklenen sonuç: Sequential chunks dır linked aracılığıyla gerçek absolute veya
root-relative href values. başarısızlık interpretation: crawler sahiptir no path beyond
ilk loaded ayarla. izleme window: Immediate. Rollback trigger: sonraki
chunk vardır yalnızca behind bir button handler veya scroll event.
test et bençin tall-viewport merge bug
test et -e çalıştır: Render ilk chunk in bir çok tall Chrome viewport, o hâlde arama DOM bençin bir distinctive item -den sonraki chunk. beklenen sonuç: ilk URL yapmaz absorb sonraki URL’s birincil bençerik. başarısızlık interpretation: loader fires during rendering hatta olmadan kullanıcı interaction. izleme window: Immediate locally, o hâlde recheck URL Inspection sonra Google recrawls. Rollback trigger: Two logical chunks görün olarak bir belge veya adres bar yapmaz izle birincil visible chunk.
test et yourself: Infinite Scroll SEO
Five quick questions on making infinite scroll indexable. seç bir yanıt her biri bençin, o hâlde kontrol et.
kaynaklar worth sizin time
benim related yazma
- JavaScript SEO sorunlar & en iyi Practices — benim full yaz-up, dahil “Infinite scroll issues” section (two sayfalar dizine eklenmiş olarak bir) ve “What Googlebot sees” viewport figures.
- Beginner’s rehber -e teknik SEO — nerede rendering ve crawlability fit in bigger picture.
benim speaking
- nasıl arama çalışır (SlideShare) — benim walkthrough of tarama, rendering, dizine ekleme, ve sıralama, bu da backdrop -e her infinite-scroll decision. (benim standing disclaimer uygulanır: “This is my understanding of systems… not going to be 100% complete or accurate.”)
-den yaklaşık industry
- Google arama Central, düzelt lazy-loaded bençerik — güncel, authoritative “Support paginated loading for infinite scroll” rehberlik.
- Google arama Central, sayfalama, incremental sayfa loading, ve onların impact on Google arama — three UX patterns ve
rel=next/rel=prevdeprecation. - Matt G. Southern, nasıl Google tarar sayfalar ile Infinite Scrolling (arama motoru Journal) — Mueller “two or three pages loaded on one page” explanation of merge risk.
- Matt G. Southern, Google’s Martin Splitt Explains neden Infinite Scroll nedenler SEO Problems (arama motoru Journal) — “Googlebot doesn’t scroll,” IntersectionObserver vs. scroll, ve “test your implementations.”
- Barry Schwartz, GoogleBot tarar & Renders Tall, ile 9000px High Viewport? (arama motoru Roundtable) — origin of tall-viewport explanation.
- Matthew Edgar, SEO Friendly Infinite Scroll — “component pages” framing (chunks şu çalışır independently, hatta ile JS off).
- Go Fish Digital, nasıl -e Implement Infinite Scroll bençin SEO — bir implementation-oriented walkthrough.
- Lumar, State of sayfalama in eCommerce — top-UK-fashion-retailer indexability analysis şu rated infinite scroll worst-performing pattern.
Değişiklik günlüğü
8 Ağu 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
29 Tem 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.
18 Tem 2026 tarihinde güncellendi.
Editoryal özet ve kaydedilen değişiklik ayrıntıları.Değişiklik ayrıntıları
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
-
Ayrıntılı değişiklik notları şu anda İngilizce olarak mevcut.
Tam karşılaştırma kullanılamıyor — bu sürüm için önceki anlık görüntü arşivlenmemiş.