Hướng dẫn về Infinite Scroll SEO

Cách implement infinite scroll không có losing của bạn lập chỉ mục — vì sao Googlebot không scroll, đó tall-viewport render trick đó flattens hai các trang vào một, đó paginated-URL + History API cách sửa, và đó ecommerce category-trang case.

Xuất bản lần đầu: 3 thg 7, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ

Infinite scroll loads hơn nội dung as bạn scroll, thay vì qua numbered các trang — và Googlebot không bao giờ scrolls hoặc clicks, so bất cứ điều gì gated behind đó hành động là invisible theo mặc định. Google renders trong một very tall viewport (về 411×12 140px mobile, 1024×9 307px desktop) as một workaround, nhưng đó giống nhau tall viewport có thể trigger đó scroll loader during kết xuất và fold hai logical các trang vào một được lập chỉ mục URL — một chế độ lỗi nơi một 'không được lập chỉ mục' trang là thực ra được lập chỉ mục as part of một sản phẩm khác. Đó cách sửa là architectural: cho mỗi chunk một real, persistent, absolute URL (như ?trang=2), link them với crawlable anchors, và cập nhật đó address bar với đó History API as người dùng scrolls. rel=tiếp theo/prev là legacy (Google dropped điều này trong 2019; Bing vẫn hỗ trợ điều này). On ecommerce category các trang, lại điều này all với sitemaps hoặc một Merchant Center feed và verify trong đó URL Inspection Tool được kết xuất HTML. MỘT production xây dựng cũng cần một real popstate/lại-forward contract, distinct loading/lỗi/end trạng thái, và deliberate accessibility — none of đó xuất hiện cho free chỉ vì đó lập chỉ mục cách sửa là trong place.

Tóm tắt — Googlebot không bao giờ scrolls và không bao giờ clicks, so scroll-gated nội dung là invisible theo mặc định. Google workaround là để render trong rất tall viewport (khoảng 411×12 140px mobile, 1024×9 307px desktop) — nhưng đó giống nhau height có thể trigger scroll loader during kết xuất, folding tiếp theo logical trang vào hiện tại một so hai các trang nhận được lập chỉ mục as single URL. durable khắc phục là architectural: persistent, absolute, theo-chunk các URL (e.g. ?page=12), linked với crawlable anchors, với History API updating address bar as mỗi chunk becomes chính. rel=next/rel=prev là legacy cho Google (dropped 2019) nhưng vẫn respected by Bing. On ecommerce PLPs, sitemaps hoặc Merchant Center feed là phát hiện backstop. Verify mọi thứ trong URL Inspection Tool được kết xuất HTML.

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

đầu tiên, disambiguation

Nếu bạn tìm kiếm “Google infinite scroll” (bản dịch) «Google infinite scroll» bạn’ll hit kết quả về Google own continuous scroll on của nó kết quả tìm kiếm các trang — một SERP feature Google turned on và thì discontinued trong mid-2024. đó là một Google-sản phẩm UX decision và có không có gì để làm với cách Googlebot crawl của bạn site. Này bài viết là về đó latter: infinite scroll as một loading pattern on của bạn own các trang, và liệu Google có thể chỉ mục điều gì điều này loads.

cốt lõi constraint: Google không interact với của bạn trang

Mọi thứ ở đây follows từ một fact. Google own lazy-loading tài liệu chẳng hạn đó được khuyến nghị 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.” (bản dịch) «không rely on người dùng actions, such as scrolling hoặc clicking, để load nội dung, mà là quan trọng as Google Search không interact với trang của bạn.» Đó pagination doc says điều này ngay cả hơn plainly: “Google’s crawlers don’t ‘click’ buttons and generally don’t trigger JavaScript functions that require user actions to update the current page contents.” (bản dịch) «Google các crawler không ‘nhấp’ buttons và generally không trigger JavaScript functions đó require người dùng actions để cập nhật đó hiện tại trang nội dung.»

As I put điều này trong my own JavaScript SEO hướng dẫn: “Googlebot doesn’t take action on webpages. It’s not going to click things or scroll, but that doesn’t mean it doesn’t have workarounds. As long as content is loaded in the DOM without a needed action, Google will see it. If it’s not loaded into the DOM until after a click, then the content won’t be found.” (bản dịch) «Googlebot không take hành động on webpages. đây là không going để nhấp điều hoặc scroll, nhưng đó không có nghĩa là điều này không có workarounds. Miễn là nội dung là loaded trong đó DOM không có một needed hành động, Google sẽ see điều này. Nếu đây là không loaded vào đó DOM until sau một nhấp, thì đó nội dung sẽ không là được tìm thấy.»

