CSS打印:避免在页面之间插入一半的DIV?


199

我正在为一款软件编写插件,该插件需要大量项目并将其弹出到Cocoa中的WebView中的HTML中(该WebView使用WebKit作为其渲染器,因此基本上您可以假定正在以下位置打开该HTML文件)苹果浏览器)。

它制作的DIV具有动态高度,但变化不大。它们通常在200像素左右。无论如何,每个文档中有大约六百个这样的项目,所以我很难过要打印它。除非我很幸运,否则每页底部和顶部都有一个条目被切成两半,这使得使用打印输出变得非常困难。

我尝试过分页之前,分页之后,分页内部以及这三者的组合均无济于事。我认为可能是WebKit无法正确呈现指令,或者可能是我对如何使用它们缺乏了解。无论如何,我需要帮助。打印时如何防止DIV切入一半?


提供有关您遇到的问题的样本文档,也许我们可以为您提供帮助!
X-Istence 09年

我在这里回答了一个非常类似的问题,即避免将div减半:stackoverflow.com/a/14348953/1026459
Travis J

1
注意:此属性不能用于绝对定位的元素(显然也可以用于内联块)。
Ujjwal Singh '18

Answers:


335

这应该工作:

@media print  
{
    div{
        page-break-inside: avoid;
    }
}

请注意当前的浏览器支持(2014年12月3日)

  • 铬-1.0+
  • Firefox(壁虎)-19.0+
  • Internet Explorer-8.0+
  • 歌剧-7.0+
  • Safari-1.3+(312)

7
应该工作。但事实并非如此。有关浏览器支持,请参见en.wikipedia.org/wiki/…
格雷格2012年

1
作品在Safari 6 :) 这是在开发者预览版现在
莱纳斯Unnebäck

1
适用于Chrome V 27.0.1453.116
T. Brian Jones

4
也可以在Netscape中使用。谢谢!

2
为什么需要介质打印?如果不使用介质打印并且直接在div上应用规则,是否一样?
FrenkyB

21

只是部分解决方案:我可以使此方法适用于IE的唯一方法是将每个div包装在其自己的表中,并在表上设置page-break-inside以避免。


@easwee:谢谢。反对投票同时发生在inquisitive_web_developer悬赏这个问题的同时。我的猜测是他/她不喜欢它。;)
NotMe 2011年

3
美丽!你是冠军 我一直在wkhtmltopdf中寻找一种执行此方法的方法,该方法无法page-break-inside: avoid;正确支持。最后,我有一个不错的解决方法。
戴夫

2
在0.11版的wkhtmltopdf中测试了page-break-inside,它可以正常工作。
cmc 2012年

用wkhtmltopdf 0.12.2.1。测试 不再需要在表内使用div,只需将page-break-inside放在里面:避免在div选择器上使用。作品!
保罗·马蒂

12

page-break-inside: avoid; 使用wkhtmltopdf给我带来麻烦。

为了避免文本中断,请添加display: table;到包含文本的div的CSS中。

我希望这也对您有用。谢谢约翰·S。


我几乎放弃了在page-break-before: always;on <div>元素上使用时出现在这里和那里的无法解释的空间。在SO帖子,文章,官方文档之类的东西中搜索。没有任何帮助。但是,您,我的朋友,终于有了我真正需要的东西!太谢谢你了,伙计!我希望至少能为您喝杯咖啡,来自印度的热爱!
杰伊·达达尼亚

6

page-break-inside:避免;绝对不能在webkit中工作,事实上,已经有5年以上的已知问题了https://bugs.webkit.org/show_bug.cgi?id=5097

就我的研究而言,没有已知的方法可以完成此操作(我正在研究自己的黑客方法)

我可以给您的建议是,要在FF中完成此功能,请包装您不想要的内容;不要在DIV(或任何容器)中以溢出的方式破坏它:auto(请小心不要使怪异的滚动条通过将容器的尺寸设置得太小来显示)。

遗憾的是,FF是我设法完成此操作的唯一浏览器,而Webkit是我更担心的浏览器。


5

page-break-after的可能值为: auto, always, avoid, left, right

我相信您不能在绝对定位的元素上使用thie page-break-after属性。


1
显然,它对inline-blocks也
无效

5

我有相同的问题,但尚未解决。page-break-inside在Opera上不起作用。另一种选择是使用分页后:在div的所有子元素上保持一致...但是在我的测试中,eggate-Attribute不起作用。在Firefox中...

在所有ppular浏览器中有效的是使用eg强制分页。分页后:始终


这应该与Webkit一起使用。但是,您可能需要添加一些额外的div样式,以进行分页后打印:大约是您的常规div的一半之后。
2011年

3

我遇到的一个陷阱是父元素的“溢出”属性设置为“自动”。这会在打印版本中使用page-break-inside属性来否定子div元素。否则,page-break-inside: avoid对我来说可以在Chrome上正常运行。


2

就我而言,我设法通过将选定的div设置为page-break-inside:avoid并将所有元素设置为display:inline来解决webkit中的分页困难问题。像这样:

@media print{
* {
    display:inline;
}
script, style { 
    display:none; 
}
div {
    page-break-inside:avoid;
}

}

似乎page-break-properties仅可应用于内联元素(在Webkit中)。我尝试仅将display:inline应用于我需要的特定元素,但这没有用。唯一有效的方法是将内联应用于所有元素。我猜这是搞砸事情的大容器div之一。

也许有人可以对此进行扩展。


1
@media print{
    /* use your css selector */    
    div{ 
        page-break-inside: avoid;
    }
}

对于所有新浏览器,此解决方案均适用。参见caniuse.com/#search=page-break-inside


1

page-break-inside: avoid;似乎并不总是有效。它似乎考虑到了容器元素的高度和位置。

例如,inline-block比页面高的元素将被裁剪。

我能够page-break-inside: avoid;通过标识容器元素display: inline-block并添加以下内容来恢复工作功能:

@media print {
    .container { display: block; } /* this is key */

    div, p, ..etc { page-break-inside: avoid; }
}

希望这对抱怨“ page-break-inside不起作用”的人们有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.