如果您使用 HTML 5<article>
和<header>
,这里有一个似乎适用于 Webkit、Blink 和 Gecko 的 hack(调整值8rem
以满足您的需求):
article > header::before
{
content: "";
display: block;
height: 8rem; /* pretend that the header is at least 8rem high so this header cannot fit near the end of page */
margin-bottom: -8rem; /* however, reduce the margin the same amount so that the following content can stay in its usual place */
page-break-inside: avoid;
break-inside: avoid;
}
这是因为伪元素是从标题顶部::before
向下呈现的,并且浏览器确实支持得足够好,可以实际保留页面末尾的空间。它还利用浏览器在实际测量所需空间时考虑无边距的事实。我不知道这是在任何规范中指定的,还是恰好与现实世界的浏览器行为相匹配。page-break-inside: avoid;
height
其他一些答案建议使用::after
,但根据我的经验,这可能会导致容器元素<article>
开始在前一页上呈现的情况。使用::before
似乎效果更好,并且容器元素的开始似乎也在移动。显然,如果您的包含元素没有可见边缘,则差异并不重要。
请注意,因为您只有一个伪元素::before
,如果您想为::before
. 此 hack 要求::before
在其他内容下呈现但透明,因此它不能包含可见内容。
需要考虑的其他事项:
page-break
nor在表 ( ) 中page-break-inside
不起作用,也不是。尚不清楚这是由部分浏览器实现还是由于 CSS 规范实际需要这样做造成的。在实践中,您需要使用所有父元素,否则分页符会在任何地方发生。display:table
display:grid
display:flex
display:block
<html>
- 您不能将保留空间限制为完整容器元素的高度。例如,如果
<article>
上例中的整体小于8rem
高,则元素仍会跳到下一页,因为这种 hack8rem
会在尝试适应<article>
页面之前盲目地保留空间。
break-after:avoid
然而,在实践中,这比page-break-after:avoid
现实世界的浏览器支持更好。此外,对widows
and的支持orphans
真的很差,所以你可能也想对<p>
element 应用类似的 hack。我会建议2rem
或3rem
为那些空间。