感謝 Apple,帶來了 Retina 屏幕的革命,讓咱們能夠在電子顯示屏上享受到印刷級的分辨率。因爲分辨率的提高,網頁中的文字、Flash 和 SVG 內容顯示得比原來更加精細,但網頁中的圖片卻變得異常模糊,存在很是嚴重的分辨率兼容問題。自從 2010年6月,iPhone4 的上市開始,網頁圖片的顯示兼容問題就已出現,通過幾年的發展,配備 Retina 屏幕的電子產品愈來愈多,現在 Apple 又將 Retina 技術應用到了 Macbook Pro 上,網頁圖片在 Retina 屏幕下的顯示兼容已經變得迫在眉睫。javascript
這裏分享幾種兼容方法,供你們參考。css
咱們以一張 300*200px 的照片爲例:html
1 |
<img src="./photo.jpg" style="width:300px;height:200px;" /> |
若是想讓這張圖片在 Retina 屏幕下達到應有的顯示分辨率,只需使用該照片的源文件導出一張清晰的 600*400px 的圖片,咱們將其命名爲 photo@2x.jpg,替換現有的圖片便可:java
1 |
<img src="./photo@2x.jpg" style="width:300px;height:200px;" /> |
換成 @2X 圖片,在 Retina 屏幕下的顯示就清晰多了,可謂細節畢現。不過在普通屏幕下,圖片的顯示須要通過瀏覽器的壓縮,一些老版本瀏覽器如 IE六、7 會顯示得很是失真,同時大尺寸的圖片會佔用更多的帶寬,增長頁面加載的時間,下降用戶體驗。經過 JS 的輔助,可讓圖片在普通屏幕和 Retina 屏幕下作到自動適配:jquery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<img class="photo" src="./photo.jpg" style="width:300px;height:200px;" /> <script type="text/javascript"> $(document).ready(function () { if (window.devicePixelRatio > 1) { var images = $("img.photo"); images.each(function(i) { var x1 = $(this).attr('src'); var x2 = x1.replace(/(.*)(\.\w+)/, "$1@2x$2"); $(this).attr('src', x2); }); } }); </script> |
Retina.js 提供了更加完善的解決方案,自動匹配屏幕分辨率的同時,還能夠檢測服務器上是否存有當前圖片的 @2X 版本,以決定是否替換。
web
優勢:算法
缺點:shell
咱們以一張 logo 的背景圖爲例,首先咱們定義 logo 的尺寸爲 100*40px,而後爲 #logo 設定一個 100*40px 的背景圖片 logo.png,瀏覽器
1 2 3 4 5 |
#logo { width: 100px; height: 40px; background: url(./logo.png) 0 0 no-repeat; } |
接下來經過 Meta Queries 判斷設備的最小顯示像素比,若是大於等於1.5的話,爲 #logo 設定一張 200*80px 的背景圖片 logo@2x.png,而後經過設置 background-size 讓背景圖顯示爲 logo 該有的尺寸。這裏的顯示像素比咱們選擇 1.5 做爲閾值,是爲兼容除蘋果之外的高分辨率設備,好比三星的 Android Pad。服務器
1 2 3 4 5 6 7 8 9 |
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min--moz-device-pixel-ratio: 1.5), /* 注意這裏的寫法比較特殊 */ only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (min-device-pixel-ratio: 1.5) { #logo { background-image: url(./logo@2x.png); background-size: 100px auto; } } |
這樣,對於普通的顯示設備或是不支持 Meta Queries 的瀏覽器,會顯示標準的背景圖,對於支持 Meta Queries 的 Retina 設備,會顯示 @2X 的背景圖。( IE六、七、8 均不支持 Meta Queries 和 background-size )
若是僅是爲了兼容當前的蘋果 Retina 顯示屏,也能夠直接判斷設備的顯示像素比是否等於2:
1 2 3 4 5 6 |
@media only screen and (-webkit-device-pixel-ratio: 2), only screen and (-moz-device-pixel-ratio: 2), only screen and (-o-device-pixel-ratio: 2/1), only screen and (device-pixel-ratio: 2) { ... } |
優勢:
缺點:
咱們一樣以以前的 logo 爲例,實現方式以下:
1 2 3 4 |
#logo { background: url(./logo.png) 0 0 no-repeat; background-image: -webkit-image-set(url(./logo.png) 1x, url(./logo@2x.png) 2x); } |
優勢:
缺點:
最後的這條缺點很致命,期待 W3C 早日將 image-set 寫入標準之中,讓更多的瀏覽器支持這種寫法。
與只能記錄像素信息的位圖相比,矢量圖在不一樣分辨率下的兼容有着先天的優點,目前大多數現代瀏覽器都已經支持基於 XML 的 SVG 格式圖形的顯示,網頁中一些線條簡單的 Logo 、圖標或特殊字形,若是轉成矢量的 SVG 格式來顯示,在 Retina 下的兼容也就搞定了。
製做 SVG 格式圖片,可使用 Adobe Illustrator 或免費的替代軟件 inkscape 。
使用 SVG 格式圖片,能夠像咱們使用其餘格式的圖片同樣,用 HTML 的 <img> 標籤引用,或用 CSS 的 background-image 、 content:url() 屬性,須要注意的是,不管用哪一種形式,最好定義一下圖片的尺寸。
1 |
<img src="example.svg" width="300" height="200" /> |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* Using background-image */ .image { background-image: url(example.svg); background-size: 300px 200px; width: 300px; height: 200px; } /* Using content:url() */ .image-container:before { content: url(example.svg); /* width and height do not work with content:url() */ } |
若是須要兼容 IE六、七、8 或是其餘一些不支持 SVG 的瀏覽器,須要額外用到 PNG 格式的圖片副本(關於 PNG 格式 Alpha 通道的兼容問題這裏不作討論)。
在 HTML 的 <img> 標籤中,增長一個 PNG 格式圖片的自定義屬性
1 |
<img src="example.svg" data-png-fallback="example.png" /> |
而後引入 jQuery 和 Modernizr 判斷當前瀏覽器是否支持 SVG ,不支持的話使用 PNG 替換 SVG 。
1 2 3 4 5 6 7 8 |
$(document).ready(function(){ if(!Modernizr.svg) { var images = $('img[data-png-fallback]'); images.each(function(i) { $(this).attr('src', $(this).data('png-fallback')); }); } }); |
引入 Modernizr ,將 CSS 改寫成如下形式便可:
1 2 3 4 5 6 7 8 9 10 |
.image { background-image: url(example.png); background-size: 30p0x 200px; } .svg { .image { background-image: url(example.svg); } } |
爲了得到最佳的跨瀏覽器兼容效果,避免在 Firefox 和 Opera 下出現光柵問題,製做的 SVG 圖片最小要達到父容器的尺寸。
優勢:
缺點:
Favicon 的 Retina 兼容比較容易,或許你的如今 Favicon 在 Retina 下就已經顯示得很是清晰,若是不是這樣,使用 ico 編輯工具,建立一個包含 16*16 和 32*32 兩種內建圖像的 ico 文件,替換現有的 Favicon 便可,瀏覽器會根據分辨率的大小自動匹配內建圖像的尺寸。
至於 ico 編輯工具,Windows 下推薦使用 IconXP ,Mac 下推薦 Apple’s Icon Composer(Graphic Tools in Xcode中)。
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~