如何使用 HTML5 的picture元素處理響應式圖片
來自: http://www.w3cplus.com/html5/quick-tip-how-to-use-html5-picture-for-responsive-images.html
圖片在響應式網頁設計中是出了名的最具挑戰性的方面之一。今天我們就來看看如何使用 <picture> 元素來處理響應式圖片.
讓我們先了解一下問題
固定寬度,像素完美的網站設計已經離我們遠去了。在寬屏顯示器,互聯網電視,多尺寸的平板電腦和智能手機的今天,我們的設計必須應付一切可能,將寬由 320px 向 7680px 轉變。
伴隨這種多分辨率風景而至的,是需要拉伸或收縮圖像,以適應這些不同的要求。這可以被理解為如下問題,矢量圖形出現異常時,絕大多數具有特定像素的圖像寬度并不改變。
所以,我們應該怎么做呢?
目前最常見的解決方案
作為一般規則,你會在任何響應式網站中發現以下CSS樣式:
img { max-width: 100%; height: auto; }
此代碼使用 max-width:100% 的設置,以確保圖像永遠不會超越其父容器的寬度。如果父容器的寬度收縮小于圖像的寬度,圖像將隨之縮小。 height:auto 的設置可以確保當有這種情況發生時,圖像將以自身的寬高比保留。
這解決了一方面的問題,使我們能夠在許多不同的情況下顯示相同的圖像。不過,這并不能讓我們對不同的情況指定不同的圖像。
新的解決方案: <picture>
<picture> 是HTML5一個新的元素。
如果 <picture> 元素與當前的 <audio> 和 <video> 元素協同合作將大大增強響應式圖像的工作進程。它允許你放置多個 source 標簽,以指定不同的圖像文件名,進而根據不同的條件進行加載。
它可以讓你根據以下條件加載完全不同的圖像:
- 媒體特性結果如:視口的當前高度(viewport height),寬度(width),方向(orientation)。
- 像素密度
反過來這也意味著您可以:
- 加載適當大小圖像的文件,使可用帶寬得到充分利用。
- 加載不同裁剪并具有不同縱橫比的圖像,以適合于不同寬度的布局變化。
- 加載更高的像素密度,顯示更高分辨率的圖像。
<picture> 的工作原理
<picture> 基本工作步驟如下:
- 創建 <picture></picture> 標簽。
- 在這些標簽內創建一個你想用來執行任何一個特性的 <source> 元素。
- 添加一個 media 屬性,用來包含你想要的特性,如視口的當前高度(viewport height),寬度( width ),方向(orientation)等。
- 添加一個 srcset 屬性與相應的圖像文件名相匹配,進行加載。如果你想提供不同的像素密度,例如Retina顯示屏,你可以添加額外的文件名到你的 srcset 屬性中,
- 添加一個回退的 <img> 元素。
這里有一個簡單的基本的例子,用來檢查視口是否小于 768px ,如果小于的話就加載一個較小的圖像:
<picture> <source srcset="smaller.jpg" media="(max-width: 768px)"> <source srcset="default.jpg"> <img srcset="default.jpg" alt="My default image"> </picture>
你可能會注意到,在 media 屬性使用的語法與創建CSS媒體特性中使用的語法一樣。您可以使用相同的特性,這意味著你可以查詢 max-width , min-width , max-height , min-height , orientation 等屬性。
同時,您也可以使用這些特性判斷設備的方向,從而加載橫向或縱向版本的圖像,同時您也可以進行大小特性的混合。例如:
<picture> <source srcset="smaller_landscape.jpg" media="(max-width: 40em) and (orientation: landscape)"> <source srcset="smaller_portrait.jpg" media="(max-width: 40em) and (orientation: portrait)"> <source srcset="default_landscape.jpg" media="(min-width: 40em) and (orientation: landscape)"> <source srcset="default_portrait.jpg" media="(min-width: 40em) and (orientation: portrait)"> <img srcset="default_landscape.jpg" alt="My default image"> </picture>
上面的代碼實現了可以在一個小的景觀設備上加載小的,景觀裁剪圖像的版本。在大的景觀設備上加載大的相同的圖像版本。
這樣,在小尺寸的小型設備上,或在大尺寸的大型設備上,該設備可以自主進行圖像主導從而加載不同圖像剪裁的版本。
如果您想為更高密度的顯示器提供不同分辨率的圖像版本,可以通過在 srcset 屬性中添加額外的文件名來實現。例如,讓我們來看看屏幕像素密度為 2x 的Retina 代碼處理片斷:
<picture> <source srcset="smaller.jpg, smaller_retina.jpg 2x" media="(max-width: 768px)"> <source srcset="default.jpg, default_retina.jpg 2x"> <img srcset="default.jpg, default_retina.jpg 2x" alt="My default image"> </picture>
<picture> 元素現在的使用情況
現在,Chrome,Firefox和Opera瀏覽器都已經實現了對 <picture> 元素的支持。在不久的將來,在其他瀏覽器也將得到廣泛的支持。但現在這一時刻還沒有來臨。
與此同時,如果你現在就想使用 <picture> 元素可能還需要等待。你也可以使用 Picturefill2.0 ; Filament 成員 提供的一個polyfill。
通過下載并添加 picturefill.js 文件到您項目的頭部就可以實現:
<script src="picturefill.js"></script>
還有你可以通過異步加載腳本來增加效率,你可以參考 Picturefill的文檔 。
有了這個腳本加載,除了少數的限制, <picture> 元素將如我所講的運行。
Picturefill的限制
IE9
Picturefill在其他的IE版本都可以正常工作,但是IE9卻不能識別被包裹在 picture 標簽中的 source 元素。為了解決這個問題,在 video 標簽內包住你的源元素,這就會使他們在IE9中被識別,例如:
<picture> <!--[if IE 9]><video style="display: none;"><![endif]--> <source srcset="smaller.jpg" media="(max-width: 768px)"> <source srcset="default.jpg"> <!--[if IE 9]></video><![endif]--> <img srcset="default.jpg" alt="My default image"> </picture>
Android 2.3
和IE9一樣,Android 2.3識別不了在 picture 元素中 source 元素。然而,在使用常規的 img 標簽時,它就可以識別 srcset 屬性。為了避免在Android 2.3及任何有相同問題的其他瀏覽器中出現此問題,確保在 srcset 屬性中存在默認用于回退的 img 元素的文件名。
需要JavaScript和本地媒體特性的支持
有了這個基于JavaScript的解決方案,因此在瀏覽器中需要支持JavaScript。 Picturefill 2.0不提供“no-js”的解決方法,因為如果這樣,當原生瀏覽器支持 <picture> 元素時,將會出現多個圖像。但是,如果“no-js”是你的不二選擇,你必須使用Picturefill 1.2。
Picturefill另外一個要求就是需要本地媒體特性的支持,從而使 media 屬性中的特性能夠正常工作。所有現代瀏覽器都支持媒體特性,IE8和以及更低版本的瀏覽器是剩下的唯一不支持的 用戶群 。
可能存在的額外HTTP請求
在原生支持 srcset 元素,但不支持 picture 元素的瀏覽器中,和回退的 img 元素中指定的文件名可能會被提前調用,從而會在 source 元素中確定一個更好的擬合圖片。
這只是一個暫時的問題,一旦本地支持 picture 元素就會自行消失。
更多信息
- 了解更多關于Picturefill 2.0的信息并在 Picturefill網站上 下載下來用于您的項目上。
- 從 responsiveimages.org 獲取關于 <picture> 元素的信息。
今天在您的項目中就嘗試使用 <picture> 元素,看看是否實現了預期功能!
本文根據 @Kezz Bracey 的《 Quick Tip: How to Use HTML5 “picture” for Responsive Images 》所譯,整個譯文帶有我們自己的理解與思想,如果譯得不好或有不對之處還請同行朋友指點。如需轉載此譯文,需注明英文出處: http://webdesign.tutsplus.com/tutorials/quick-tip-how-to-use-html5-picture-for-responsive-images--cms-21015 。

靜子
在校學生,本科計算機專業。一個積極進取、愛笑的女生,熱愛前端,喜歡與人交流分享。想要通過自己的努力做到心中的那個自己。微博:@靜-如秋葉
</div> </div>