之因此會翻譯這篇文章是由於我昨天看到@勾三股四的這篇微博,裏面推薦的文章就是下面我要翻譯的。由於本身一直對響應式圖片這個技術很關注,可是一直沒有一個很好的總結機會,今天趁着翻譯這篇文章總結了,這是本人翻譯的第一篇文章,有錯誤的地方請指出。html
博客地址 歡迎關注git
原文地址github
最近對responsive image
有一些感悟而後趕忙記下來省得忘了。下面就是個人感悟:web
若是你是用像素來固定圖片尺寸,又想在不一樣屏幕密度屏幕上實現響應式圖片,能夠這樣:瀏覽器
<img width="320" height="213" src="cat.jpg" srcset="cat-2x.jpg 2x,cat-3x.jpg 3x">
它能夠正常運行在全部現代瀏覽器上,並且在不支持srcset
的瀏覽器也能夠降級到src
。安全
有一些規則是上面圖片所沒有提到的:網絡
srcset
裏的每一項都是<url> <density>x
結構 ,就像cat-2x.jpg 2x
框架
srcset
裏項目的順序並不重要佈局
若是你沒有聲明width
/height
,瀏覽器會按照屏幕密度展現它自己原始的width
/height
。 好比2x
資源被匹配到了,它會被渲染成自己的 50%width
和 50%height
post
提示一下,若是在3x
設備像素比的設備上瀏覽器渲染的是1x
的圖片,多是由於糟糕的網絡環境
這個案例使用的是3張同樣的圖片,只是尺寸不同,這樣咱們很難看出區別。因此譯者在這裏換了這幾張圖,而後在Chrome中模擬手機調試,更換分辨率,應該就很明顯了。
這種方法由於要人爲匹配設備像素比,因此
1x
、2x
、3x
、4x
等等,這樣HTML就會太臃腫,因此有了下面的新方法。
不一樣寬度的圖片在響應式站點裏是很常見的。在這篇博客裏,圖片內容都是佔據了文章100%的寬度,可是文章的寬度並不老是窗口寬度的100%。
爲了讓瀏覽器匹配到正確的圖片,咱們須要知道:
不一樣尺寸圖片的地址
每張圖片的寬度
<img>
的寬度
最後一點是特別困難的,由於圖片開始下載是在CSS解析以前的,因此<img>
的寬度不能從頁面佈局那獲得。
<img src="panda-689.jpg" srcset = "panda-689.jpg 689w, panda-1378.jpg 1378w panda-500.jpg 500w panda-1000.jpg 1000w" sizes = " (min-width:1066px) 689px, (min-width:800px) calc(75vw-137px) , (min-width:530px) calc(100vw-96px) , 100vw" >
經過srcset
屬性,瀏覽器知道了哪些圖片可用以及這些圖片的寬度。
經過sizes
屬性,瀏覽器知道了<img>
相對於一個已知寬度窗口的寬度。
這樣,瀏覽器就能夠匹配最佳資源加載了。
你再也不須要說明屏幕密度,瀏覽器本身會辨別。若是瀏覽器窗口寬度是1066px
甚至更大,<img>
會被定爲689px
。在1x
設備瀏覽器上會下載panda-689.jpg
,可是在2x
設備瀏覽器上將會下載panda-1378.jpg
。
這裏感受做者並無解釋清楚
sizes
和srcset
的工做原理(參照下面的譯者案例來看)。首先,是關於
sizes
的理解:
好比當前窗口800px
,那麼sizes
會匹配到(min-width:800px) calc(75vw - 137px)
,則這個<img>
對應的寬度就是800px*0.75-137px=463px
。這個寬度的設定至關於<img src="..." width="463" />知道了
<img>
的width
,而後再看srcset
的w
:
在dpr
爲1
的時候,463px
對應463w
,查找srcset
,找到500w
適合它,就顯示500的這張圖。
在dpr
爲2
的時候,463px
對應926w
,查找srcset
,找到1000w
適合,就顯示1000的這張圖。
一些規則是上面沒有提到的:
srcset
裏的每一項是<url> <width-descriptor>w
,好比panda-689.jpg 689w
srcset
裏每一項的順序沒有影響
若是srcset
包含了一個寬度描述符(w
),則src
會被那些支持srcset
的瀏覽器忽略掉
sizes
裏的每一項是<媒體查詢> <圖片寬度>
形式,除了最後一個僅僅是<圖片寬度>
sizes
裏的寬度單位都是px
瀏覽器使用sizes
裏的第一個匹配到的媒體查詢,因此sizes
裏的順序是很重要的
和上面同樣,瀏覽器下載一個低分辨率圖片多是由於糟糕的網絡
若是你沒有指明<img>
的寬度,瀏覽器也會正常解析。對sizes
精確設置,可是一個不是很確切的寬度也很好。好比
sizes="(min-width:1066px) 689px , (min-width:800px) 75vw,100vw"
挑選哪些圖片資源放在srcset
裏是很困難的,我也沒有徹底掌握技巧。在上面的例子裏,我設置了一個最小尺寸(注:原文中是最大)(689px
),而後給2x
設備設置剛纔的兩倍尺寸(1378px
)。另外兩個設置是在這兩個值中間任意取的。我沒有設置更小的寬度好比320px
,由於在這一狀況下的屏幕密度是2x
或者更高。
srcset
+ sizes
在 Chrome、Firefox和Opera中都兼容。至於其餘瀏覽器,也會很安全地回退到src
屬性。不用等待好久,WebKit nightly
和 下一個穩定版本的Edge
就會很好地支持它。
WebKit nightly
是WebKit的mac port
,對於Safari
就像Chromium
對於Chrome
原文中
<img>
有一個內聯樣式width:100%
,一開始沒有注意到的話還覺得沒有變化呢。上面的案例已經修改過了 -。-仍是由於做者使用了內容相同,尺寸的圖片,因此我換了圖片從新作了一個例子:
這種新方法的
srcset
用來指向提供的圖片資源,沒有上面方法的1x
、2x
,這個都交給瀏覽器。例子中就指向了3個尺寸圖片。
sizes
用來表示尺寸臨界點,用媒體查詢定下圖片的實際寬度。
和以前的例子相似除了框架的不一樣寬度的變化。它容許你集中精力對付更小的寬度。
只要你想,你能夠有不少<source>
你必須包含一個<img>
媒體查詢<source>
元素上老是被服從的
媒體查詢是基於窗口的寬度,不是<img>
的
第一個匹配到的<source>
會被使用,因此順序很重要
若是沒有匹配到<source>
,則<img>
被調用
<img>
必須出如今<source>
後面
<source>
不支持src
,可是支持srcset
一旦<source>
或者<img>
被選中,srcset
和sizes
屬性就像以前的例子同樣解析。
藝術指導
:剪裁圖片內容來適應特定環境,任什麼時候候咱們裁剪或是修改圖片來適應一個斷點(而非簡單縮放),都是一種藝術指導。能夠看出來,藝術指導比以前的
srcset
+sizes
又多了一層維度:source
的媒體查詢。
<picture>
元素在Chrome、Firefox和Opera中兼容良好,在其餘瀏覽器能夠回退到<img>
。而下一代的Edge也可能會支持。
--
這個方法可讓你有更優化的方式去提供給支持它們的瀏覽器。
<picture> <source type="image/webp" srcset="snow.webp"> <img src="snow.jpg"> </picture>
type
屬性是mime
類型
你能夠有不少種資源和混合type
和media
、srcset
甚至是sizes
取建立一些驚奇的東西
它在Chrome、Firefox和Opera上兼容良好,其餘瀏覽器還能夠回退到<img>
。
但願上面的文章可以對各類用例起到參考做用,你能夠繼續看看下面的文章:
十段響應式圖片文章 - Jason Grigsby
響應式圖片:用例和代碼片斷 - 和這篇文章相似,可是有更多用例
Client hints - 服務端代替響應式圖片的方法
與本文結構相似的文章:
補充文章: