Bootstrap 打印 CSS 移除背景颜色

Posted

技术标签:

【中文标题】Bootstrap 打印 CSS 移除背景颜色【英文标题】:Bootstrap print CSS removes background color 【发布时间】:2016-01-29 09:18:20 【问题描述】:

当我使用引导程序时,它会在我尝试打印页面时从所有内容中删除背景颜色。 我网站上的几乎所有内容都使用引导程序类,因此我想避免在引导程序之外使用大量手动 CSS。 我发现 bootstrap 使用 @media print 删除背景颜色。我也在使用引导主题(主题联合),它也删除了背景颜色。

theme-united.css

@media print
*, *:before, *:after 
    background: rgba(0, 0, 0, 0) !important;
    color: rgb(0, 0, 0) !important;
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
    text-shadow: none !important;

bootstrap.min.css

@media print
*, :after, :before 
    color: rgb(0, 0, 0)!important;
    text-shadow: none!important;
    background: 0 0!important;
    -webkit-box-shadow: none!important;
    box-shadow: none!important;

有没有办法确保在不编辑这 2 个 CSS 文件的情况下打印时不移除背景颜色?

例如: 当我使用 .alert-danger 时,我希望在屏幕上显示警报危险时打印它,因此将打印为红色框。

参见 JSFiddle: http://jsfiddle.net/7mtk7wrh/

【问题讨论】:

参考栈溢出问题***.com/questions/14987496/… 您现在要设置哪种颜色作为背景,它会显示黑色对吗? @AkashK.:我当然想到了这一点,但到目前为止都没有。我不想将每种引导颜色都添加到我自己的 CSS 中以覆盖引导打印样式。 @Mithun:我已经尝试过该解决方案,但颜色仍然被引导程序覆盖。 @Mitul:我想使用原始引导类的颜色(例如;当我使用 .alert-danger 时,我想看到一个红色框) 【参考方案1】:

很遗憾,您的问题没有很好的答案 - 但也许如果您了解原因,那么您可以选择前进的方向。

为什么?

Bootstrap 确实使用了@media print * color: $fff; background: transparent; ——但有一个非常可靠的理由。这段代码实际上源自normalizer.css 项目(由当时的@mdo 学院@necolas)——其目的是使所有浏览器的行为都相同。这些人选择“规范化”css 是有充分理由的:

对于大多数浏览器,可以选择包含或排除背景颜色,因此即使是同一个浏览器,这种行为也不是标准的。想象一下,一个背景非常暗且带有白色文本的网站——在关闭背景打印时,看起来你什么都没有打印——而实际上你是在没有(白色)背景的情况下打印白色文本。

无法解释颜色的所有不同用途,因此他们选择了黑色(字体)和白色(背景,实际上是“透明”)。甚至黑色的选择也经过深思熟虑——它是一种更好的打印解决方案,因为大多数彩色打印机都有更多的黑色“墨水/墨粉”(更经济),而且它们不需要混合颜色来制作黑色(所以更快)。

请记住,Bootstrap 也是一个“框架”——如果你愿意的话,这是一个起点——并且感谢 @mdo 和 @necolas 在建立可预测的基线方面有远见地考虑这一点。 (不,我不认识他们。)

不...

所以这里的想法是:“如果我们可以'返回'并取消设置会怎样。不幸的是,CSS 不能那样工作 - 是的,浏览器将 CSS 声明加载到最后一个声明获胜的“队列”中(LIFO,或后进先出),但我不知道有什么方法可以删除这个堆栈。所以 CSS 开发人员只是在最后添加更多......

所以人们会假设我们可以返回那个方式 --- 添加一个* background-color: inherit 。问题是 inherit 恢复到父属性,但 * 是根,所以它没有什么可恢复的。 initial 也是如此!

也许吧!

所以我们有 4 个选项,它们都不是您所希望的,但它就是这样。按难度排序:

    下载 BS(less 或 sass)源,编辑有问题的代码,然后编译。 (您需要使用本地副本,CDN 不起作用。) 下载您选择的 CSS 变体,搜索并删除有问题的代码。 (再次没有 CDN。) 使用getbootstrap.com/customize 创建新变体 - 排除“通用 CSS”下的“打印媒体样式”。 (同样,没有 CDN) 覆盖您要打印的颜色的特定项目:例如
    @media print 
      .alert-danger 
        color: yellow !important;
        background-color: red !important;
      
    

CDN 的 BS 副本现在可以工作了,但是您遇到的问题是用户可能不打印背景并且输出白色(例如黄色)为白色!

终于

我希望了解原因至少是您思考解决方法的一种方式。我遵循的一般经验法则是,在打印时,背景(应该)总是白色的。当以这种方式受到限制时,您会开始思考新颖的想法,例如仅“打印”的文本周围的感叹号图标 (@media only screen .hidden-screen display: none; )

【讨论】:

我想保持背景图片不是颜色,所以这个解决方案不起作用。 很好的解释。最终在没有 Bootstrap 的情况下创建了一个用于打印目的的新视图...【参考方案2】:

尽管!important 的用法通常不受欢迎,但这是bootstrap.css 中的违规代码

.table td,
.table th 
    background-color: #fff !important;

假设您正在尝试设置以下 html 的样式:

<table class="table">
    <tr class="highlighted">
      <th>Name</th>
      <th>School</th>
      <th>Height</th>
      <th>Weight</th>
    </tr>
</table>

要覆盖此 CSS,请在样式表中放置以下(更具体的)规则:

@media print 
    table tr.highlighted > th 
        background-color: rgba(247, 202, 24, 0.3) !important;
    

之所以有效,是因为该规则比引导默认值更具体。

【讨论】:

【参考方案3】:

