詳解HTML5中的picture元素響應式處理圖片

響應式設計
所謂的響應式設計,是指在不同的屏幕分辨率,不同的像素密度比,不同寬度的終端設備中,網頁布局可以自適應的調整。響應式設計的本意是使原本PC上的網站兼容移動終端,大部分響應式網頁是通過媒體查詢,加載不同樣式的CSS文件實現(xiàn)的。這樣的彈性化布局使網站在不同的設備終端布局都比較合理。
雖然響應式設計的好處多多,但是也有諸多缺陷。由于PC端和移動終端訪問的是同一個網站,PC端可以不計較流量限制,但是移動端不可能不計較。
為適配不同終端機型的屏幕寬度和像素密度,我們一般會使用如下方法設置圖片的CSS樣式:
<style> img{ max-width:100%; height:auto; } </style>
將圖片的最大寬度設置為100%,以確保圖像不會超出其父級元素的寬度,如果父級元素的寬度發(fā)生改變,圖片的寬度也隨之改變,height:auto 可以確保圖片的寬度發(fā)生改變時,圖片的高度會依據自身的寬高比例進行縮放。
這樣當我們在移動設備上訪問響應式網頁里的圖片時,只是把圖片的分辨率做了縮放,下載的還是PC端的那張大圖,這樣不僅浪費流量,而且浪費帶寬,而且會拖慢網頁的打開速度,嚴重影響用戶的使用體驗。
新的解決方案:<picture>
- <picture>是HTML5的一個新元素;
- 如果<picture>元素與當前的<audio>,<video>元素協(xié)同合作將增強響應式圖像工作的進程,它允許在其內部設置多個<source>標簽,以指定不同的圖像文件名,根據不同的條件進行加載;
- <picture>可以根據不同的條件加載不同的圖像,這些條件可以是視窗當前的高度(viewport),寬度(width),方向(orientation),像素密度(dpr)等;
舉幾個栗子
如下栗子中針對不同屏幕寬度加載不同的圖片;當頁面寬度 在320px到640px之間時加載minpic.png;當頁面寬度大于640px時加載middle.png
<picture> <source media="(min-width: 320px) and (max-width: 640px)" srcset="img/minpic.png"> <source media="(min-width: 640px)" srcset="img/middle.png"> <img src="img/picture.png" alt="this is a picture"> </picture>
2.如下栗子中添加了屏幕的方向作為條件;當屏幕方向為橫屏方向時加載_landscape.png結尾的圖片;當屏幕方向為豎屏方向時加載 _portrait.png結尾的圖片;
<picture> <source media="(min-width: 320px) and (max-width: 640px) and (orientation: landscape)" srcset="img/minpic_landscape.png"> <source media="(min-width: 320px) and (max-width: 640px) and (orientation: portrait)" srcset="img/minpic_portrait.png"> <source media="(min-width: 640px) and (orientation: landscape)" srcset="img/middlepic_landscape.png"> <source media="(min-width: 640px) and (orientation: portrait)" srcset="img/middlepic_portrait.png"> <img src="img/picture.png" alt="this is a picture"> </picture>
3.如下栗子中添加了屏幕像素密度作為條件;當像素密度為2x時加載_retina.png 2x 的圖片,當像素密度為1x時加載無retina后綴的圖片;
<picture> <source media="(min-width: 320px) and (max-width: 640px)" srcset="img/minpic.png,img/minpic_retina.png 2x"> <source media="(min-width: 640px)" srcset="img/middle.png,img/middle_retina.png 2x"> <img src="img/picture.png,img/picture_retina.png 2x" alt="this is a picture"> </picture>
4.如下栗子中添加圖片文件格式作為條件,當支持webp格式圖片時加載webp格式圖片,當不支持時加載png格式圖片;
<picture> <source type="image/webp" srcset="img/picture.webp"> <img src="img/picture.png" alt="this is a picture"> </picture>
5.如下例子中添加寬度描述;頁面會根據當前尺寸選擇加載不大于當前寬度的最大的圖片;
<img src="picture-160.png" alt="this is a picture" sizes="90vw" srcset="picture-160.png 160w, picture-320.png 320w, picture-640.png 640w, picture-1280.png 1280w">
6.如下例子中添加sizes屬性;當窗口寬度大于等于800px時加載對應版本的圖片;
<source media="(min-width: 800px)" sizes="90vw" srcset="picture-landscape-640.png 640w, picture-landscape-1280.png 1280w, picture-landscape-2560.png 2560w"> <img src="picture-160.png" alt="this is a picture" sizes="90vw" srcset="picture-160.png 160w, picture-320.png 320w, picture-640.png 640w, picture-1280.png 1280w">
兼容性:
目前只有Chrome , Firefox , Opera 對其兼容性較好,具體兼容性如圖:
優(yōu)點:
- 加載適當大小的圖像文件,使可用帶寬得到充分利用;
- 加載不同剪裁并具有不同橫縱比的圖像,以適應不同寬度的布局變化;
- 加載更高的像素密度,顯示更高分辨率的圖像;
步驟:
- 創(chuàng)建<picture></picture>標簽;
- 在這些標簽內創(chuàng)建一個你想用來執(zhí)行任何一個特性的<source></scource>標簽;
- 添加一個media屬性,用來包含你想要的特性,如寬度(max-width,min-width),方向(orientation)等;
- 添加一個srcset屬性,屬性值為相應的圖像文件名稱,進行加載。如果你想提供不同的像素密度,例如Retina顯示屏,可以添加額外的文件名到srcset屬性中;
- 添加一個回退的<img>標簽;
<picture>的工作原理
<picture>語法
由上面的示例代碼可知,在沒有引入js和第三方庫,CSS中沒有包含media queries的情況下,<picture>元素可以實現(xiàn)只用HTML來聲明響應式圖片;
<source>元素
<picture>標簽它本身沒有屬性。神奇的地方是<picture>被用來當做<source>的容器。
<source>元素,是用來加載多媒體的比如視頻和音頻,已經被更新用到圖片的加載并且一些新的屬性已經被添加:
srcset (必需)
接受單一的圖片文件路徑(如:srcset=”img/minpic.png”).
或者是逗號分隔的用像素密度描述的圖片路徑(如:srcset=”img/minpic.png,img/minpic_retina.png 2x”),1x 的描述是默認不使用的。
media (可選)
接受任何驗證的media query,你可以看到在CSS @media選擇器(如:media=”(min-width: 320px)”).
在之前的<picture>語法的例子里已經用到了。
sizes(可選)
接收單一的寬度描述(如:sizes=”100vw”)或者單一的media query寬度描述(如:sizes=”(min-width: 320px) 100vw”).
或者逗號分隔的media query對寬度的描述(如:sizes=”(min-width: 320px) 100vw, (min-width: 640px) 50vw, calc(33vw - 100px)”) 最后的一個被當做默認的。
type(可選)
接受支持的MIME類型(如: type=”image/webp” or type=”image/vnd.ms-photo”)
瀏覽器會根據這些提示和屬性來加載確切的圖片資源。根據標簽的列表順序。瀏覽器會使用第一個合適的<source>元素并忽略掉后面的<source>標簽。
添加最后的<img>元素
<img>元素在<picture>內部用來當瀏覽器不支持時或者沒有源標簽匹配時的顯示。在<picture>內使用<img>標簽是必須得,如果你忘記了,將不會有圖片顯示出來。
用<img>來聲明默認的圖片顯示。將<img>標簽放到<picture>內的最后,瀏覽器在找到<img>標簽之前會忽略<source>的聲明。這個圖片標簽也需要你寫上它的alt屬性。
文中借鑒了很多其他的文章,到這里針對于picture的所有介紹就結束了,那么現(xiàn)在就去試試它吧~
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
- Microdata作為HTML5新增的一個特性,它允許開發(fā)者在HTML文檔中添加更多的語義信息,以便于搜索引擎和瀏覽器更好地理解頁面內容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
- 在HTML語法中,表格主要通過< table >、< tr >和< td >3個標簽構成,本文通過實例代碼講解HTML5表格語法格式,感興趣的朋友一起看看吧2025-04-21
- 這篇文章主要介紹了HTML5中使用媒體查詢和Flexbox進行響應式布局的方法,簡要介紹了CSS Grid布局的基礎知識和如何實現(xiàn)自動換行的網格布局,感興趣的朋友一起看看吧2025-04-21
基于Canvas的Html5多時區(qū)動態(tài)時鐘實戰(zhàn)代碼
本文介紹了如何使用Canvas在HTML5上實現(xiàn)一個多時區(qū)動態(tài)時鐘的web展示,通過Canvas的API,可以繪制出6個不同城市的時鐘,并且這些時鐘可以動態(tài)轉動,每個時鐘上都會標注出對應的2025-03-11- HTML5的自定義數據屬性(data-*)提供了一種標準化的方法在HTML元素上存儲額外信息,可以通過JavaScript訪問、修改和在CSS中使用,文章還介紹了高級用法,如存儲JSON數據、事2025-03-11
- 在HTML5中,下拉框(<select>標簽)作為表單的重要組成部分,為用戶提供了一個從預定義選項中選擇值的方式,本文將深入探討<select>標簽的屬性、樣式,并重點介2025-02-27
- 本文介紹了HTML5InputDatePicker對象表示HTML``元素,是HTML5中的新對象,介紹了日期、周、月份、時間、日期+時間、本地日期時間等不同類型的日期選擇器,感興趣的朋友一起看2025-02-17
- 本文介紹了HTML5中的超鏈接、相對路徑和圖片的使用方法,超鏈接可以創(chuàng)建指向另一個文檔或頁面內部書簽的鏈接,相對路徑用于在同一服務器內部跳轉頁面,圖片標簽用于引入外部圖2025-02-17
- 本文介紹了HTML5超鏈接的創(chuàng)建方法,包括基本語法、創(chuàng)建圖像超鏈接的邊框去除方法以及錨點鏈接的使用,還討論了超鏈接的四種不同狀態(tài)(link、visited、hover、active)的CSS樣2025-02-17
- 最近看一些技術網站發(fā)現(xiàn)了details 標簽的妙用,這個不用js即可實現(xiàn)展開/收縮信息,很方便用來讓用戶先才答案,然后下面點擊再給出答案的效果,這里就為大家簡單介紹一下,2024-11-03