不經過任何處理而直接列印網站上的頁面會得到一個不理想的效果。
我們WEB開發人員可以簡單採用幾個要點來使之達到較為合適的效果:
- 使用響應式佈局設定列印的效果
- 在合適的時候列印背景圖片和顏色
- 新增顯示的網址或頁面連結,以供參考
- 使用css filter 提高列印的圖形效果
針對列印的樣式,而不是螢幕顯示樣式
首先,我們需要使用媒體查詢(media query)針對列印樣式設定。
1 2 3 |
@media print { } |
重新針對列印寫CSS樣式是沒有必要的,我們只需要針對差異設定列印的樣式覆蓋掉之前的預設樣式。
大多數的瀏覽器會自動根據列印更改顏色,以節省列印原料,但是我們還是儘可能的手工設定一下。
為了達到最佳效果,使顏色清晰明瞭,我們至少需要包含一下基本的列印樣式。
1 |
@media print { body { color: #000; background: #fff; } } |
對於列印,大多數情況下我們不需要列印整個頁面,只需要列印一個簡潔的能夠突出需要資訊的頁面,那麼我們將不相關的部分隱藏掉(如:導航條、背景圖片)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* Default styles */ h1 { color: #fff; background: url(banner.jpg); } @media print { h1 { color: #000; background: none; } nav, aside { display: none; } } |
在編寫列印樣式表的時候,你要注意要使用釐米或者英寸作為單位而不是螢幕畫素單位,實際的單位對列印非常有用。
為了保證列印樣式有用,寫CSS樣式使列印的內容距離紙張邊緣,看起來更好,需要使用 @page 這個語法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@media print { h1 { color: #000; background: none; } nav, aside { display: none; } body, article { width: 100%; margin: 0; padding: 0; } @page { margin: 2cm; } } |
為了保證不被跨頁列印,如一個標題和內容在頁面底部被分開:
1 |
h2, h3 { page-break-after: avoid; } |
另一中情況是要防止圖片過寬而超出紙張邊緣:
1 2 3 |
img { max-width: 100% !important; } |
第三個要點是確保 articles 文章標籤的內容,在新的一頁開始:
1 2 3 |
article { page-break-before: always; } |
最後,還要注意列表和圖片不被分開在不同的頁:
1 2 3 |
ul, img { page-break-inside: avoid; } |
儘管這些還不完美,不過這是一個良好的開始
背景圖片和顏色
對於一些網站,顏色和背景圖還是非常必要需要遵循的。如果使用者是在 webkit 核心瀏覽器上列印的話,我們可以強制印表機列印螢幕上所看到的顏色(即強制在列印頁面上出現任何的背景圖和顏色),一般來說彩色印表機可以做到這點,我們需要一個單獨的媒體查詢:
1 2 3 4 5 6 |
@media print and (color) { * { -webkit-print-color-adjust: exact; print-color-adjust: exact; } } |
遺憾的是,這不能馬上應用於firefox opera 和IE.
擴充套件列印樣式裡的超連結
如果直接列印,超連結將只是一點文字,而不會出現連結的網址,這樣來說,是沒有意義的。
我們可以將url連結展示在列印的頁面上,我們可以使用:after偽類來實現而不影響周圍的元素佈局:
1 2 3 4 5 6 7 8 9 10 |
@media print { article a { font-weight: bolder; text-decoration: none; } article a[href^=http]:after { content:" <" attr(href) "> "; } } |
看下面這是HTML:
1 |
<p>You’ve explored this <a href="/blog">website</a>; now it’s time to <a href="http://www.webplatform.org/">read other Web development documentation</a>.</p> |
下面是顯示的效果:
其中一個問題是,列印頁面上的錨文字和影像連結也將擴大。我們可以很好的用CSS規則修復。
1 2 3 |
article a[href^="#"]:after { content: ""; } |
連結周圍影像是比較麻煩的,理想的情況是影像周圍的連結將有一個class。
1 2 3 |
$a:after > img { content: ""; } |
CSS選擇器實現將很簡單:
1 2 3 |
a:not(:local-link):after { content:" <" attr(href) "> "; } |
所有這些方法都假定使用者將繼續通過手工輸入網址。 一個更好的解決方案是通過提供匹配的QR碼的數字版本的頁面更容易訪問。
列印連結二維碼使之更容易訪問
如下圖:
我們需要使用谷歌 圖形API來實現:
- 我們希望谷歌提供的圖表資訊(
qr
,在我們的例子中); - 呈現大小的的QR印記,以畫素為單位;
- URL進行編碼;
- 使用的字元編碼形式。
通常我們會在頁面頂部的一個標題元素關聯的URL:
1 2 3 4 |
<header> <h1>Lizabeth’s Salon</h1> <h2>Providing Intellectual Stimulation Online Since 2001</h1> </header> |
為了創造預期的列印結果,我們將提供足夠的間距給H1用來放置二維碼,因為這個二維碼需要增加到每個頁面,我們需要增加一條CSS規則:
1 2 3 4 5 6 7 8 |
@media print { header h1:after { content: url(https://chart.googleapis.com/chart?cht=qr&chs=150x150&chl=http://yourdomain.com&choe=UTF-8); position: absolute; right: 0; top: 0; } } |
這個方法的缺點是使開發者每個元素都請求一個API。如果你的主機是PHP,則可以自動生成當前頁面的URL:
1 2 3 4 5 6 7 8 9 10 |
@media print { h1:after { content: url(https://chart.googleapis.com/chart?cht=qr&chs=150x150 &chl=http://<?=$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];?> &choe=UTF-8); position: absolute; right: 0; top: 0; } } |
給wordpress的樣式:
1 2 3 4 5 6 7 8 9 |
@media print { h1:after { content: url(https://chart.googleapis.com/chart?cht=qr&chs=150x150 &chl=http://<?phpthe_permalink();?>&choe=UTF-8); position: absolute; right: 0; top: 0; } } |
使用CSS3 Filter 提高列印的質量
瀏覽器通常會列印出橫幅影像,特別是如果有問題的旗幟在黑暗的背景是白色的:
1 2 3 4 5 6 7 8 9 10 11 12 |
@media print { header { background: none; color: #000; } header img { filter: url(inverse.svg#negative); -webkit-filter: invert(100%); filter: invert(100%); } } |
CSS3的過濾器做什麼,你所期望的 – 在頭影像反色,變成黑白色,反之亦然 – 但它們只能在Chrome和Safari。 為了彌補Firefox,我們需要一種不同的方法 – 相當於過濾器作為一個單獨的SVG檔案寫:
1 2 3 4 5 6 7 8 |
<svg xmlns="http://www.w3.org/2000/svg"> <filter id="negative"> <feColorMatrix values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /> </filter> </svg> |
從理論上講,你可以使用一個CSS sprite 之間進行切換不同版本的列印的標誌,但是這將意味著增加一倍的檔案大小可能沒有什麼好處。 相反,我建議使用CSS過濾器(和SVG當量,為Firefox)的反轉影像之前,列印的頁面: 印刷兩種形式的標誌(即α-蒙面PNG或純黑色背景)的結果是:
總結
由於列印不方便跟蹤,而且缺乏重視。在WEB開發中也往往被忽略,大多數時候我們只閱讀線上的網頁,而不是列印出來。 另一方面即使人們只是偶爾需要列印的東西從網站,這將是理想的,如果頁面設計適合的印表機,就像現代的網站適應各種螢幕尺寸和裝置。 列印的自適應設計,可用性和可訪問性和Web開發的重要組成部分,同樣應考慮的另一個方面。 處理列印自適應設計的另一個方面,我們實現更多的網站使用者的需求-並在同一時間,節省墨水,紙張和其他資源,所有這些都是重要的方面可持續發展的設計 。