您可以通过从bootstrap.css 文件中删除这些行来完成此工作,可能有一个 jquery 解决方案,但它比删除几行要复杂得多。 :/

或者,您可以使用jsfiddle 中介绍的名为 html2canvas 的插件

【讨论】:

试过这个,但这是将颜色重置为原始值。问题是,例如,我使用 .alert-danger 创建一个带有红色背景的框,我希望该红色框也打印为红色框。所以我需要引导 CSS 来添加背景颜色,我只是不需要打印部分。 然后尝试将其更改为初始值。 CSS 首字母将转到该框的 bootstrap.css 设置并忽略之前设置的规则。如果它不起作用,您介意发送链接或在 jsfiddle 中重新创建问题吗? :) 也不工作。这是将颜色设置为默认值:w3schools.com/cs-s-ref/css_initial.asp。继承不起作用,因为 css 中有 !important 透明背景颜色,因此忽略了真实颜色。 只是从 bootstrap.css 中删除这些规则,这不像您每天都在更新 bootstrap...我仍然认为可以在不摆弄 bootstrap.css 的情况下解决这个问题,您能重新创建问题吗请在 jsfiddle 中? 我已经在 m 问题中添加了 JSFiddle,您的示例已经在其中。我不会每天更新引导程序,非常正确。但我知道我会忘记删除这些行,我认为引导程序删除背景颜色很愚蠢,所以我无法忍受我应该编辑引导程序 CSS 并且没有解决方法。【参考方案4】:

我在这里遇到了同样的问题,但发现 Chrome 在打印对话框中带有显示背景图形选项,在更多设置下可以做到这一点!无需修改 Bootstrap (4)。

【讨论】:

【参考方案5】:

@Vino 解释得很好。我也遇到了问题,因为 bootstrap.css 强制使背景透明。因此,我在自定义 CSS 文件中自定义了特定元素。请记住将 <.element> 更改为您想要彩色背景而不是透明的元素。

@media print 
	 .element
		background-color: white !important;
		box-shadow:  inset 0 0 0 1000px #fff !important; /* workaround for IE 11*/
	 
  

【讨论】:

【参考方案6】:

我也遇到了同样的问题..我只是从我的代码中删除 bootstrap.min.css 然后它对我有用。

【讨论】:

一旦你有足够的reputation,你就可以改为comment on any post;,provide answers that don't require clarification from the asker。【参考方案7】:

只要让特异性值更具体,你应该没问题。 类似:

@media print 
   tbody>tr:nth-child(even)>td 
        background-color: rgb(230, 216, 216) !important;
    

【讨论】:

【参考方案8】:

其实是有解决办法的,但这仍然是一个 hack。 它被用于 puppeteer 中的 pdf 生成,因此仅在这种情况下进行了测试,但很可能应该适用于所有现代浏览器。 请记住,不同版本的 Bootstrap 中的 BOOTSTRAP_PRINT_RULE 可能不同。

const BOOTSTRAP_PRINT_RULE = `@media print 
  *, ::after, ::before  color: rgb(0, 0, 0) !important; text-shadow: none !important; background: 0px 0px !important; box-shadow: none !important; 
  a, a:visited  text-decoration: underline; 
  a[href]::after  content: " (" attr(href) ")"; 
  abbr[title]::after  content: " (" attr(title) ")"; 
  a[href^="javascript:"]::after, a[href^="#"]::after  content: ""; 
  blockquote, pre  border: 1px solid rgb(153, 153, 153); break-inside: avoid; 
  thead  display: table-header-group; 
  img, tr  break-inside: avoid; 
  img  max-width: 100% !important; 
  h2, h3, p  orphans: 3; widows: 3; 
  h2, h3  break-after: avoid; 
  .navbar  display: none; 
  .btn > .caret, .dropup > .btn > .caret  border-top-color: rgb(0, 0, 0) !important; 
  .label  border: 1px solid rgb(0, 0, 0); 
  .table  border-collapse: collapse !important; 
  .table td, .table th  background-color: rgb(255, 255, 255) !important; 
  .table-bordered td, .table-bordered th  border: 1px solid rgb(221, 221, 221) !important; 
`

for (const styleSheet of document.styleSheets) 
    for (const [index, rule] of Array.from(styleSheet.cssRules).entries()) 
        if (rule.cssText && rule.cssText.includes(BOOTSTRAP_PRINT_RULE)) 
            styleSheet.deleteRule(index)
            return;
        
    

【讨论】:

@M-Chen-3 这是一种黑魔法……说真的,我们只是从浏览器的 DOM 中删除了这个确切的规则。我们遍历所有已加载的样式表并尝试找到一个规则我们需要删除。找到规则后,我们将其删除。它更新 CSS 规则列表并触发重新渲染。将其视为删除 元素但用于样式规则 【参考方案9】:

从带有 SASS 的 Bootstrap 第 4 版开始,您实际上可以将以下变量设置为 false,这将改变这种行为:

$enable-print-styles: false

如果这不是一个选项,下面的脚本会从 CSS 中粗暴地删除所有 @media print 注释。它假定 Bootstrap 是第一个加载的样式表,并且它在 Bootstrap 加载之后运行。

var style = document.styleSheets[0];

[].forEach.call(style.cssRules || [], function (aRule, aIndex) 
   if (aRule.cssText.indexOf("@media print") >= 0) 
      style.deleteRule(aIndex);
   
);

【讨论】:

以上是关于Bootstrap 打印 CSS 移除背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bootstrap 打印 HTML 表格背景颜色

使用bootstrap 网页打印 文字颜色丢失

使用bootstrap 网页打印 文字颜色丢失

Bootstrap CSS背景颜色不起作用

使用 CSS 更改 Twitter Bootstrap 中按钮的背景颜色

更改 Bootstrap 4 复选框背景颜色