目前在 java 中,我正在生成具有适用 CSS 样式的 HTML 文档。
我已经验证我的文档是正确的,但是当我将它与命名页面结合使用时,
:first
伪选择器似乎不起作用。举个例子:
@page mainReport:first {
@top-center {
content: element(header);
vertical-align: bottom;
};
@bottom-center {
content: element(footer);
vertical-align: top;
};
}
我这样做的原因是我想使用特定命名页面上的第一页,CSS选择器是否支持分页媒体的此功能?如果没有,是否可以通过飞碟或某种 CSS 魔法来解决这个问题。
谢谢
像往常一样,我迟到了,但我自己现在正在努力使用 Flying Saucer 的确切功能(版本 9.1.22),所以我想我应该分享我在自己的探索中学到的东西。
首先,命名页面实际上是页面的特定类型,而不是特定页面。您可以拥有多个“特殊”类型页面,并多次使用每种类型。
其次,所有页面,无论其类型如何,都共享相同的页码和
page
计数器。因此,文档中实际上只有一页(即第一页)与 :first
伪类匹配。
因此,如果文档的第一页恰好是特殊类型(例如,
mainReport:first
),则会相应地设计样式。如果第一页不是任何特殊类型,它将接收 :first
页面的默认样式(或 :right
页面,如果没有 :first
的特殊样式)。
我在飞碟中注意到一件事,这让我有点头疼(而且我觉得这有点违反直觉)。而对于常规页面(即非“命名”页面),指定
:left
和 :right
样式就足够了(假设左页和右页页面的样式不同),我还必须在以下情况下定义 :first
样式:另外使用命名页面类型。
例如,要使用罗马数字对目录进行编号,我最终得到了这样的结果:
@page :left
{
margin-left: 0.6in;
margin-right: 0.9in;
@left-bottom {content: counter(page);}
}
@page :right
{
margin-left: 0.9in;
margin-right: 0.6in;
@right-bottom {content: counter(page);}
}
@page toc:first
{
margin-left: 0.9in;
margin-right: 0.6in;
@right-bottom {content: counter(page, lower-roman);}
}
@page toc:right
{
margin-left: 0.9in;
margin-right: 0.6in;
@right-bottom {content: counter(page, lower-roman);}
}
@page toc:left
{
margin-left: 0.6in;
margin-right: 0.9in;
@left-bottom {content: counter(page, lower-roman);}
}
如果我省略
@page toc:first
部分,飞碟将在目录的第一页上应用常规页码(但目录的后续页面将正确地具有罗马数字页码)。