【20190305】CSS-響應式圖片:srcset+sizes,picture,svg

響應式圖片能夠根據不一樣的設備屏幕大小從而選擇加載不一樣的圖片,從而節省帶寬。實現響應式圖片有三種方法:srcset+sizes屬性、picture標籤、svgcss

1. srcset+sizes

srcset是img標籤的一個屬性,它能夠提供一系列圖片源,供瀏覽器在不一樣設備屏幕大小和像素密度下選擇適合的圖片。W3C規範中的描述:srcset屬性容許做者根據不一樣分辨率或不一樣視窗尺寸提供多個不一樣分辨率圖像。用戶代理會根據以前獲取的任何資源作選擇,從而避免多個資源加載浪費帶寬和相關性能問題。html

使用語法以下:web

1 <img src="selina.jpg" alt="alt"
2      srcset="100-s1.jpg 100w,300-s1.jpg 300w,600-s2.jpg 600w,800-s2.jpg 800w"
3      sizes="(max-width:500px) 300px,(max-width:1000px) 500px,100vw"/> 
4 
5 <img src="selina.jpg" alt="alt"
6      srcset="100-s1.jpg 1x,600-s2.jpg 2x" /> 

其中sizes的媒體條件中的px可替換成rem、em等相對單位,或vw相對於視口的百分比大小。chrome

srcset中提供了一系列圖片源,每一個資源之間用逗號隔開,資源由圖片的url與顯示條件構成。瀏覽器

  • 以w結尾表示條件爲像素,如第一條語句中表示100-s1的固定寬度爲100像素,當設備視口寬度小於等於100px時選擇100-s1圖片,當設備視口寬度小於等於300px時選擇300-s1圖片。
  • 以x結尾表示條件爲像素密度,第二條語句表示當設備像素密度爲1時選擇100-s1圖片,當設備像素密度爲2時選擇600-s2圖片。

第一條語句中的sizes屬性是爲響應式圖片設置的斷點,它表示怎樣根據視口寬度來選擇圖片,若是不設置sizes,那麼它默認的是100vw,也就是永遠根據100%視口寬度來選擇圖片源。sizes屬性值通常由一系列媒體條件構成,媒體條件後跟一個該條件下的圖片預估寬度,每一個條件以逗號隔開,最後沒有媒體條件的預估寬度表示默認值。svg

第一條語句中的sizes表示當設備視口寬度小於等於500px時,當前預估圖片尺寸爲300px,那麼瀏覽器將會在圖片源中查找符合條件的圖片,而且查找的原則首先是圖片固定寬度應該大於等於預估寬度,而後圖片寬度是最接近預估寬度的。當媒體條件都不知足時,就採用默認值100vw,也就是將100%視口寬度做爲預估寬度來選擇圖片。工具

另外因爲瀏覽器驗證媒體條件時若是第一個條件爲真,那麼就會中止驗證,所以媒體條件的順序也應該按照從小到大的規律排列,不然後面的小範圍條件將會不起做用。性能

目前大多數瀏覽器都支持srcset屬性,可是我本身測試的在chrome 72.0上的顯示效果很奇怪,沒搞懂怎麼回事。測試

W3C規範是這樣描述 srcset: srcset屬性容許做者根據不一樣分辨率或不一樣的視窗尺寸提多個不一樣分辨圖像。用戶代理會根據以前獲取的任何資源作選擇,從而避免多個資源加載浪費帶寬和相關性能問題著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
原文: https://www.w3cplus.com/responsive/responsive-images-part-1-using-srcset.html © w3cplus.com
W3C規範是這樣描述 srcset: srcset屬性容許做者根據不一樣分辨率或不一樣的視窗尺寸提多個不一樣分辨圖像。用戶代理會根據以前獲取的任何資源作選擇,從而避免多個資源加載浪費帶寬和相關性能問題。著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
原文: https://www.w3cplus.com/responsive/responsive-images-part-1-using-srcset.html © w3cplus.com
W3C規範是這樣描述 srcset: srcset屬性容許做者根據不一樣分辨率或不一樣的視窗尺寸提多個不一樣分辨圖像。用戶代理會根據以前獲取的任何資源作選擇,從而避免多個資源加載浪費帶寬和相關性能問題。著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
原文: https://www.w3cplus.com/responsive/responsive-images-part-1-using-srcset.html © w3cplus.com
W3C規範是這樣描述 srcset: srcset屬性容許做者根據不一樣分辨率或不一樣的視窗尺寸提多個不一樣分辨圖像。用戶代理會根據以前獲取的任何資源作選擇,從而避免多個資源加載浪費帶寬和相關性能問題。著做權歸做者全部。
商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
原文: https://www.w3cplus.com/responsive/responsive-images-part-1-using-srcset.html © w3cplus.com

2. picture標籤

picture元素是HTML5的新特性,它容許你放置多個source標籤,指定不一樣的圖像文件名,根據媒體條件(視口高度viewport height、寬度width、方向orientation)或像素密度來選擇圖片進行加載。url

使用語法以下:

 1 <picture>
 2       <source media="max-width:800px"
 3  
 4             srcset="image800.jpg 800w,
 5                     image1406.jpg 1406w
 6             "
 7  
 8             sizes="(min-width:530px) calc(100vw - 96px),
 9                    100vw"
10        >
11  
12        <img alt="aaa"
13           src="689.jpg"
14  
15           srcset="689.jpg 689w,
16                   1378.jpg 1378w,
17                   500.jpg 500w
18                   1000.jpg 1000w"
19  
20          size="(min-width:1066px) 689px
21                 calc(75vw - 137px)"
22        >
23   </picture>

當符合source標籤中的media條件時,選擇source中的圖片源,不然使用img中的圖片源。

picture元素內部的source與img的關係像是相片與相框的關係,相框帶有一個底圖,當你有不少不一樣尺寸的圖片時,你試圖找到第一個合適尺寸的照片放到相框裏,若是沒有,就不放照片而用相框自己的底圖,picture就是告訴你這個相框只能在這些圖片裏找合適的。

另外還支持選擇不一樣格式的圖片:

1 <picture>
2        <source type="image/webpp" srcset="snow.webp">
3        <img src="snow.jpg" alt="a cat">
4 </picture>

若是瀏覽器支持webp格式,則加載snow.webp,不然加載jpg圖片。

目前大多數瀏覽器也已支持picture,若是有特殊狀況,可使用picturefill工具來兼容各個瀏覽器。

3. svg

經過img標籤插入svg矢量圖也能夠達到實現響應式圖片的效果,可是這種方法不能用JavaScript來操做圖像,並且只能使用內聯css樣式來控制圖像,也不能使用css僞類。

或直接在HTML中插入svg代碼,svg代碼應該包含在<svg></svg>中。

最後能夠經過iframe嵌入svg文檔。

具體可參考:https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Multimedia_and_embedding/Adding_vector_graphics_to_the_Web

相關文章
相關標籤/搜索