消解炼金术

07_hugo分页函数与摘要显示设置

小岛建设

.Paginate 是 Hugo 内置的分页函数,可以将大量内容分成多页显示,避免单页面加载太多文章。

{{ range .Paginator.Pages }}
  <h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
  <p>{{ .Summary }}</p>
{{ end }}

按section主题分页,再添加摘录与展开缩放功能,实现逻辑大概如下:

{{ $articles := .RegularPagesRecursive.ByDate.Reverse }}
{{ $paginatedArticles := .Paginate $articles 10 }}
    {{ range $index, $article := $paginatedArticles.Pages }}
    <article class="article-card">
        {{/* 文章标题 */}}
        <h2><a>{{ .Title }}</a></h2>
        <input type="checkbox" id="expand-{{ $index }}" class="expand-checkbox">
        {{/* 文章详情(摘录) */}}
        <label for="expand-{{ $index }}" class="recent-abstract">
            {{ $article.Content }} // 点击文章内容可展开/折叠
        </label>
    </article>
    {{ end }}

其中摘要class的css关键在于如下:

.recent-abstract {
    display: -webkit-box;
    -webkit-line-clamp: 7;
    /* 显示7行 */
    -webkit-box-orient: vertical;
}

但当内容中有特殊格式时,比如:code/pre,摘要行数可能会被上下撑开,显示不止指定行数。处理摘要中code/pre的代码块时,可以采用css限制去修改它的具体样式:

.recent-abstract pre,
.recent-abstract code {
    display: -webkit-box;
    /* -webkit-line-clamp: 2; */
    -webkit-box-orient: vertical;
    overflow-y: auto;
    max-height: 33px;
}

展开摘要栏时,也要还原css展开样式:

.expand-checkbox:checked~.recent-abstract pre,
.expand-checkbox:checked~.recent-abstract code {
    -webkit-line-clamp: unset;
    max-height: 100%;
}

有inline-block的特殊样式时,也会改变-webkit-的截断逻辑,可以在摘要样式内修改display:

.recent-abstract .special-type {
    display: inline;
}

也可以靠hugo的内置语法把内容转化成纯文本再截断,但会导致特殊格式丢失:

{{ $article.Plain | truncate 500 }}

但实际情况还是会触发一个奇怪的bug,有时pre/code代码块会被无视,不计入行数的运算,于是又会导致文章摘要卡片变长,于是添加了一个额外的预防措施,先定义摘要板块的最大高度,再在展开后取消最大高度:

<!-- 定义最大高度 -->
.recent-abstract {
    max-height: 300px;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 7;
    /* 显示7行 */
    -webkit-box-orient: vertical;
}

<!-- 点击后移除限制 -->
.expand-checkbox:checked~.recent-abstract {
    max-height: none;
    /* overflow: visible; */
    -webkit-line-clamp: unset;
    /* 移除行数限制 */
    /* 保留其他所有样式不变 */
}
© 2026 消解炼金术 | 
Powered by Hugo and Cloudflare