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

Posted

技术标签:

【中文标题】只打印 <div id="printarea"></div>?【英文标题】:Print <div id="printarea"></div> only? 【发布时间】:2010-10-02 21:41:41 【问题描述】:

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

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

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

【问题讨论】:

***.com/questions/2255291/…这个链接完美 【参考方案1】:

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

@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 移动到左上角以便正确打印。

【讨论】:

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

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

将您的可打印部分放置在具有如下 id 的 div 中:

<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 属性添加到样式表链接(media="print")。

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

【讨论】:

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

到目前为止,所有答案都存在相当大的缺陷 - 它们要么涉及将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 中移动一些东西...

【讨论】:

我认为你是对的,但是我如何杀死围绕 div 的表格的样式(如果可以删除样式 - 我可以打印表格并完全排除其余内容轻松 我使用 Javascript 来获取所需的内容和上面的 CSS 我更喜欢使用语义 HTML。理想情况下,打印格式应由 CSS 处理。请参阅我的答案以了解如何执行此操作:***.com/questions/468881/… 同意 Bennett 的观点,使用可见性而不是显示是一种更简洁的解决方案 我在这个线程的较低位置做了一个非常简单的解决方案,我认为它会更好地满足提问者的需求。它不依赖于打印样式表,可以在您的整个网站上回收,并且非常轻巧。【参考方案4】:

使用 jQuery 就这么简单:

w=window.open();
w.document.write($('.report_left_inner').html());
w.print();
w.close();

【讨论】:

这很酷,尽管它在 Chrome 中显示为被阻止的弹出窗口。 诀窍是在用户生成的事件(例如鼠标单击)上调用它。您也可以在第一行之后添加:if(!w)alert('Please enable pop-ups'); 有没有人在 IE11 上进行过这项工作?它只是打开一个窗口,然后立即关闭它。可在 Chrome、FF 和 safari 中使用。 我用这个打印时丢失了css,有什么办法可以维护css吗? @MoxetKhan,这篇文章有一个css解决方案vevlo.com/how-to-print-div-content-using-javascript【参考方案5】:

您可以使用print stylesheet,并使用 CSS 来安排您想要打印的内容吗? Read this article 获取更多指针。

【讨论】:

我确实有一个打印样式表 - 试图避免在所有其他内容中添加样式规则... 我确实有一个带有样式的表格,包含有问题的 div,如果我将表格设置为 display:none - 我还能显示 div 吗? 我认为是的,您可以尝试将规则标记为 !important 以提升它! 如果表格没有显示,即使 div 设置为 'display: awesome;' 也没关系。父母是隐藏的,孩子也是如此。这是您需要表格的情况还是仅用于页面布局? “轰隆隆,爆头!”按表格布局。 =|【参考方案6】:

作为一个整体,我真的不喜欢这些答案中的任何一个。如果您有一个类(例如 printableArea)并将其作为 body 的直接子级,那么您可以在您的打印 CSS 中执行类似的操作:

body > *:not(.printableArea) 
    display: none;


//Not needed if already showing
body > .printableArea 
    display: block;

对于那些在其他地方寻找 printableArea 的人,您需要确保显示 printableArea 的父项:

body > *:not(.parentDiv),
.parentDiv > *:not(.printableArea) 
    display: none;


//Not needed if already showing
body > .printableArea 
    display: block;

使用可见性会导致很多间距问题和空白页。这是因为可见性保持元素空间,只是使其隐藏,而显示将其移除并允许其他元素占用其空间。

此解决方案有效的原因是您没有抓取所有元素,只是抓取 body 的直接子元素并隐藏它们。下面使用显示 css 的其他解决方案,隐藏所有元素,这会影响 printableArea 内容中的所有内容。

我不建议使用 javascript,因为您需要有一个用户单击的打印按钮,而标准浏览器打印按钮不会产生相同的效果。如果你真的需要这样做,我会做的是存储正文的 html,删除所有不需要的元素,打印,然后将 html 添加回来。如前所述,如果可以的话,我会避免这种情况,并使用上面的 CSS 选项。

注意:您可以使用内联样式将任何 CSS 添加到打印 CSS 中:

<style type="text/css">
@media print 
   //styles here

</style>

或者像我通常使用的是链接标签:

<link rel="stylesheet" type="text/css" media="print" href="print.css" />

【讨论】:

如果您要打印的 div 不是“body 的直接子代”怎么办?我正在尝试在 vue.js 中执行此操作。但是在使用接受的答案时,我得到了很多空白页。 @svenema,你可以使用任何你想要的 CSS。这只是一个例子。 嗯,仍然,当我尝试这个时,确实没有额外的空白页,但 printableArea div 也没有显示;使用此代码时,我只有 1 个空白页。 我发现这确实是因为 printableArea div 不是 body 标签的直接子元素,当我将其设为直接子元素时,您的解决方案有效;但是,就我而言,我不能将 printableArea 设为直接子级。有没有办法解决这个问题? still.. 当 printableArea div not 是 body 标记的直接子级时,我只会得到一个空白页。您能否发布一个完整的示例?【参考方案7】:

    给任何你想打印的元素,id为printMe

    在你的 head 标签中包含这个脚本:

    <script language="javascript">
        var gAutoPrint = true;
    
        function processPrint()
    
        if (document.getElementById != null)
        var html = '<HTML>\n<HEAD>\n';
        if (document.getElementsByTagName != null)
        var headTags = document.getElementsByTagName("head");
        if (headTags.length > 0) html += headTags[0].innerHTML;
        
    
        html += '\n</HE' + 'AD>\n<BODY>\n';
        var printReadyElem = document.getElementById("printMe");
    
        if (printReadyElem != null) html += printReadyElem.innerHTML;
        else
        alert("Error, no contents.");
        return;
        
    
        html += '\n</BO' + 'DY>\n</HT' + 'ML>';
        var printWin = window.open("","processPrint");
        printWin.document.open();
        printWin.document.write(html);
        printWin.document.close();
    
        if (gAutoPrint) printWin.print();
         else alert("Browser not supported.");
    
        
    </script>
    

    调用函数

    <a href="javascript:void(processPrint());">Print</a>
    

【讨论】:

这是一份好工作。但是太复杂了,无法跨浏览器正常工作(尤其是旧浏览器)。我建议你看看下面我的解决方案。【参考方案8】:

第 1 步:在 head 标签中编写以下 javascript

<script language="javascript">
function PrintMe(DivID) 
var disp_setting="toolbar=yes,location=no,";
disp_setting+="directories=yes,menubar=yes,";
disp_setting+="scrollbars=yes,width=650, height=600, left=100, top=25";
   var content_vlue = document.getElementById(DivID).innerHTML;
   var docprint=window.open("","",disp_setting);
   docprint.document.open();
   docprint.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"');
   docprint.document.write('"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
   docprint.document.write('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">');
   docprint.document.write('<head><title>My Title</title>');
   docprint.document.write('<style type="text/css">body margin:0px;');
   docprint.document.write('font-family:verdana,Arial;color:#000;');
   docprint.document.write('font-family:Verdana, Geneva, sans-serif; font-size:12px;');
   docprint.document.write('acolor:#000;text-decoration:none; </style>');
   docprint.document.write('</head><body onLoad="self.print()"><center>');
   docprint.document.write(content_vlue);
   docprint.document.write('</center></body></html>');
   docprint.document.close();
   docprint.focus();

</script>

第 2 步:通过 onclick 事件调用 PrintMe('DivID') 函数。

<input type="button" name="btnprint" value="Print" onclick="PrintMe('divid')"/>
<div id="divid">
here is some text to print inside this div with an id 'divid'
</div>

【讨论】:

就是这个!将它用于模态和画廊。关闭后没有 Javascript 错误。真的很有帮助,尤其是当您使用超过一页的模式时。很好地把它包起来。非常适合想要打印存储的人。 感谢@TheWeeezel【参考方案9】:
<script type="text/javascript">
   function printDiv(divId) 
       var printContents = document.getElementById(divId).innerHTML;
       var originalContents = document.body.innerHTML;
       document.body.innerHTML = "<html><head><title></title></head><body>" + printContents + "</body>";
       window.print();
       document.body.innerHTML = originalContents;
   
</script>

【讨论】:

看起来不错,但打印后您会丢失所有 javascript 绑定和其他内容 它是在没有 css 的情况下打印的。【参考方案10】:

hm ...使用样式表的类型进行打印...例如:

<link rel="stylesheet" type="text/css" href="print.css" media="print" />

print.css:

div  display: none; 
#yourdiv  display: block; 

【讨论】:

如果文档不是基于 DIV 或 #yourdiv 还包含更多 DIV,则此方法无效。 #yourdiv * display: ... 如果您将其放在页面顶部并拥有最新的浏览器,您可以使用更多选择器来隐藏非 div 跨度> "#yourdiv * display: ... " - 在不破坏布局的情况下 ... 应该是什么? 这会将内联元素也显示为块元素。但是“#yourdiv, #yourdiv div display:block ”会做到这一点。 @dittodhole - 想一想。您可以在其中放置什么不会破坏#yourdiv 中的布局?【参考方案11】:

打印特定 Div 或任何元素的最佳方式

printDiv("myDiv");

function printDiv(id)
        var printContents = document.getElementById(id).innerHTML;
        var originalContents = document.body.innerHTML;
        document.body.innerHTML = printContents;
        window.print();
        document.body.innerHTML = originalContents;

【讨论】:

【参考方案12】:

printDiv(divId):在任何页面上打印任何 div 的通用解决方案。

我遇到了类似的问题,但我希望 (a) 能够打印整个页面,或者 (b) 打印几个特定区域中的任何一个。我的解决方案,多亏了上面的大部分内容,允许您指定要打印的任何 div 对象。

此解决方案的关键是向打印媒体样式表添加适当的规则,以便打印请求的 div(及其内容)。

首先,创建所需的打印 css 来抑制所有内容(但没有特定规则来允许您要打印的元素)。

<style type="text/css" media="print">
   body visibility:hidden; 
   .noprintarea visibility:hidden; display:none
   .noprintcontent  visibility:hidden; 
   .print  visibility:visible; display:block; 
</style>

注意我添加了新的类规则:

noprintarea 允许您禁止打印 div 中的元素 - 内容和块。 noprintcontent 允许您禁止打印 div 中的元素 - 内容被禁止但分配的区域为空。 print 允许您拥有显示在打印版本中的项目,但 不在屏幕页面上。这些屏幕样式通常具有“display:none”。

然后插入三个 JavaScript 函数。第一个只是打开和关闭打印媒体样式表。

function disableSheet(thisSheet,setDisabled)
 document.styleSheets[thisSheet].disabled=setDisabled;    

第二个做真正的工作,第三个在之后清理。第二个 (printDiv) 激活打印媒体样式表,然后附加一个新规则以允许打印所需的 div,发出打印,然后在最终内务处理之前添加延迟(否则可以在打印实际之前重置样式完成。)

function printDiv(divId)

  //  Enable the print CSS: (this temporarily disables being able to print the whole page)
  disableSheet(0,false);
  //  Get the print style sheet and add a new rule for this div
  var sheetObj=document.styleSheets[0];  
  var showDivCSS="visibility:visible;display:block;position:absolute;top:30px;left:30px;";
  if (sheetObj.rules)  sheetObj.addRule("#"+divId,showDivCSS); 
  else                 sheetObj.insertRule("#"+divId+""+showDivCSS+"",sheetObj.cssRules.length); 
  print();
  //  need a brief delay or the whole page will print
  setTimeout("printDivRestore()",100);  

最后的函数删除添加的规则并再次将打印样式设置为禁用,以便可以打印整个页面。

function printDivRestore()

  // remove the div-specific rule
  var sheetObj=document.styleSheets[0];  
  if (sheetObj.rules)  sheetObj.removeRule(sheetObj.rules.length-1); 
  else                 sheetObj.deleteRule(sheetObj.cssRules.length-1); 
  //  and re-enable whole page printing
  disableSheet(0,true);

唯一要做的另一件事是在您的 onload 处理中添加一行,以便最初禁用打印样式,从而允许整页打印。

<body onLoad='disableSheet(0,true)'>

然后,您可以从文档中的任何位置打印 div。只需从按钮或其他任何地方发出 printDiv("thedivid") 。

这种方法的一大优点是它提供了一个通用的解决方案,可以从页面中打印选定的内容。它还允许对打印的元素使用现有样式 - 包括包含 div。

注意:在我的实现中,这必须是第一个样式表。如果您需要稍后在图纸序列中进行,请将图纸参考 (0) 更改为适当的图纸编号。

【讨论】:

【参考方案13】:

使用 CSS 3,您可以使用以下内容:

body *:not(#printarea) 
    display: none;

【讨论】:

恐怕不能使用...(如果错了请纠正我)我正在处理的页面是 asp.net 1.1 / DHTML :not() 选择器是否已经可用取决于浏览器。 那么我的建议只是展望未来……不,说真的。为了完整起见,我只是提到了它。我知道现在不可行。不幸的是。 你可以使用 jQuery 和这个(我认为)可以在 IE6 中工作的选择器 - $('body *:not(#printarea)').style('display', 'none'); 这将隐藏#printarea 的所有后代,因为它们由*:not(#printarea) 匹配。所以基本上你会得到一个空容器。【参考方案14】:

我使用 JavaScript 获取内容并创建了一个可以打印的窗口...

【讨论】:

可以分享一下代码吗,有css的问题【参考方案15】:

Sandro 的方法效果很好。

我对其进行了调整以允许多个 printMe 链接,特别是用于标签页和扩展文本。

function processPrint(printMe)

var printReadyElem = document.getElementById(printMe);

&lt;a href="javascript:void(processPrint('divID'));"&gt;Print&lt;/a&gt;

【讨论】:

【参考方案16】:

@凯文佛罗里达 如果你有多个具有相同类的 div,你可以这样使用它:

 <div style="display:none">
   <div id="modal-2" class="printableArea">
     <input type="button" class="printdiv-btn" value="print a div!" />
   </div>
 </div>

我使用的是 Colorbox 内部内容类型

$(document).on('click', '.printdiv-btn', function(e) 
    e.preventDefault();

    var $this = $(this);
    var originalContent = $('body').html();
    var printArea = $this.parents('.printableArea').html();

    $('body').html(printArea);
    window.print();
    $('body').html(originalContent);
);

【讨论】:

【参考方案17】:

就我而言,我必须在页面内打印图像。当我使用投票的解决方案时,我有 1 个空白页和另一个显示图像的页面。希望它会对某人有所帮助。

这是我使用的css:

@media print 
  body * 
    visibility: hidden;
  

  #not-print * 
    display: none;
  

  #to-print, #to-print * 
    visibility: visible;
  

  #to-print 
    display: block !important;
    position: absolute;
    left: 0;
    top: 0;
    width: auto;
    height: 99%;
  

我的html是:

<div id="not-print" >
  <header class="row wrapper page-heading">

  </header>

  <div class="wrapper wrapper-content">
    <%= image_tag @qrcode.image_url,  size: "250x250" , alt: "#@qrcode.name" %>
  </div>
</div>

<div id="to-print" style="display: none;">
  <%= image_tag @qrcode.image_url,  size: "300x300" , alt: "#@qrcode.name" %>
</div>

【讨论】:

【参考方案18】:

在不影响当前页面的情况下,它还可以在打印时保留 css。这里的选择器必须是特定的div选择器,我们需要打印哪些内容。

printWindow(selector, title) 
   var divContents = $(selector).html();
   var $cssLink = $('link');
   var printWindow = window.open('', '', 'height=' + window.outerHeight * 0.6 + ', width=' + window.outerWidth  * 0.6);
   printWindow.document.write('<html><head><h2><b><title>' + title + '</title></b></h2>');
   for(var i = 0; i<$cssLink.length; i++) 
    printWindow.document.write($cssLink[i].outerHTML);
   
   printWindow.document.write('</head><body >');
   printWindow.document.write(divContents);
   printWindow.document.write('</body></html>');
   printWindow.document.close();
   printWindow.onload = function () 
            printWindow.focus();
            setTimeout( function () 
                printWindow.print();
                printWindow.close();
            , 100);  
        

这里提供了一些超时显示外部 css 被应用到它。

【讨论】:

CSS 有时需要一些时间来加载,这种方法是我希望在打印之前重新加载页面的方法。谢谢【参考方案19】:

适合空间空白高度的最佳 css:

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

【讨论】:

【参考方案20】:

没有 CSS 小丑,带有 iframe 的 html 和纯 javascript 工作得最好。然后只需单击要打印的文本。带有文本内容的 id 元素的当前示例;

html 正文:

<div id="monitor" onclick="idElementPrint()">text i want to print</div>

纯javascript:

//or: monitor.textContent = "click me to print textual content";

const idElementPrint = () => 
    let ifram = document.createElement("iframe");
    ifram.style = "display:none";
    document.body.appendChild(ifram);
    pri = ifram.contentWindow;
    pri.document.open();
    pri.document.write(monitor.textContent);
    pri.document.close();
    pri.focus();
    pri.print();
    

【讨论】:

【参考方案21】:

如果只想打印这个div,必须使用指令:

@media print
    *display:none;
    #mydivdisplay:block;

【讨论】:

【参考方案22】:

printDiv() 函数出现了几次,但在这种情况下,您失去了所有绑定元素和输入值。所以,我的解决方案是为所有内容创建一个名为“body_allin”的 div,并在第一个之外创建一个名为“body_print”的 div。

然后你调用这个函数:

function printDiv(divName)

    var printContents = document.getElementById(divName).innerHTML;

    document.getElementById("body_print").innerHTML = printContents;

    document.getElementById("body_allin").style.display = "none";
    document.getElementById("body_print").style.display = "";

    window.print();

    document.getElementById("body_print").innerHTML = "";
    document.getElementById("body_allin").style.display = "";
    document.getElementById("body_print").style.display = "none";


【讨论】:

如果您想要唯一的 id,此行可能很有用: printContents = printContents.replace(/id=("|')(.*?)("|')/g, 'id=$1 $2_2$3');【参考方案23】:

您可以使用单独的 CSS 样式来禁用除 ID 为“printarea”的内容之外的所有其他内容。

请参阅CSS Design: Going to Print 了解更多说明和示例。

【讨论】:

更新了指向新位置的链接。发表评论而不是投反对票会很好。【参考方案24】:

我尝试了许多提供的解决方案,但没有一个能完美运行。他们要么失去 CSS 或 JavaScript 绑定。我找到了一个既不会丢失 CSS 也不会丢失 JavaScript 绑定的完美且简单的解决方案。

HTML:

<div id='printarea'>
    <p>This is a sample text for printing purpose.</p>
    <input type='button' id='btn' value='Print' onclick='printFunc();'>
</div>
<p>Do not print.</p>

Javascript:

function printFunc() 
    var divToPrint = document.getElementById('printarea');
    var htmlToPrint = '' +
        '<style type="text/css">' +
        'table th, table td ' +
        'border:1px solid #000;' +
        'padding;0.5em;' +
        '' +
        '</style>';
    htmlToPrint += divToPrint.outerHTML;
    newWin = window.open("");
    newWin.document.write("<h3 align='center'>Print Page</h3>");
    newWin.document.write(htmlToPrint);
    newWin.print();
    newWin.close();
    

【讨论】:

此打开和创建另一个在 android 上不起作用的窗口。只有直接的 window.print() 有效。【参考方案25】:

我参加这个聚会很晚了,但我想用另一种方法加入。我编写了一个名为 PrintElements 的小型 JavaScript 模块,用于动态打印网页的某些部分。

它通过迭代选定的节点元素来工作,对于每个节点,它会向上遍历 DOM 树直到 BODY 元素。在每个级别,包括初始级别(即要打印的节点的级别),它都将标记类(pe-preserve-print)附加到当前节点。然后将另一个标记类 (pe-no-print) 附加到当前节点的所有兄弟姐妹,但前提是它们上没有 pe-preserve-print 类。作为第三幕,它还将另一个类附加到保留的祖先元素pe-preserve-ancestor

一个非常简单的补充打印 CSS 将隐藏和显示相应的元素。这种方法的一些好处是保留了所有样式,它不会打开新窗口,不需要移动大量 DOM 元素,而且通常不会侵入您的原始文档。

见demo,或阅读相关文章for further details。

【讨论】:

【参考方案26】:

我找到了解决办法。

@media print 
    .print-area 
        background-color: white;
        height: 100%;
        width: auto;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        z-index:1500;
        visibility: visible;
    
    @page
        size: portrait;
        margin: 1cm;
    
/*IF print-area parent element is position:absolute*/
    .ui-dialog,
    .ui-dialog .ui-dialog-content
        position:unset !important;
        visibility: hidden;
    

【讨论】:

【参考方案27】:
It's better solution. You can use it Angualr/React

HTML

 <div class="row" id="printableId">
      Your html 
    </div>

Javascript

   function printPage()
        
        var printHtml = window.open('', 'PRINT', 'height=400,width=600');
    
        printHtml.document.write('<html><head>');
        printHtml.document.write(document.getElementById("printableId").innerHTML);
        printHtml.document.write('</body></html>');
    
        printHtml.document.close(); 
        printHtml.focus(); = 10*/
    
        printHtml.print();
        printHtml.close();
    
        return true;
    
      

【讨论】:

【参考方案28】:

使用特殊的样式表进行打印

<link rel="stylesheet" href="print.css" type="text/css" media="print" />

然后为每个标签添加一个类,即“noprint”,这是您不想打印的内容。

在CSS中使用

.noprint 
  display: none;

【讨论】:

【参考方案29】:

你可以使用这个: http://vikku.info/codesnippets/javascript/print-div-content-print-only-the-content-of-an-html-element-and-not-the-whole-document/

或将visibility:visiblevisibility:hidden css 属性与@media print 一起使用

'display:none' 将隐藏所有嵌套的 'display:block'。这不是解决方案。

【讨论】:

【参考方案30】:

我有多个图像,每个图像都有一个按钮,需要单击一个按钮来打印每个带有图像的 div。如果我在浏览器中禁用了缓存,并且 Chrome 中的图像大小没有改变,则此解决方案有效:

        function printDiv(divName) 

        var printContents = document.getElementById(divName).innerHTML;
        w = window.open();

        w.document.write(printContents);
        w.document.write('<scr' + 'ipt type="text/javascript">' + 'window.onload = function()  window.print(); window.close(); ;' + '</sc' + 'ript>');

        w.document.close(); // necessary for IE >= 10
        w.focus(); // necessary for IE >= 10

        return true;
    

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

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

【讨论】:

以上是关于只打印 <div id="printarea"></div>?的主要内容,如果未能解决你的问题,请参考以下文章

有只显示年和月的javascript时间控件吗

js得到的数据如何打印出来

vue 解决打印预览格式错乱

按纽触发打印事件 JS怎么写

vue v-print-nb 打印

JQuery怎么遍历指定id的div的name值