【问题标题】:Bootstrap print CSS removes background colorBootstrap 打印 CSS 移除背景颜色
【发布时间】: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/

【问题讨论】:

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

标签: html twitter-bootstrap css


【解决方案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 个选项,它们都不是您所希望的,但它就是这样。按难度排序:

  1. 下载 BS(less 或 sass)源,编辑有问题的代码,然后编译。 (您需要使用本地副本,CDN 不起作用。)
  2. 下载您选择的 CSS 变体,搜索并删除有问题的代码。 (再次没有 CDN。)
  3. 使用getbootstrap.com/customize 创建新变体 - 排除“通用 CSS”下的“打印媒体样式”。 (同样,没有 CDN)
  4. 覆盖您要打印的颜色的特定项目:例如
    @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/cssref/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 然后它对我有用。

        【讨论】:

        【解决方案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);
             }
          });
          

          【讨论】:

            猜你喜欢
            • 2011-04-23
            • 2015-06-16
            • 2015-07-29
            • 2015-09-21
            • 2014-03-18
            • 2014-03-31
            • 2016-06-11
            相关资源
            最近更新 更多