最可靠的方式是使用@media print中的@page规则配合@bottom-right等页边距盒,而非::after+counter(page);因后者在现代浏览器打印中基本不生效,而@page专为分页设计,语义明确、兼容性好。

直接用 @page + @bottom-right 是最可靠的方式
浏览器对 ::after + counter(page) 在打印页脚中生效的支持极差——它只在部分旧方案(如 Firefox 早期版本)中偶然起作用,现代 Chrome、Edge、Safari 基本不渲染。真正被广泛支持的路径是 @page 规则配合页面边距盒(Page Margin Boxes),比如 @bottom-right 或 @bottom-center。
原因很简单:::after 是作用于 DOM 元素的伪元素,而打印分页时浏览器会把内容重排进固定尺寸的“页面盒”,此时 DOM 结构和视觉流已脱离原始布局,::after 无法绑定到每一页的物理页脚位置。
-
@page是专为分页媒体设计的 CSS 模块,语义明确、行为可预期 -
counter(page)只能在@page内部的 margin box 中作为content值使用,不能在普通选择器里“手动递增” - 试图用
#pageFooter::after { counter-increment: page; content: counter(page); }的写法,只会让页码出现在第一页底部,后续页不显示
@page 中 @bottom-center 和 @bottom-right 的行为差异
这两个 margin box 的定位逻辑不同:前者居中对齐整个页脚区域(不受左右页影响),后者严格锚定在物理页面右下角。如果你启用了双面打印(@page:left/@page:right),@bottom-right 在左页上其实会落在页面右侧——也就是装订侧的反方向,容易造成阅读错位。
更稳妥的做法是按页面类型分别定义:
- 首页(
@page:first)通常隐藏页码:@bottom-right { content: none; } - 左页(
@page:left)用@bottom-left放页码 - 右页(
@page:right)用@bottom-right放页码 - 所有页统一用
@bottom-center最省事,也最不容易出错
注意:@bottom-center 不等于 “文本水平居中”,而是指 margin box 自身在页脚区域水平居中,其内部 content 默认左对齐,如需居中显示数字,得加 text-align: center ——但该属性在 margin box 中仅部分浏览器支持,推荐用 margin-left: auto; margin-right: auto; 替代。
显示“第X页”可以,但“共Y页”基本不可靠
CSS 标准曾定义过 counter(pages),但截至 2026 年,Chrome、Edge、Firefox 均未实现该计数器。你写 content: "第" counter(page) "页/共" counter(pages) "页",后半段会直接空白或报解析错误。
目前能稳定输出的只有当前页码。如果业务强依赖总页数,必须换思路:
- 服务端生成 PDF 时注入总页数(如用 Puppeteer、WeasyPrint、Prince)
- 前端用 JavaScript 预估分页高度,再通过
window.print()后回调补全(但无法在打印预览中实时更新) - 放弃纯 CSS 方案,在导出前调用浏览器打印 API 获取实际页数(仅 Chromium 支持
beforeprint+afterprint,且无总页数字段)
别在 @page 里尝试 @counter-style 或自定义计数器——它对 page 计数器无效,page 是 UA 控制的只读计数器,不能被 reset 或 increment。
实际可用的最小可行代码片段
以下代码在 Chrome 128+、Edge 128+、Firefox 125+ 中均能稳定显示右下角页码:
@media print {
@page {
margin: 1.5cm;
@bottom-right {
content: "第" counter(page) "页";
font-size: 10pt;
font-family: "SimSun", serif;
}
}
}
关键点:
- 必须包裹在
@media print中,否则可能干扰屏幕样式 -
@page规则不能写在嵌套选择器内(如.print-wrapper @page是非法语法) - 不要设
!important——margin box 的样式优先级天然高于普通 CSS - 如果页脚文字被截断,优先调大
@page { margin },而不是强行用transform或负margin
最后提醒一句:所有基于 @page 的设置,在浏览器「打印预览」里才能看到效果,开发者工具的「打印模式」模拟很弱,务必真机打印测试。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











