虽然目前不可能,但您仍然可以使用一个很棒的解决方法。
打印时,每页仅自动复制三种元素:
我们必须使用其中一个来构建纯 CSS 解决方案:我们将选择标头。所以,问题的第一部分是:如何为每个页面设置不同的标题?或者,换句话说,如何设置章节标题?
实现这个目标非常简单:一旦决定了哪个标签或类应该包含章节的标题,就为其设置一个新的CSS 字符串:
h1 {
string-set: doctitle content();
}
然后在标题中显示字符串:
@page {
size: A4;
margin: 1.6cm .6cm 1.2cm .6cm;
@top-center {
content: string(doctitle);
}
}
现在你会有这样的东西:
让我添加一些代码到您的:
<html>
<body>
<h1>First section</h1>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p style="break-after: always;"></p>
<p>Lorem ipsum...</p>
<h1>Second section</h1>
<p>Lorem ipsum 2...</p>
<p>Lorem ipsum 2...</p>
<p>Lorem ipsum 2...</p>
<p>Lorem ipsum 2...</p>
<p style="break-after: always;"></p>
<p>Lorem ipsum 2...</p>
</body>
</html>
在这种情况下,您的标题将是:
- 第 1 页:“第一部分”
- 第二页:“第一部分”……然后将在同一页开始第二部分,用他自己的标题
- 第三页:“第二部分”
下一步:为标题和章节标题设置相同的样式,以便标题可以与标题具有相同的外观:
h1 {
string-set: doctitle content();
font-family: 'Liberation Serif';
font-size: 28pt;
line-height: 1.2em;
}
@page {
size: A4;
margin: 1.6cm .6cm 1.2cm .6cm;
@top-left {
content: string(doctitle);
font-family: 'Liberation Serif';
font-size: 28pt;
line-height: 1.2em;
}
}
然后你会有这样的东西:
现在,我们需要修复最新的问题:第一页中的标题看起来像重复的,因为标题和标题都存在。
修复它非常简单:
body h1:first-of-type {
position: absolute;
left: -30cm;
}
我已将第一个标题放置在打印区域之外。不幸的是,将其设置为display: none
将导致甚至不会显示标题。您还有其他选择,例如visibility: hidden
orfont-size: 0
或color: transparent
,但这三个选项将始终在标题和第一段之间留出一些空白。
现在可能是时候增加标题的高度了,将顶部填充添加到@top-left;结果应如下所示:
这种技术不是 100% 安全的:如果不是第一个章节的章节巧合地从新页面开始,标题和标题都会显示,一个靠近另一个。无论如何,这不是常见的情况。
进一步的改进可以考虑使用不同的分页方法。
<html>
<body>
<section class="chapter">
<h1>First section</h1>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<p>Lorem ipsum...</p>
<h1>Second section</h1>
<p>Lorem ipsum 2...</p>
<p>Lorem ipsum 2...</p>
<p>Lorem ipsum 2...</p>
</section>
<section class="chapter">
<h1>Third section</h1>
<p>Lorem ipsum 3...</p>
<p>Lorem ipsum 3...</p>
<p>Lorem ipsum 3...</p>
<p>Lorem ipsum 3...</p>
</section>
</body>
</html>
为章节设置分页符样式,并为任何章节的第一个子项管理标题隐藏:
section.chapter {
break-after: always;
}
section.chapter h1:first-of-type {
position: absolute;
left: -30cm;
}