目录:
如下一段简单的 HTML 代码:
<style>
.box1 {
width: 100px;
height: 100px;
background: antiquewhite;
}
.box2 {
width: 200px;
height: 200px;
background: aquamarine;
}
</style>
<div class="box1">1</div>
<div class="box2">2</div>
在浏览器上打印网页,可以看到 box1 和 box2 都在同一页。
注意: 打印预览没有显示背景颜色,原因是浏览器默认隐藏了打印的背景颜色,在 More settings 中勾选 Background graphics 就可以看到背景颜色了(见下图红色箭头)。

通过添加 css 属性,在打印时可以自动分页。
给 .box1 添加 break-after: page;,含义是在 box1 后面添加分页;
给 .box2 添加 break-before: page;,含义是在 box2 前面添加分页;
使用其中任一方式都可以在打印时自动分页,如下示例在 box2 前面添加分页。
<style>
.box1 {
width: 100px;
height: 100px;
background: antiquewhite;
}
.box2 {
width: 200px;
height: 200px;
background: aquamarine;
break-before: page;
}
</style>
<div class="box1">1</div>
<div class="box2">2</div>
在浏览器上打印网页,可以看到 box2 自动换到下一页。

与 break-before 和 break-after 相关的还有一个属性叫做 break-inside,含义是元素内部尽可能的不分页,比如一些表格或者图片尽可能在同一个页面内显示。
如下代码: 将 box2 高度设置为 100vh,box2 高度刚好和页面高度一致。
<style>
.box1 {
width: 100px;
height: 100px;
background: antiquewhite;
}
.box2 {
width: 200px;
height: 100vh;
background: aquamarine;
}
</style>
<div class="box1">1</div>
<div class="box2">2</div>
第一页显示了 box1 后是不够空间放满 box2 的,因此 box2 有一部分会显示在第二页。

如下代码: 给 box2 添加 break-inside: avoid-page;,让 box2 尽可能的不分页。
<style>
.box1 {
width: 100px;
height: 100px;
background: antiquewhite;
}
.box2 {
width: 200px;
height: 100vh;
background: aquamarine;
break-inside: avoid-page;
}
</style>
<div class="box1">1</div>
<div class="box2">2</div>
可以看到 box2 直接全部都跑去第二页了,这样保证了整体的完整性,对于图片,表格等场景非常实用。

如下示例: box2 的高度设置为 120vh,超过了页面高度,即便设置了 break-inside: avoid-page; 也还是会分页。

日常开发可能还会看到 page-xxx 开头的打印属性,这些是比较旧的属性,功能和上面介绍的三个属性是一样的,日常开发尽量使用新的打印属性。
page-break-before: always;(旧), break-before: page;(新): 在元素前面添加分页;page-break-after: always;(旧), break-after: page;(新): 在元素后面添加分页;page-break-inside: avoid;(旧), break-inside: avoid-page;(新): 元素内部尽可能不分页;使用场景: 使用场景是长篇文档或报告的打印。通过适当提高 orphans 和 widows 的值(例如设为3或4),可以显著减少因分页导致的阅读中断感,使文档看起来更专业。
例如,在打印一份合同或论文时,你不希望一个重要的条款或一段论述的结论单独一行被留在上一页的页脚,也不希望新一页的开头只有一行标题或一句话,这时设置这两个属性就非常有用
定义了当一个块级容器(如段落)在页面、区域或列的底部被分页断开时,必须保留在前一页底部的最少文本行数,其默认值为 2。
例如,设置 orphans: 3; 意味着,如果一个段落即将在页面底部被切断,且切断后留在当前页的行数少于3行,那么浏览器会尝试将整个段落(或至少满足3行)移动到下一页开始,以避免出现“孤行”。
定义了当一个块级容器在页面、区域或列的顶部被分页断开时,必须出现在新一页顶部的最少文本行数。其默认值同样为 2。
设置 widows: 3; 可以确保,如果一个段落在新一页顶部开始,其起始行数至少有3行,避免出现单独一两行文本孤零零地位于页首的情况
可以控制打印的尺寸,横版还是竖版,页边距多少,格式如下:
@page [<页面选择器>] {
/* 页面属性声明 */
}
比如封面页是一张 A4 大小的横向图片,页边距为 0:
@page cover { size: A4 landscape; margin: 0; }
.cover-page { page: cover; } /* 通过 page 属性应用命名页面 */
其它页面展示内容,页边距设置为 20px:
@page content { size: A4 landscape; margin: 20px; }
.content-page { page: content; } /* 通过 page 属性应用命名页面 */
只有打印网页时才会执行下面的 css 样式。
@media print {}
在前面的示例中,我们直接将打印属性写在了 css 中,如下示例:
.box2 {
width: 200px;
height: 200px;
background: aquamarine;
break-before: page;
}
可以把打印属性都抽出来,单独写在一起,如下示例:
.box2 {
width: 200px;
height: 200px;
background: aquamarine;
}
@media print {
.box2 {
break-before: page;
}
}
还有一种使用场景: 比如网页包含导航栏,侧边栏,广告等等信息,打印时并不想要这些信息,就可以在 @media print 中添加样式将这些元素隐藏起来。
@media print {
.navbar, .sidebar, .ad-banner, .no-print {
display: none !important;
}
}
↶ 返回首页 ↶