分页
对于许多网站(尤其是博客),将文章的主要列表分成更小的列表并在多页上显示非常常见。Jekyll 提供分页插件,以便您可以自动生成分页列表所需的适当文件和文件夹。
对于 Jekyll 3 或更高版本,在 Gemfile 和 _config.yml
中的 plugins
下包含 jekyll-paginate
插件。对于 Jekyll 2,这是标准配置。
分页仅在 HTML 文件中有效
分页无法在 Jekyll 网站的 Markdown 文件中使用。分页在从名为 index.html
的 HTML 文件中调用时有效,该文件可以选择驻留在子目录中并通过 paginate_path
配置值从中生成分页。
启用分页
要为博客上的文章启用分页,请向 _config.yml
文件添加一行,指定每页应显示多少项
paginate: 5
该数字应为要在生成网站中每页显示的最大文章数。
您还可以指定分页页面的目标
paginate_path: "/blog/page:num/"
这将读取 blog/index.html
,将其作为 paginator
在 Liquid 中发送到每个分页页面,并将输出写入 blog/page:num/
,其中 :num
是分页页码,从 2
开始。
如果一个站点有 12 篇帖子并指定 paginate: 5
,Jekyll 将写入 blog/index.html
,其中包含前 5 篇帖子,blog/page2/index.html
,其中包含接下来的 5 篇帖子,以及 blog/page3/index.html
,其中包含最后 2 篇帖子,并将其写入目标目录。
不要设置永久链接
在博客页面的前端设置永久链接将导致分页中断。只需省略永久链接即可。
类别、标签和集合的分页
较新的 jekyll-paginate-v2 插件支持更多功能。请参阅存储库中的 分页示例。GitHub Pages 不支持此插件。
可用的 Liquid 属性
分页插件公开了 paginator
liquid 对象,其中包含以下属性
变量 | 说明 |
---|---|
|
当前页面的页码 |
|
每页的帖子数 |
|
当前页面的可用帖子 |
|
帖子的总数 |
|
页面的总数 |
|
上一页的页码,如果不存在上一页,则为 |
|
上一页的路径,如果不存在上一页,则为 |
|
下一页的页码,如果不存在下一页,则为 |
|
下一页的路径,如果不存在下一页,则为 |
分页不支持标签或类别
分页页面会遍历 posts
变量中的每篇帖子,除非帖子的前端设置中包含 hidden: true
。它目前不允许对通过共同的标签或类别链接的帖子组进行分页。它不能包含任何文档集合,因为它仅限于帖子。
渲染分页帖子
接下来你需要做的是使用现在可以使用的 paginator
变量将你的帖子显示在列表中。你可能希望在网站的一个主页面中执行此操作。下面是一个在 HTML 文件中呈现分页帖子的简单方法示例
---
layout: default
title: My Blog
---
<!-- This loops through the paginated posts -->
{% for post in paginator.posts %}
<h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
<p class="author">
<span class="date">{{ post.date }}</span>
</p>
<div class="content">
{{ post.content }}
</div>
{% endfor %}
<!-- Pagination links -->
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path }}" class="previous">
Previous
</a>
{% else %}
<span class="previous">Previous</span>
{% endif %}
<span class="page_number ">
Page: {{ paginator.page }} of {{ paginator.total_pages }}
</span>
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path }}" class="next">Next</a>
{% else %}
<span class="next ">Next</span>
{% endif %}
</div>
注意第一页的特殊情况
Jekyll 不会生成“page1”文件夹,因此当生成 /page1
链接时,上面的代码将不起作用。如果这对你来说是个问题,请参阅下面的解决方法。
以下 HTML 代码段应处理第一页,并呈现每页的列表,其中包含指向除当前页之外所有页面的链接。
{% if paginator.total_pages > 1 %}
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path | relative_url }}">« Prev</a>
{% else %}
<span>« Prev</span>
{% endif %}
{% for page in (1..paginator.total_pages) %}
{% if page == paginator.page %}
<em>{{ page }}</em>
{% elsif page == 1 %}
<a href="{{ '/' | relative_url }}">{{ page }}</a>
{% else %}
<a href="{{ site.paginate_path | relative_url | replace: ':num', page }}">{{ page }}</a>
{% endif %}
{% endfor %}
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path | relative_url }}">Next »</a>
{% else %}
<span>Next »</span>
{% endif %}
</div>
{% endif %}