近期着手項目任務的打印功能,在此做個記錄,本文介紹基於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屬性,該屬性只對塊級元素有效。