So infinite scroll đó chỉ triggers on thực scroll event là nội dung-phát hiện vấn đề trước khi nó bất cứ điều gì khác.

Google workaround: rất tall viewport

Google không simulate scrolling. Thay vì điều này renders trang của bạn trong an unusually tall viewport, so nội dung vài screens xuống là đã bên trong đó được kết xuất area không có anyone scrolling. Đó earliest on-record hint of này đã là John Mueller 2017 note đó “Googlebot renders with a very tall viewport, which skews some CSS (often images). Try in Chrome dev-tools, eg 9000px high viewport.” (bản dịch) «Googlebot renders với một very tall viewport, mà skews some CSS (thường images). Try trong Chrome dev-tools, eg 9000px cao viewport.»

Đó cụ thể numbers I’ve được ghi lại: cho mobile, Google loads đó trang tại một screen size of 411×731 pixels và resizes đó length để 12 140 pixels — “essentially, it becomes a really long phone with a screen size of 411×12140 pixels. For desktop, it does the same and goes from 1024×768 pixels to 1024×9307 pixels.” (bản dịch) «essentially, điều này becomes một thực sự dài phone với một screen size of 411×12140 pixels. Cho desktop, điều này làm đó giống nhau và goes từ 1024×768 pixels để 1024×9307 pixels.» (I haven’t seen gần đây re-các kiểm thử of những chính xác figures, và they có thể vary với trang length; đó original dimensions trace lại để independent kiểm thử by SEO researcher JR Oakes.) Đó point không đó chính xác pixel count — đây là đó Google fakes “seeing far down the page” (bản dịch) «seeing far xuống đó trang» với height, không với movement.

Treat cả hai chính xác pixel dimensions và hai-các trang-đã hợp nhất behavior dưới as dated, implementation-cụ thể observations thay vì ổn định nền tảng contract — Google không publish chính thức spec cho either number, và kết xuất behavior có thể thay đổi. không assume của bạn trang web behaves giống nhau way; xác nhận hiện tại behavior cho của bạn own các URL với được kết xuất-HTML kiểm thử trong tiếp theo section thay vì taking những điều này figures as bảo đảm.

thất bại chế độ không ai giải thích: hai các trang được lập chỉ mục as một

A height-triggered loader can fire during rendering and merge two logical pages under one indexed URL. Nguồn: /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 ·

Ở đây nơi tall viewport bites lại. vì render viewport là so tall, scroll-triggered loader có thể fire during kết xuất mặc dù không có gì “scrolled” trong human hợp lý — sheer DOM height có thể là đủ để satisfy IntersectionObserver hoặc scroll-position kiểm tra. Khi đó happens, loader appends tiếp theo logical trang nội dung vào hiện tại trang render, và Google indexes đã hợp nhất kết quả as single URL.

I’ve diagnosed điều này several times. từ my JavaScript SEO hướng dẫn:

“Another issue I’ve seen with this setup is, occasionally, two pages get indexed as one. I’ve seen this a few times when people said they couldn’t get their page indexed. But I’ve found their content indexed as part of another page that’s usually the previous post from them.” (bản dịch) «Một vấn đề khác tôi từng thấy với cách triển khai này là đôi khi hai trang bị lập chỉ mục như một. Tôi đã gặp trường hợp này vài lần khi mọi người nói họ không thể lập chỉ mục trang của mình. Nhưng tôi phát hiện nội dung của họ được lập chỉ mục như một phần của một trang khác, thường là bài đăng trước đó của chính họ.»

“My theory is that when Google resized the viewport to be longer, it triggered the infinite scroll and loaded another article in when it was rendering. In this case, what I recommend is to block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (bản dịch) «Theo giả thuyết của tôi, khi Google thay đổi kích thước viewport thành dài hơn, thao tác đó đã kích hoạt infinite scroll và tải thêm một bài viết trong lúc kết xuất. Trong trường hợp này, tôi khuyến nghị chặn JavaScript tệp xử lý infinite scroll để chức năng đó không thể’t trigger.»

John Mueller described đó giống nhau mechanic từ Google side trong một 2022 office-hours session: Google renders với một cao viewport, đó “would trigger some amount of infinite scrolling,” (bản dịch) «sẽ kích hoạt một phần thao tác infinite scroll,» và “we might have two or three of these pages loaded on one page with infinite scroll, but not everything.” (bản dịch) «chúng tôi có thể tải hai hoặc ba trang trên cùng một trang bằng infinite scroll, nhưng không phải mọi thứ.» (Đó office-hours quote là relayed qua Search Engine Journal’s ghi-lên, không confirmed so với đó chính recording.)

