【问题标题】:How to only show certain parts with CSS for Print?如何仅使用 CSS 显示某些部分以进行打印?
【发布时间】:2011-03-28 16:29:27
【问题描述】:

我有一个包含大量数据、表格和内容的页面。 我想制作一个只显示极少数选定内容的打印版本。

我没有为打印而写另一个页面,而是阅读了有关“@media print”的 CSS 功能。

首先,哪些浏览器支持它?由于这是一个内部功能,所以只要最新的浏览器支持它就可以了。

我正在考虑使用“可打印”类标记一些 DOM 元素,并且基本上将“显示:无”应用于除具有“可打印”类的那些元素之外的所有元素。 这可行吗?

我如何做到这一点?

编辑: 这是我目前所拥有的:

<style type="text/css">
@media print {
    * {display:none;}
    .printable, .printable > * {display:block;}
}
</style>

但它隐藏了一切。如何使这些“可打印”元素可见?

编辑: 现在尝试消极的方法

<style type="text/css">
@media print {
    body *:not(.printable *) {display:none;}
}
</style>

这在理论上看起来不错,但它不起作用。也许“不”不支持高级css ...

【问题讨论】:

  • 我认为你应该从另一边接近它。隐藏不打印的内容,而不是隐藏所有内容并仅显示您想要打印的位。因为用干净的方式在 CSS 中实现是不可能的。
  • 实际上可以按照@Strelok 建议的方式进行操作:您可以将所有不应包含在打印中的元素标记为无打印,避免标记您实际想要的元素的容器到。 .no-print{display: none:} 但它真的很愚蠢。你想要做的方式更干净,更聪明。但可悲的是,这似乎是唯一的方法。希望不是。您想要做的是一个很好的父 css 选择器用例:css-tricks.com/parent-selectors-in-css 您可以说:* {display:none;} .printable, .printable

标签: css printing css-selectors


【解决方案1】:

开始here。但基本上你所想的是正确的方法。

谢谢,现在我的问题实际上是 成为:如何将 CSS 应用于 班级及其所有后代 元素?这样我就可以申请 “显示:块”到任何在 “可打印”区域。

如果一个元素设置为display:none;,它的所有子元素也将被隐藏。但无论如何。如果您希望一种样式适用于其他事物的所有子项,请执行以下操作:

.printable * {
   display: block;
}

这会将样式应用于“可打印”区域的所有子项。

【讨论】:

  • 谢谢,这几乎是完美的!现在唯一的问题是并非所有元素都应该是“块”。当我测试时,我意识到 div 是“块”,常规的东西是“内联”,表是“表”,tbody 是“表行组”,tr 是“表行”,等等......我可以为每个单独添加规则,但有没有办法只说“应用常规浏览器样式”?
【解决方案2】:

几乎所有浏览器都支持它。在link 标签上使用media 属性可能是有利的。

在您的某些规则中使用display: none; 将是处理您的情况的适当方式。

【讨论】:

  • 谢谢,现在我的问题实际上变成了:如何将 CSS 应用到一个类及其所有后代元素?这样我就可以将“显示:块”应用于“可打印”区域中的任何内容。
【解决方案3】:

一个简单的方法:

<style>
    .print-only{
        display: none;
    }

    @media print {
        .no-print {
            display: none;
        }

        .print-only{
            display: block;
        }
}
</style>

【讨论】:

  • 这是正确的,但如果 .print-only 元素自然是内联(例如)而不是块,则可能会导致格式出现不必要的中断。
  • 为什么有两个@@
  • 我猜@@ 是一个错字。
  • 我认为 'diaply:block' 会破坏一些具有其他显示类型的元素。
【解决方案4】:

我来到这里是因为我对打印由 chart.js 生成的图表感到好奇。我想直接从页面打印图表(使用执行“window.print”的按钮),而不需要页面的所有其他内容。

所以,我通过使用此处答案中的技术更接近了:Why can't I override display property applied via an asterisk?

您必须将“星号”应用于“正文”元素,而不仅仅是单独使用。因此,使用 OP (Nathan) 添加到问题中的示例 CSS,我将其更改为:

<style type="text/css">
@media print {
    body * {display:none;}
    .printable, .printable > * {
    display: block !important;
  }
}
</style>

然后将该“可打印”类添加到图表本身,如

<canvas id="myChart" class="printable" width="400" height="400"></canvas>

当单击“打印”按钮时(通过此),除了图表之外,它删除了打印输出上的所有页面元素:

<script>
    myChart.render();
    document.getElementById("printChart").addEventListener("click",function(){
        window.print();
    });     
</script>

所以,也许这会帮助任何通过谷歌解决这个问题的人。

【讨论】:

  • 这会隐藏所有元素,但不会向所有元素及其子元素显示块。我有完全相同的css
  • 这是一个较旧的答案,当我在 2017 年使用它时,该代码有效。应该仍然有效。该脚本是一个单独的按钮,其 ID 为“printChart”;我的答案中没有显示该代码。我相信,CSS 第 4 行中的星号应该让“printable”类的任何子元素都是可打印的。 (我的回答中缺少关闭样式命令;我刚刚添加了它。)
  • 没关系,我认为它不应该改变那么多。我现在所拥有的非常相似,我单击了一个触发 window.print 功能的按钮。唯一的问题是,当我查看页面时,它是空白的。我正在使用 ASP.Net,它是一个旧应用程序,可能效果不如。感谢您的回复!
  • 我刚刚注意到在我的另一个使用上述 CSS 代码的网站上打印预览后出现空白页。使用最新的 FF/Win10。不知道为什么会这样。如果我拿走那个 CSS,打印预览就会正常工作。令人费解。
【解决方案5】:

我建议隐藏你不会打印的元素:

HTML

<h1 class="no-print" >Welcome Just Screen</h1>
<div> I want print this section :)</div>
<div class="no-print">It's display only on screen</div>

CSS

@media print {     
    .no-print {
        display: none;
    }
}

【讨论】:

    【解决方案6】:

    如果您想在浏览器中显示一些链接等,您不想被打印。此外,您还有一些仅应出现在打印页面上的徽标和信头信息。 这似乎工作正常:

    示例:

    CSS:

    @media print {
      .noPrint {
          display:none;
      }
    }
    @media screen {
       .onlyPrint {
           display: none;
       }
    }
    

    HTML:

    <div class="noPrint" id="this_is_not_printed"  >
       <a href=links.html>
    </div>
    <div class="onlyPrint"  id="this_is_only_seen_on_printer" >
       <img scr=logo.png >
       <img scr=letterhead.png >
    </div>
    

    【讨论】:

    • 同时使用@media print@media screen 为我解决了这个问题。谢谢。
    • "onlyPrint" 元素将可用于屏幕阅读器。我认为应该这样做:@media only speech, only screen { .onlyPrint { display: none; } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2012-05-27
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多