近期着手项目任务的打印功能,在此做个记录,本文介绍基于React的一种调用浏览器打印页面指定内容的方法。javascript
总体思路: 经过构建一个隐藏的元素(该元素包裹需打印的内容),当打印行为触发时,将页面其余的一些不须要打印的元素隐藏,而后将需打印的元素追加到body中,打印完成后,再恢复初始状态便可。浏览器打印的本质仍是将web页面中的元素打印出来而已。css
在页面中构建一个display为none
的元素,里面的内容为你须要打印的内容。咱们还须要设置包裹打印内容的元素的ref属性
,以便于后面获取到元素。html
<div style={{ display: 'none' }}>
<div ref={el => (this.printRef = el)}>
{ 打印内容 }
</div>
</div>
复制代码
处理流程:java
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)等做为打印设计的单位彻底可行。浏览器
'print-hide'
className属性。page-break-before:always !important
、page-break-after:always !important
CSS属性,该属性只对块级元素有效。