如何仅使用CSS显示某些部分用于打印?

Nat*_*n H 28 css printing css-selectors

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

我正在阅读有关"@media print"的CSS功能,而不是仅仅为了打印而编写另一个页面.

首先,哪些浏览器支持它?由于这是一个内部功能,只有最新的浏览器支持它才行.

我正在考虑使用"可打印"类标记一些DOM元素,并且基本上将"display:none"应用于除了具有"可打印"类的那些元素之外的所有内容.那可行吗?

我该如何实现这一目标?

编辑:这是我到目前为止:

<style type="text/css">
@media print {
    * {display:none;}
    .printable, .printable > * {display:block;}
}
</style>
Run Code Online (Sandbox Code Playgroud)

但它隐藏了一切.如何使这些"可打印"元素可见?

编辑:现在尝试消极方法

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

这在理论上看起来不错,但它不起作用.也许"不"不支持高级CSS ...

Str*_*lok 14

这里开始.但基本上你所想的是正确的方法.

谢谢,现在我的问题实际上变成了:我如何将CSS应用于课堂及其所有后代元素?这样我就可以将"display:block"应用于"可打印"区域中的任何内容.

如果元素设置为其display:none;所有子元素也将被隐藏.但无论如何.如果您希望样式应用于其他所有子项,请执行以下操作:

.printable * {
   display: block;
}
Run Code Online (Sandbox Code Playgroud)

这将把风格应用于"可打印"区域的所有孩子.

  • 谢谢,这几乎是完美的!现在唯一的问题是并非所有元素都应该是"阻止".在我测试时,我意识到div是"块",常规的东西是"内联",表是"表",tbody是"table-row-group",tr是"table-row"等...我可以为每个单独添加规则,但有没有办法只说"应用常规浏览器样式"? (3认同)

小智 14

一个简单的方法:

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

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

        .print-only{
            display: block;
        }
}
</style>
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但如果 .print-only 元素自然地内联(例如)而不是块,则可能会导致格式不必要的中断。 (3认同)

ole*_*lin 10

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

例子:

CSS:

@media print {
  .noPrint {
      display:none;
  }
}
@media screen {
   .onlyPrint {
       display: none;
   }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Ric*_*ell 5

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

因此,我通过使用以下答案中的技术走得更近:为什么我不能覆盖通过星号应用的显示属性?.

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

<style type="text/css">
@media print {
    body * {display:none;}
    .printable, .printable > * {
    display: block !important;
  }
}
</style>
Run Code Online (Sandbox Code Playgroud)

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

<canvas id="myChart" class="printable" width="400" height="400"></canvas>
Run Code Online (Sandbox Code Playgroud)

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

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

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