React实现浏览器打印指定内容

近期着手项目任务的打印功能,在此做个记录,本文介绍基于React的一种调用浏览器打印页面指定内容的方法。javascript

总体思路: 经过构建一个隐藏的元素(该元素包裹需打印的内容),当打印行为触发时,将页面其余的一些不须要打印的元素隐藏,而后将需打印的元素追加到body中,打印完成后,再恢复初始状态便可。浏览器打印的本质仍是将web页面中的元素打印出来而已。css

1. 构建待打印元素

在页面中构建一个display为none的元素,里面的内容为你须要打印的内容。咱们还须要设置包裹打印内容的元素的ref属性,以便于后面获取到元素。html

<div style={{ display: 'none' }}>
    <div ref={el => (this.printRef = el)}>
	{ 打印内容 }
    </div>
</div>
复制代码

2. 打印动做触发时的处理

处理流程:java

  1. 获取待打印元素;
  2. 将根元素隐藏;
  3. 将待打印元素追加到body中;
  4. 调用浏览器的打印预览;
  5. 预览界面关闭后,将待打印元素从body中移除,将原始页面恢复。
let printView = this.state.printRef  //获取待打印元素
document.querySelector('#root').className = 'print-hide'  //将根元素隐藏
document.body.appendChild(printView) //将待打印元素追加到body中
window.print() //调用浏览器的打印预览
document.body.removeChild(printView) //将待打印元素从body中移除
document.querySelector('#root').className = '' //将原始页面恢复
复制代码

对应的CSS设置:web

@page {
    size: A4;
    margin: 0;
}

@media print {
    html, body {
        min-width: 0;
        width: 210mm; 
        height: 297mm;
    }
    .print-hide {
        visibility: hidden!important;
        display: none!important;
    }
}
复制代码

其中,@page中的size能够本身设置纸张的大小,若是是A4纸能够直接设置值为A4,媒体查询@media print中设置的是打印时的样式,由于打印设备知道其输出区域的物理大小,因此使用厘米(cm)、毫米(mm)、英寸(in)等做为打印设计的单位彻底可行。浏览器

3. 注意点

  1. 第二小节的步骤2中的意思是:将页面中全部不须要打印的元素隐藏,特别注意像模态窗Model这些元素,也要为它们加上'print-hide'className属性。
  2. 若是须要在特定位置强制分页打印,能够尝试在对应元素上设置page-break-before:always !importantpage-break-after:always !importantCSS属性,该属性只对块级元素有效。
  3. 进入打印预览后,咱们没法获知用户最终是选择了打印,仍是选择了取消。这里如有人知道解决方法的话,欢迎留言。
    web打印选项
相关文章
相关标签/搜索