Hai consequences fall out của điều này:

  1. có không có bảo đảm của Cách nhiều nhận pulled trong. có thể là không có gì extra, có thể là hai hoặc three các trang, không bao giờ reliably mọi thứ. Infinite scroll alone không phải dependable way để nhận deep nội dung được lập chỉ mục.
  2. “Không được lập chỉ mục” có thể là misdiagnosis. bị thiếu trang có thể không là bị thiếu tại all — nó có thể là được lập chỉ mục as part của trước đó URL. đó cần khác khắc phục hơn thông thường lập chỉ mục bug.

Cách chẩn đoán nó

Dùng Search Console’s URL Inspection Tool và đọc đó được kết xuất HTML, không đó thô nguồn. Google tài liệu là rõ ràng: “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.” (bản dịch) «Bạn có thể dùng đó URL Inspection Tool trong Search Console để see nếu all nội dung đã là loaded. Kiểm tra đó được kết xuất HTML để hãy bảo đảm nội dung của bạn là trong đó được kết xuất HTML by looking cho điều này trong URL Inspection Tool.» Tìm kiếm đó được kết xuất HTML cho nội dung bạn expect để là on trang 1 chỉ. Nếu bạn tìm nội dung từ trang 2 (hoặc đó tiếp theo bài viết) sitting bên trong trang 1’s render, bạn đã reproduced đó hợp nhất bug.

Bạn có thể cũng replicate tall viewport locally: open Chrome DevTools, đặt rất tall custom viewport (Mueller suggestion là ~9000px), và load trang để see liệu của bạn loader fires với không scrolling.

khắc phục: paginated các URL + History API

Đó durable cách sửa là architectural, straight từ Google hiện tại lazy-loading doc. Để làm infinite scroll indexable, “make sure your website supports paginated loading of these chunks” (bản dịch) «hãy bảo đảm của bạn website hỗ trợ paginated loading of những chunks»:

  • “Give each chunk its own persistent, unique URL.” (bản dịch) «Cho mỗi chunk của nó own persistent, unique URL.»
  • “Ensure that the content shown on each URL remains the same every time it’s loaded in a browser” (bản dịch) «Bảo đảm đó nội dung shown on mỗi URL vẫn đó giống nhau mỗi khi đây là loaded trong một trình duyệt» — Google suggests absolute trang numbers như ?page=12.
  • “Avoid using relative elements like ?date=yesterday in these URLs” (bản dịch) «Tránh dùng relative elements như ?date=yesterday trong những URLs» — an address đó trả về khác nhau nội dung mỗi load là unusable as một canonical.
  • “Link sequentially to the individual URLs so that search engines can discover the URLs in a paginated set” (bản dịch) «Link sequentially để đó riêng lẻ URLs so đó các công cụ tìm kiếm có thể discover đó URLs trong một paginated set» — real <a href> links, không nhấp handlers.
  • “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.” (bản dịch) «Khi một new trang chunk là loaded trong phản hồi để người dùng scrolling, và điều này becomes đó chính visible element cho người dùng, cập nhật đó displayed URL dùng đó History API.»

đó cuối cùng point là elegant part. history.pushState() / replaceState() swaps URL trong address bar as người dùng scrolls past mỗi boundary — so visible URL luôn matches chính nội dung, và người dùng có thể refresh, share, và link để chính xác nơi họ là. Meanwhile crawlable ?page=N các URL exist independently, so Google có thể reach mỗi chunk trực tiếp liệu hoặc không renderer bao giờ triggers scroll.

Hai implementation notes đó quan trọng:

  • Dùng IntersectionObserver (hoặc native trình duyệt lazy-loading), không một thô scroll listener. Điều này thực hiện far tốt hơn (không scroll-thrash) và đây là đó “load when visible” (bản dịch) «load khi visible» mechanism Google endorses cho deferred nội dung.
  • Giữ đó paginated set discoverable independently of đó JS. Real anchors trong đó DOM, và/hoặc đó ?page=N URLs listed trong của bạn XML sitemap. Whatever đó renderer captures, đó sitemap-và-links layer là của bạn backstop.

nếu trực tiếp trang web là đã exhibiting hợp nhất bug và bạn cần dừng bleeding trước khi bạn có thể rebuild, my blunt emergency khắc phục là để block JavaScript file đó triggers infinite scroll trong robots.txt so nó physically có thể’t fire during kết xuất — buying time để ship proper paginated-URL architecture.

