内部分页:避免不工作

Posted

技术标签:

【中文标题】内部分页:避免不工作【英文标题】:Page-break-inside:avoid not working 【发布时间】:2016-04-04 16:56:26 【问题描述】:

我的 (Wordpress) 网站有一个打印样式表,我希望将图像打印在一个页面上,而不是跨页面打印。在某些情况下,甚至文本行也被拆分到页面中。我在我的打印样式表中包含了img page-break: avoid;),但没有运气。我找到了一些以前的答案,但它们有点老了。

是否有可靠的方法在单页上打印中等大小的图像,而不是将其拆分为多个页面?为什么文本行会跨页?

网站:http://74.220.217.211/housing-developments/grafton-townhomes/

相关帖子:

Print styles: How to ensure image doesn't span a page break

What are most useful media="print" specfic ,cross browser compatible css properties?

What is the correct way to do the CSS to avoid page breaks?

page-break-inside doesn't work in Chrome? Work around for page-break-inside:avoid

【问题讨论】:

尝试将position: relative 添加到父节点 @riskbreaker,谢谢!我不确定要添加到哪个父母。 你用的是什么浏览器? 【参考方案1】:

可能是img元素的父元素有样式:

display: flex

那么break-inside就不起作用了。

例如,如果您将父元素显示样式更改为:

display: block

然后就可以了。

【讨论】:

哦!多么奇特的陷阱!如果您有参考链接,将会很有帮助。 从来没有想过这个!!另请检查此线程以获取显示的替代解决方案:flex ***.com/questions/20408033/… 谢谢 仅供参考 - display:flex 可能会导致问题,但不能保证一定会出现问题。此外,display:grid 也可能导致问题【参考方案2】:

不同的浏览器对page-break-inside: avoid 有奇怪的限制。在不同的文章中提出了以下限制:

如果文档树的父级或祖级为display:flexdisplay:grid,则避免分页符将不起作用。 如果父元素有display:inline-blockavoid 不起作用。 在某些情况下,父元素需要position:relativeavoid 才能在子元素中工作。 (具体规则未知。) 在某些情况下,父元素和需要避免破坏的元素都需要position:relative 才能使值avoid 起作用。 (具体规则未知。) 父元素不能有display: inline-block。 元素不能有display:table-cell

简而言之,@media print 样式应该避免使用floatflexgridposition:absoluteposition:sticky,如果您需要使用page-break-inside: avoid。为了与不同浏览器实现最佳兼容性,请尝试使用display:block 定义从根到父的整个树,并且除了page-break-inside: avoid 之外,不应使用display:inline-block 破坏的元素。

上述例外都不是任何规范的一部分,因此这些只是浏览器实现中的错误或限制。

还要注意,尽管最新的规范更喜欢break-inside: avoid 而不是page-break-inside: avoid,但现实世界的浏览器支持仍然很糟糕。我建议同时声明:

.nobreak

  page-break-inside: avoid;
  break-inside: avoid

【讨论】:

另见:smashingmagazine.com/2019/02/css-fragmentation 另见:我的 hack 将标题与以下内容保持在同一页面上 ***.com/a/68268825/334451【参考方案3】:

我认为问题可能来自元素的position 属性。您不想在页尾中断的元素及其父元素应声明为:

position: relative;

其余的代码样式是对的,应该是这样的

@media print 
    img 
        page-break-before: auto;
        page-break-after: auto; 
        page-break-inside: avoid;
        position: relative;
    

【讨论】:

【参考方案4】:

试试这个:

.site-container, .site-inner (heck body tag possibly) position:relative;

p 
    page-break-inside: avoid;
    position: relative; 

查看FIDDLE

将其添加到您的印刷媒体中

我只是在 Chrome 中查看了这个,它看起来很好减去也需要这个的图像:

img 
    page-break-before: auto;
    page-break-after: auto; 
    page-break-inside: avoid;
    display: block;

最后 Wordpress 有这个,但实际上不确定它是否有帮助......

 <!--nextpage-->

【讨论】:

试过了,但没有运气。谢谢。 你把它放在你的 WP 文件的什么地方? 可能想要检查该主题 - 如果您在印刷媒体上至少添加了 img 标记但仍然没有得到任何结果,那么可能需要更多的主题来实现【参考方案5】:
img 
    page-break-before: auto;
    page-break-after: auto; 
    page-break-inside: avoid;
    display: block;

这会起作用

【讨论】:

欢迎来到 Stack Overflow。当用其他三个答案回答一个四年前的问题时,指出您的答案所针对的问题的新方面并确认时间的流逝是否使新答案成为可能是有用的。在这种情况下,您的答案与现有答案非常相似,但只是代码,缺乏解释,并且没有其他答案所具有的细节,例如使用 @media print 【参考方案6】:

使用 @media print 并为 page body 元素设置合适的 height 或将 small size 设置为图片

例如:

@media print
body
height: 800px;


【讨论】:

以上是关于内部分页:避免不工作的主要内容,如果未能解决你的问题,请参考以下文章

避免嵌套分页的模式设计

避免为分页页面缓存更新的策略

代码神秘地停止工作[关闭]

避免在行跨度不起作用的标题表中出现分页符(打印)

Android分页与滑动刷新内部CoordinatorLayout得到错误

非连续内存分配