只打印 <div id="printarea"></div> 吗?

IT技术 javascript css printing dhtml
2021-02-02 09:56:03

如何打印指定的 div(无需手动禁用页面上的所有其他内容)?

我想避免一个新的预览对话框,所以用这个内容创建一个新窗口是没有用的。

该页面包含几个表格,其中一个包含我要打印的 div - 该表格的样式为 Web 视觉样式,不应在打印中显示。

6个回答

这是一个通用的解决方案,使用CSS,我已经验证它可以工作。

@media print {
  body * {
    visibility: hidden;
  }
  #section-to-print, #section-to-print * {
    visibility: visible;
  }
  #section-to-print {
    position: absolute;
    left: 0;
    top: 0;
  }
}

替代方法不是那么好。使用display很棘手,因为如果有任何元素,display:none那么它的后代也不会显示。要使用它,您必须更改页面的结构。

使用visibility效果更好,因为您可以为后代打开可见性。不可见的元素仍然会影响布局,所以我移到section-to-print左上角以便正确打印。

这是一个很好的开始,但我遇到了两个麻烦:首先,如果元素的任何父元素建立了自己的相对/绝对定位,除非我position:fixed改为使用,否则内容仍然会被抵消但是,Chrome 和 Safari 也会截断内容,尤其是在第一页之后。所以我最后的解决方法是将目标 它的所有父项都设置overflow:visible; position:absolute !important; top:0;left:0
2021-03-15 09:56:03
您可以尝试使用 JavaScript 解决方案,但如果您的用户使用浏览器的打印命令,那将不起作用。
2021-03-17 09:56:03
这是迄今为止最快和最干净的方式,我想知道为什么这个答案没有得到最多的选票-.-
2021-03-19 09:56:03
使用此解决方案需要注意的一个问题是,在某些情况下,您最终可能会打印数千个空白页。在我的情况下,我能够通过对所选项目使用一些额外的 display:none 样式来解决这个问题,但也许通过强制高度、溢出:none 和所有 div 的绝对定位或其他东西的某种组合,可以实现更通用的解决方案。
2021-03-23 09:56:03
@dudeNumber4#section-to-print匹配部分本身;#section-to-print *匹配节的每个子元素。因此,该规则仅使该部分及其所有内容可见。
2021-03-29 09:56:03

我有一个更好的解决方案,代码最少。

将您的可打印部分放在一个 div 中,其 id 如下所示:

<div id="printableArea">
      <h1>Print me</h1>
</div>

<input type="button" onclick="printDiv('printableArea')" value="print a div!" />

然后添加一个类似 onclick 的事件(如上所示),并像我上面那样传递 div 的 id。

现在让我们创建一个非常简单的 javascript:

function printDiv(divName) {
     var printContents = document.getElementById(divName).innerHTML;
     var originalContents = document.body.innerHTML;

     document.body.innerHTML = printContents;

     window.print();

     document.body.innerHTML = originalContents;
}

注意到这有多简单了吗?没有弹出窗口,没有新窗口,没有疯狂的样式,没有像 jquery 这样的 JS 库。真正复杂的解决方案(答案并不复杂,也不是我所指的)的问题在于它永远不会在所有浏览器上进行翻译,永远!如果要使样式不同,请通过将媒体属性添加到样式表链接 (media="print") 来执行已检查答案中所示的操作。

没有绒毛,重量轻,它只是工作。

遗憾的是,如果您关闭打印预览窗口然后尝试执行 jQuery ,则在 Chrome 中效果不佳.click很遗憾,因为代码太轻了。
2021-03-22 09:56:03
@BorisGappov 一个非常简单的例子,只需一个点击事件就可以证明我的观点:jsfiddle.net/dc7voLzt我再说一遍:这不是一团糟的代码!问题不在于打印本身,而在于恢复原始页面!
2021-03-25 09:56:03
@Kevin 我试过这个表格,但它打印空表格(没有数据),我需要在提交之前打印一个填写好的表格
2021-03-26 09:56:03
此解决方案不适用于可打印区域中的元素取决于父元素的样式和/或位置的任何复杂页面。如果您提取可打印的 div,它可能看起来完全不同,因为现在所有的父母都不见了。
2021-04-02 09:56:03
@asprin 警告!这不是乱码。对于简单的页面,使用 innerHTML 擦除然后重新创建整个主体是好的,但使用更高级的自定义(菜单、幻灯片等)可能会删除其他脚本添加的一些动态行为。
2021-04-06 09:56:03

到目前为止,所有答案都有很大的缺陷——它们要么涉及添加class="noprint"所有内容,要么会display#printable.

我认为最好的解决方案是围绕不可打印的东西创建一个包装器:

<head>
    <style type="text/css">

    #printable { display: none; }

    @media print
    {
        #non-printable { display: none; }
        #printable { display: block; }
    }
    </style>
</head>
<body>
    <div id="non-printable">
        Your normal page contents
    </div>

    <div id="printable">
        Printer version
    </div>
</body>

当然这并不完美,因为它涉及在 HTML 中移动一些东西......

我在这个线程的较低处做了一个非常简单的解决方案,我认为它会更好地满足提问者的需求。它不依赖于打印样式表,可以在您的整个网站上循环使用,并且非常轻巧。
2021-03-11 09:56:03
我使用 Javascript 来获取所需的内容和上面的 CSS
2021-03-19 09:56:03
我认为你是对的,但是我如何取消围绕 div 的表格的样式(如果可以删除样式 - 我可以打印表格并很容易地排除其余内容)
2021-04-06 09:56:03
同意 Bennett,使用可见性而不是显示是一个更干净的解决方案
2021-04-06 09:56:03
我更喜欢使用语义 HTML。打印格式最好由 CSS 处理。请参阅我的答案以了解如何执行此操作:stackoverflow.com/questions/468881/...
2021-04-09 09:56:03

使用 jQuery 就这么简单:

w=window.open();
w.document.write($('.report_left_inner').html());
w.print();
w.close();
我在打印时丢失了 css,有什么办法可以维护 css?
2021-03-10 09:56:03
诀窍是在用户生成的事件(例如鼠标单击)上调用它。您还可以在第一行之后添加: if(!w)alert('请启用弹出窗口');
2021-03-13 09:56:03
有没有人在 IE11 上使用过这个?它只是打开一个窗口,然后立即关闭它。可在 Chrome、FF 和 safari 中使用。
2021-03-16 09:56:03
这非常酷,尽管它在 Chrome 中显示为一个被阻止的弹出窗口。
2021-03-26 09:56:03
@MoxetKhan,这篇文章有一个使用 css vevlo.com/how-to-print-div-content-using-javascript的解决方案
2021-03-31 09:56:03

您可以使用打印样式表,并使用 CSS 来安排您想要打印的内容吗?阅读这篇文章以获取更多指示。

我确实有一个带有样式的表格,包含有问题的 div,如果我将表格设置为 display:none - 我还能显示 div 吗?
2021-03-10 09:56:03
我确实有一个打印样式表 - 试图避免在所有其他内容中放置样式规则......
2021-03-15 09:56:03
如果表格未显示,即使 div 设置为“display: awesome;”也没关系。父母是隐藏的,孩子也是如此。这是您需要表格的情况还是仅用于页面布局?
2021-03-26 09:56:03
我认为是的,您可以尝试将规则标记为 !important 以提升它!
2021-04-04 09:56:03
“轰,爆头!” 通过表格布局。=|
2021-04-06 09:56:03