最稳定分页方式是用 page-break-before: always 插在新页内容前;table 分页需拆分为多个带 thead 的独立表格,并用空 div 作分页占位符,且仅在 print 媒体中生效。
直接说结论:用 page-break-before: always 插在需要新开一页的元素前面,是最稳定、浏览器兼容性最好的方式;别对 <tr> 或 <td> 直接加分页属性,基本无效。
page-break-after 有时不生效常见错误是给最后一个表格或标题加 page-break-after: always,结果第二页内容还是挤在同一页底部。根本原因是:如果该元素后面没内容,或者它本身高度接近页面末尾,浏览器可能忽略这个指令——page-break-after 是“建议”,不是强制锚点。
position: absolute)、浮动(float)、flex 子项等脱离文档流的元素,会让 page-break-after 失效page-break-before: always 放在第二页内容的开头,语义清晰、触发确定表格是最容易出问题的场景:一个长 <table> 被截成两半,表头消失,数据错位。这不是 bug,是浏览器默认把整个表格当做一个不可分割块来处理分页逻辑的结果。
page-break-inside: avoid 对 <table> 本身有效,但对 <tr> 或 <td> 无效(规范明确不支持)<table>,每个带完整 <thead>,并在它们之间插入 <div style="page-break-before: always"></div>
@media print 中要额外写 table { break-inside: avoid; },现代写法比 page-break-inside 更稳妥<div> 强制分页比直接加样式更可靠与其纠结某个内容元素要不要加 page-break-before,不如在 HTML 结构里插一个干净的“分页占位符”:
立即学习“前端免费学习笔记(深入)”;
<!-- 第一页结尾 --><table>...</table><div style="page-break-before: always;"></div><!-- 第二页开始 --><img src="report-cover.png">
<div> 没内容、没边距、没背景,纯粹作为分页信号,不会影响布局display 类型(如 flex 或 grid)干扰,也不依赖兄弟元素是否“撑满”一页最易被忽略的一点:分页效果只在 @media print 下起作用,开发时用浏览器「打印预览」(Ctrl+P)看,别靠普通页面渲染判断。另外,如果用了 @page { margin: 2cm },记得同步检查内容区域是否因边距变小而意外溢出——分页失败,十次有八次是边距和内容高度算错了。