如何强制浏览器在CSS中打印背景图片?

157
这个问题之前已经被问过, 但解决方案不适用于我的情况。我想确保某些背景图片被打印,因为它们是页面的一部分。(它们不是直接在页面中的图像,因为有几个作为CSS sprites使用。)
该问题上的另一个解决方案建议使用list-style-image, 但只适用于每个图标都有不同的图像,无法使用CSS sprites。
除了创建一个包含图标的单独页面外,还有其他解决方案吗?
13个回答

271

5
太棒了!对于PhantomJS用户/ Webkit来说,让生活变得更加轻松。 - Jason
1
@MuneemHabib 它在IE中不起作用,实际上,唯一支持的浏览器是Chrome:https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-print-color-adjust - Marco Bettiolo
这对Chrome起作用了...幸运的是,在这种情况下,我只需要支持Webkit... - Davy
2
@DisgruntledGoat应该更新这个答案,因为它快速解决了我的问题(我的工作项目只关注Chrome)。显然,它并不适用于所有浏览器,但应该在最前面知道。 - HaulinOats
3
我不同意,因为这只是一种单浏览器解决方案。 - Kukeltje
显示剩余3条评论

195

默认情况下,浏览器会关闭打印页面的background-color和图像选项。您可以在 CSS 中添加几行代码来绕过此设置。 只需添加:

* {
    -webkit-print-color-adjust: exact !important;   /* Chrome, Safari 6 – 15.3, Edge */
    color-adjust: exact !important;                 /* Firefox 48 – 96 */
    print-color-adjust: exact !important;           /* Firefox 97+, Safari 15.4+ */
}

ya在运行时表现良好,但Mozilla标记为非标准。该功能是非标准的,没有遵循标准轨迹。不要在面向Web的生产站点上使用它:它不会为每个用户工作。实现之间可能存在较大的不兼容性,并且行为可能会在未来发生变化。 - Qh0stM4N
11
为什么需要使用!important关键字? - user9315861
1
很遗憾,FireFox并没有很好地支持color-adjust。它似乎只适用于背景,而不是color CSS属性。这被报告为一个bug,但没有太多的活动或投票。如果字体颜色不能保留,使其无法阅读,那么保留背景就毫无意义了。 - Frédéric
3
!important 对我来说不是必要的。 - Kip
这是一个非常棒的解决方案。与之前的评论相反,它可以在Firefox和Chrome浏览器中运行。 - Speednet
显示剩余5条评论

81

我找到了一种使用CSS打印背景图像的方法。 这有点取决于您的背景布局方式,但对于我的应用程序似乎有效。

基本上,您需要在样式表的末尾添加@media print,然后略微更改body的背景。

例如,如果您当前的CSS如下所示:

body {
background:url(images/mybg.png) no-repeat;
}

在你的样式表末尾,添加以下内容:

@media print {
body {
   content:url(images/mybg.png);
  }
}

这将把图片作为“前景”图像添加到页面主体中,从而使其可以打印。 您可能需要添加一些额外的CSS以使z-index合适。但是,这取决于您的页面布局方式。

当我无法在打印视图中显示标题图像时,这对我很有用。


3
这是一个非常棒的解决方案,适用于我需要做的事情,即在响应式设计中用不同的图像替换内联的<img>,以满足@media print的需要。网络图像在深色背景上,所以在白纸上打印该图像会不清晰,而我又不想强制用户在标题上打印暗色背景。完美! - JHogue
@JHogue - 谢谢!很高兴能帮到您。 - ckpepper02
5
虽然这不是一个“正确”的答案,但比被采纳的答案更有帮助。 - Xenology
应该标记以下答案https://dev59.com/T2w15IYBdhLWcg3wWqZ0#15208258,因为它有更好的解释,我个人认为。 - Kat Lim Ruiz
1
在Firefox中,它仅在您使用:before中的内容时才有效,就像@hanz的答案。 - vaskort
显示剩余2条评论

53

您对浏览器的打印方法几乎没有控制权。最多只能建议,但如果浏览器的打印设置为“不要打印背景图像”,除非重写页面将背景图像转换为浮动的“前景”图像,否则您将无能为力。


1
这并不完全正确。请参见Abhi Beckert上面得到高票的答案。 - Speednet

25
下面的代码对我来说很有效(至少对于Chrome浏览器)。
我还添加了一些边距和页面方向控制(纵向、横向)。
<style type="text/css" media="print">
@media print {
  body {-webkit-print-color-adjust: exact;}
}
@page {
    size:A4 landscape;
    margin-left: 0px;
    margin-right: 0px;
    margin-top: 0px;
    margin-bottom: 0px;
    margin: 0;
    -webkit-print-color-adjust: exact;
}
</style>

10

请确保使用!important属性。这将极大地增加打印时保留样式的可能性。

#example1 {
    background:url(image.png) no-repeat !important;
}

#example2 {
    background-color: #123456 !important;
}

我使用这种方法为我的公司创建了一些简单的“打印友好型”报告。它适用于OS X Chrome / Safari和Windows 8 Chrome / IE(尚未尝试其他平台)。 - nuts-n-beer
4
在Mac上,这似乎对Chrome、Firefox和Safari没有影响。 - intcreator
这正是我需要的,可以将属性应用于该特定元素的每个使用,并让我适当地打印文档。谢谢! - johnny

7

如@ckpepper02所说,body content:url选项效果很好。但是我发现,如果稍微修改一下,只需使用:before伪元素,即可添加标题图像。

@media print {
  body:before { content: url(img/printlogo.png);}
}

这将使页面顶部的图像滑动,经过我的有限测试,它在Chrome和IE9中有效。 -hanz

5

使用伪元素。虽然许多浏览器会忽略背景图像,但将内容设置为图像的伪元素技术上不是背景图像。您可以大致定位背景图像应该放置的位置(尽管与原始图像相比不那么容易或精确)。

其中一个缺点是,要使其在Chrome中起作用,您需要在打印媒体查询之外指定此行为,然后在打印媒体查询块中将其可见。因此,类似于这样的代码...

.image:before{
        visibility:hidden;
        position:absolute;
        content: url("your/image/path");
    }   

@media print {
.image{
   position:relative;
    }
    .image:before{
       visibility:visible;
       top:etc...
    }       
}

缺点是在普通页面加载时,图像通常会被下载,增加不必要的负担。您可以通过只使用与原始可见图像相同的图像/路径来避免这种情况。


4
默认情况下,浏览器不会打印背景颜色和图片。您可以在CSS中添加一些代码来解决这个问题。只需添加以下几行代码即可:
* {
    -webkit-print-color-adjust: exact !important;   /* Chrome, Safari */
    color-adjust: exact !important;                 /*Firefox*/
}

注意:它不会在整个文档中起作用,但您可以将其指定为内部元素或容器 div 元素。


3
当你在背景图像中添加 !important 属性时,它可以在 Google Chrome 中正常工作。请确保首先添加属性,然后再尝试。你可以这样做。
    .inputbg {
background: url('inputbg.png') !important;  

}


很好的提醒,解决了我的问题,同时加上了-webkit-print-color-adjust: exact !important; - czmarc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接