History API point trên covers half contract — updating address bar as chunk becomes chính. khác half là đang làm sure mỗi entry path lại vào đó URL thực ra reconstructs right nội dung, không chỉ right scroll position:

  • sử dụng pushState() Khi chunk becomes chính visible nội dung cho đầu tiên time — đó thực navigation step, và nó Điều gì làm lại button có ý nghĩa.
  • sử dụng replaceState() cho corrections đó không nên tạo của họ own lại-button dừng, như syncing URL sau khi fast scroll past several chunks tại sau khi.
  • Listen cho popstate và re-render (hoặc re-fetch) chunk đó matches URL trong event. trình duyệt default lại/forward behavior restores scroll position, không dynamic list state của bạn JavaScript được xây dựng — nếu người dùng hits lại sau khi của bạn loader appended 40 nhiều hơn items, bạn cần reconstruct mà items belong on đó trang, không chỉ scroll them ở đó.
  • không lean on tự động scroll restoration alone để solve điều này. nó controls nơi viewport lands, không Điều gì nội dung là present — nếu underlying list có thể thay đổi giữa visits (new các sản phẩm đã thêm, items out của stock), scroll position không có nội dung reconstruction có thể strand người dùng trong sai context.

Đây là giống nhau discipline paginated-URL khắc phục đã phụ thuộc vào: chunk URL có để trả về nội dung nó promised on fresh load, refresh, và Tìm kiếm-Console trực tiếp kiểm thử — không chỉ đầu tiên time nó fetched mid-scroll.

Loading, lỗi, và end-của-kết quả trạng thái

production implementation cần nhiều hơn trạng thái hơn “loading” và “loaded”:

  • Ban đầu load — đầu tiên chunk nên đã là trong thô HTML máy chủ gửi, không assembled hoàn toàn by JS sau khi fact.
  • tiếp theo-chunk loading — visible trong-progress indicator so người dùng (và anyone kiểm thử với assistive tech) know fetch là underway.
  • rỗng — distinct state cho zero kết quả, không blank space đó looks hỏng.
  • lỗi / retry — thất bại fetch không nên silently strand trang với không way để try again, và retry không nên duplicate hoặc reorder items đã on trang.
  • End của kết quả — clear tín hiệu, không infinite spinner, sau khi có không có gì left để load.

None của Đây là Google-cụ thể, nhưng nó giống nhau reliability paginated-URL khắc phục phụ thuộc vào: nếu loader có thể silently break mid-fetch, Bạn có thể’t trust đó bất kỳ được cho crawl hoặc người dùng session thực ra captured chunk nó nên có.

Accessibility và performance: hai điều infinite scroll không cho bạn cho free

Infinite scroll có không inherent Core Web Vitals outcome, good hoặc bad — nó determined hoàn toàn by Cách bạn xây dựng nó. mỗi appended chunk grows DOM, và lớn đủ DOM raises layout và style-recalculation cost, so watch append cost, image loading, layout shift từ nội dung không có reserved space, và dài tasks as list grows. On rất dài các trang, cân nhắc virtualizing chunks đó có scrolled far out của view (removing của họ DOM nodes) thay vì letting DOM grow unbounded.

Accessibility cần của nó own deliberate design, không an assumption đó “it renders, so it’s fine” (bản dịch) «điều này renders, so đây là fine»:

  • Keyboard người dùng cần để là able để reach new nội dung — và footer hoặc end-của-trang navigation — không có trang silently growing out từ dưới của họ tab order.
  • Screen reader người dùng cần new nội dung announced không có interrupting Điều gì họ’re đang làm — polite status region, không disruptive alert, là thông thường pattern.
  • WAI-ARIA feed design pattern là được xây dựng cho chính xác điều này case: bài viết-cấp độ regions bên trong feed container, với được định nghĩa keyboard behavior cho moving giữa items và cho reaching nội dung trước khi và sau khi feed.
  • Focus không nên silently jump hoặc nhận lost Khi new chunk loads.

None của Đây là tùy chọn cleanup. nó khác biệt giữa infinite scroll đó hoạt động cho mọi người và một đó chỉ hoạt động cho mouse người dùng với JavaScript ai không bao giờ strays từ happy path.

lịch sử context: rel=tiếp theo/prev là legacy

