Pagination:分页、加载更多与无限滚动
Pagination 把一个长集合拆成多段浏览,常见方式有三种:分页(页码加上一页、下一页)、Load more(按钮追加下一段)和无限滚动(滚到底部自动追加)。它处理的是同一集合在纵向上的分段;在固定区域内横向切换项目属于 Carousel。
适合与不适合
适合集合页、搜索结果、评价列表、订单历史这类项目多、需要逐段浏览的长集合。项目不多时一页显示更简单;步骤有先后依赖的流程用 Timeline 或表单步骤,而不是翻页。
三种方式怎么选
| 方式 | 适合 | 主要代价 |
|---|---|---|
| 分页 | 目标明确、需要比较或回到某一页;需要可分享、可抓取的位置 | 换页打断,需要点击 |
| Load more | 顺序浏览、希望保留列表上下文,同时让用户控制何时加载 | 已加载项累积后位置难恢复,需为每段设置可寻址 URL |
| 无限滚动 | 内容流式消费、没有明确终点 | 页脚难以到达,返回后位置易丢,屏幕阅读器与键盘用户难以定位 |
集合页与搜索结果通常需要比较、返回与分享,以分页或“Load more 加真实链接”为稳妥起点;无限滚动只在内容确为流式时使用。以上是编辑建议,不是官方规定。
与相邻模式的区别
| 对照 | 判据 |
|---|---|
| Carousel | Carousel 在有限空间里切换少量项目;Pagination 对长集合分段,项目仍按 Grid 或 List 排列 |
| Tabs | Tabs 切换并列的互斥视图;页码切换的是同一视图的不同区段 |
| Navigation Menu | 二者都用导航地标,但菜单指向不同栏目,分页指向同一集合的其他区段 |
优点与缺点
| 优点 | 缺点 |
|---|---|
| 分段加载降低首屏数据与渲染量 | 分段让比较跨越页面,筛选与排序变化后需重置 |
| 分页天然对应可分享的链接 | 页码控件在小屏占位,触摸目标需足够大 |
| Load more 让用户控制节奏 | 追加后焦点与阅读位置易错乱 |
内容与交互要求
- 分页:显示当前页与总页数或结果总量;上一页、下一页是真实链接。换页后把视线与焦点带回结果区顶部,并让页面标题或状态反映“第 N 页”。
- Load more:按钮说明会加载多少、已显示多少,例如“再显示 24 项,已显示 24 / 96”。加载后保持焦点仍在可操作位置,并用状态文本通知新增数量。
- 无限滚动:页脚必须仍可到达,通常需要终点或“Load more”兜底;每一段有稳定地址。
- 返回与恢复:从商品详情返回时,应回到离开的位置和已加载的项数,而不是回到第一段。
- 筛选与排序变化:重置到第一段,并让状态可见。
响应式与无障碍
- 导航地标:页码控件放入带名称的
nav(WAI 页面区域教程:一个页面可有任意数量导航区域,用标签区分);当前页链接设置aria-current="page",MDN 明确以分页链接为例,且同组只标一个。 - 状态通知:WCAG 2.2 的 4.1.3 Status Messages(AA)要求状态消息不获得焦点也能被辅助技术得知,理解文档以“18 results returned”为例;“已加载 24 项”应通过状态区域播报,不要移动焦点去朗读。
- 目标尺寸:2.5.8 Target Size (Minimum)(AA)要求指针目标至少 24×24 CSS 像素,另有间距等例外;页码之间要留出间距。
- 不可用状态:首页的“上一页”要么移除,要么明确不可用,不能只靠颜色区分。
- 触发方式:无限滚动的自动触发不得成为唯一路径。MDN 说明 Intersection Observer 可用于无限滚动,且不阻塞主线程;它只是检测手段,不替代按钮与链接。
SEO 与可抓取链接
Google 的分页页把三种方式并列,并写明:其爬虫不会点击按钮,通常也不会触发需要用户动作才更新页面内容的 JavaScript,因此 Load more 与无限滚动需要额外处理。页面同时写明:
- Google 通常抓取
<a>元素href中的 URL,每页应含指向下一页的<a href>,并可考虑从各页链回第一页(页面称这可提示第一页是更合适的落地页); - 每页使用唯一 URL,各页拥有自己的 canonical,不要以第一页作为所有页的 canonical;
- 页码不要用 URL 片段标识符(
#之后); - 带筛选或不同排序的变体,使用
noindex或 robots.txt 避免重复索引; - Google 已不使用
<link rel="next">与<link rel="prev">,其他搜索引擎可能仍使用; - 页面还建议用 preload、preconnect 或 prefetch 优化用户翻到下一页的性能(该页更新于 2025-12-10)。
Google 懒加载页对无限滚动另写:每一段有独立且持久的 URL,同一 URL 每次加载内容一致,并按顺序链接各段 URL;其示例方法不依赖滚动或点击,因为 Google Search 不与页面交互。以上均为页面所写,核验于 2026-09-29,不构成对索引或排名的保证。
状态与退化
零项:空状态并提供清除筛选;只有一页:隐藏分页控件;越界页码:回到最后一页或返回明确的空状态;加载中:按钮显示进行状态并阻止重复点击;加载失败:保留已加载项并提供重试。无 JavaScript:分页本就是普通链接;Load more 应以指向下一页的真实链接为基础,脚本只负责追加。减少动态效果:不做滚动动画与自动滚动定位。
常承载的内容与模块
集合页的商品(Featured Products、Product Categories)与评价列表(Customer Reviews)最常用;集合浏览与筛选的整体契约由集合浏览模块另文说明。
集合页的完整浏览、筛选、排序与翻页契约见集合浏览与筛选模块;搜索结果的翻页见站内搜索模块。
平台落点(Shopify,核验于 2026-09-29)
paginate标签页写明:可对collection.products、blog.articles、search.results、customer.orders、product.variants等分页,可分页至数组第 25,000 项为止;可用paginate对象或default_pagination过滤器生成页码导航。paginate对象页写明:page_size最大 250,page_param默认为page,另有next、previous、parts等属性。- 标签页未提及无限滚动;是否支持及怎样支持须看具体主题。Horizon 4.2.0 中分页控制器的分工见集合与搜索,两个固定版本的筛选与分页实现见Dawn 筛选与分页、Horizon 筛选与分页。
发布前检查
- 每一段是否有可访问的唯一 URL,链接是否真实存在于 HTML?
- 从详情页返回、刷新、分享链接后,位置与已加载项是否恢复?
- 键盘与屏幕阅读器能否翻页、得知新增数量并到达页脚?
- 筛选或排序变化后是否重置且状态可见?
- 关闭 JavaScript 后能否翻到第二页?
待继续完善
- 用真实设备复测位置恢复与屏幕阅读器播报;
- 补充评价列表与搜索结果各自的分页取舍;