Nếu bạn learned pagination năm ago, bạn learned rel="next" / rel="prev". Google introduced them trong 2011 và paired them với của nó original 2014 “infinite scroll search-friendly recommendations” (bản dịch) «infinite scroll tìm kiếm-friendly các khuyến nghị» (paginate đó nội dung, cung cấp component các trang). Thì trong 2019 Google announced điều này hadn’t đã dùng những tags cho năm và formally dropped them. Đó pagination doc xác nhận điều này hôm nay: “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.” (bản dịch) «Trong đó past, Google dùng <link rel="next" href="..."><link rel="prev" href="..."> để identify tiếp theo trang và trước đó trang relationships. Google không lâu hơn dùng những tags, although những links có thể vẫn là dùng by other các công cụ tìm kiếm.»

So đó hiện tại Google recipe là unique URLs + crawlable links + đó History API — không rel=next/rel=prev bắt buộc. Nhưng “other search engines” (bản dịch) «other các công cụ tìm kiếm» bao gồm Bing, mà vẫn respects them, so có không harm trong giữ them trong của bạn markup cho cross-engine benefit và accessibility. Bing itself không publish infinite-scroll-cụ thể hướng dẫn; của nó stance reduces để đó chung JS-kết xuất caution của nó team laid out — bingbot có thể render JavaScript nhưng “it is difficult for bingbot to process JavaScript at scale,” (bản dịch) «điều này là difficult cho bingbot để xử lý JavaScript tại quy mô,» so một crawlable paginated fallback helps Bing cho chính xác đó giống nhau reason điều này helps Google.

Ecommerce category các trang: highest-stakes case

phần lớn phổ biến thực-world infinite scroll là on ecommerce category / sản phẩm listing các trang (PLPs), và nó nơi risk costs thực tế money. nếu deep-catalog các sản phẩm past đầu tiên screenful không bao giờ nhận được lập chỉ mục, họ có thể’t xếp hạng, và bạn lose dài tail của sản phẩm-cấp độ lưu lượng tự nhiên. Đây là giống nhau territory covered trong depth trong category-trang material — infinite scroll là một nhiều hơn reason những điều đó các trang cần crawlable structure underneath UX.

Hai backstops quan trọng ở đây:

  • XML sitemaps listing mỗi canonical sản phẩm và paginated category URL, so phát hiện không phụ thuộc on renderer.
  • ** Merchant Center sản phẩm feed**, mà feeds Google sản phẩm dữ liệu independently của whatever category trang renderer captures.

Lumar analysis of top UK fashion retailers được tìm thấy infinite scroll để là, trong của họ words, “the biggest loser when it comes to indexability and SEO friendliness” (bản dịch) «đó biggest loser khi điều này xuất hiện để indexability và SEO friendliness» among đó pagination patterns — một hữu ích reminder đó này không một theoretical trường hợp biên, đây là đó default chế độ lỗi of một very popular PLP UX. (Lumar cụ thể percentage figures nên là đọc từ của họ trực tiếp báo cáo trước citing an chính xác number.)

Infinite scroll so với. pagination so với. load nhiều hơn

Google pagination doc frames three UX patterns và là honest về đó tradeoffs. Infinite scroll “uses a single page for all content” (bản dịch) «dùng một single trang cho all nội dung» và là “intuitive — the user just keeps scrolling,” (bản dịch) «intuitive — người dùng chỉ giữ scrolling,» nhưng điều này “can lead to ‘scrolling fatigue’ because of unclear result size” (bản dịch) «có thể lead để ‘scrolling fatigue’ làm unclear kết quả size» và “can’t handle very large numbers of results.” (bản dịch) «không thể xử lý very lớn numbers of kết quả.» Classic numbered pagination là đó hầu hết robust cho SEO vì mỗi trang là inherently một real URL. “Load hơn” sits trong giữa — fine nếu đó button là (hoặc wraps) một real link để một paginated URL, useless cho SEO nếu đây là một pure nhấp handler.

Đó decision không “which is allowed” (bản dịch) «mà là được phép» — all three là được phép. đây là “which UX do you want, and did you build the crawlable URL layer underneath it.” (bản dịch) «mà UX làm bạn muốn, và đã làm bạn xây dựng đó crawlable URL layer underneath điều này.» Mueller 2023 summary là đó toàn bộ điều trong một line: “if each piece or virtual page is also accessible and findable through a unique URL, generally it should be fine to have infinite scroll.” (bản dịch) «nếu mỗi piece hoặc virtual trang là cũng accessible và findable qua một unique URL, generally điều này nên là fine để có infinite scroll.»

Add an expert note

Pin an expert quote

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