Web開發中的響應式圖片處理
目前手機等移動設備網站開發已經有比較好的解決方案,一種是響應式網站,像筆者博客一樣,PC網站就是移動網站,一種是把移動網站和PC網站分開,類似淘寶那樣。從網站SEO的角度來說,兩者并無差別,也各有利弊,不論采取那種方式也都能解決移動設備瀏覽問題。隨著移動設備和類型越來越多,我們幾乎不太可能針對某一類設備建設單獨的網站,不論PC網站和移動網是否分開建設,那都意味著我們的移動網站將會面臨越來越多各不相同設備進行訪問,也就是說即使是建設單獨的移動網站,我們也必須要考慮網站符合用戶的設備特性。
一般來說,網站很容易實現自適應,筆者博客就是一個完全自適應的網站,但自適應網站有一個難點,那就是圖片問題,圖片在網頁中的重要性毋須去提,那么我們在移動網站中如何展示給用戶合適的圖片呢,一般有以下幾種做法:
1,直接把質量***的圖片加入到html中,用戶用不同的設備訪問時,通過CSS或者javascript控制其大小,這樣直接忽略不同設備的尺寸,但可能會因為加載過大的圖片占用太大帶寬而增加訪問時間、耗費過多移動流量。
2,異步加載,事先加載一張較小的圖片頁面中,再通過javascript獲取用戶設備信息,按需加載圖片,這樣解決了速度問題,對于網站排名可能不利。
3,在html頭部利用javasctipt生成一個cookie,包含設備分辨率和像素比等信息,在用戶代理請求圖片時,這個cookie會和其它請求信息一起發送到服務器,在服務端獲取到cookie之后,對圖片進行處理,然后傳送給客戶端。這樣做解決圖片尺寸和優化問題,但靈活性較差,還可能由于用戶不支持cookie而導致工作失敗,另外在網頁頭部增加javascript的方式總讓人感覺有那么一點奇怪。
為了解決移動開發中的圖片響應式問題,HTML5標準專門增加img標簽的srcset和sizes屬性,srcset以逗號分隔的一個或多個字符串列表表明一系列用戶代理使用的可能的圖像,每一個字符串列表包含一個圖像的URL和可選的寬度描述符(像素加“w”表示)和像素密度描述符(像素比+“x”表示,默認為1x),w和x不能同時使用。sizes表示資源大小的以逗號隔開的一個或多個字符串。每一個資源大小包括一個媒體條件和一個資源尺寸的值,它用來指定圖像的預期尺寸,當srcset使用 ‘w’ 描述符時,用戶代理使用當前圖像大小來選擇srcset中合適的一個圖像URL 如果img不包含srcset或者srcset中沒有’w’描述符,sizes不生效。 被選中的尺寸影響圖像的顯示大小(如果沒有CSS樣式被應用的話)。如果沒有設置srcset屬性,或者沒值,那么sizes屬性也將不起作用。讀起來很拗口,要弄徹底弄清楚,必須明白三個概念:設備CSS像素,設備物理像素,設備像素比,如果你不清楚,可以查看我之前的這篇文章 響應式網站建設中的像素和寬度問題 。
如果你弄清楚了以上三個概念,知道一些高端設備為了讓圖片顯示更清晰,會在瀏覽器底層把圖片進行壓縮,在顯示器上用兩個或者更多的物理像素顯示圖片上個一個CSS像素,就能理解在w是指設備的物理像素寬度,x是指設備的設備像素比,那么下面兩段代碼的意思分別是:
<img src="demo-small.jpg" srcset="demo-small.jpg 300w,demo-medium.jpg 600w,demo-big.jpg 750w"> 300物理像素寬的設備加載demo-small.jpg,600加載demo-medium.jpg,750加載demo-big.jpg <img src="demo-small.jpg" srcset="demo-small.jpg 1px,demo-medium.jpg 2x,demo-big.jpg 2.5x"> 1設備像素比加載demo-small.jpg,2加載demo-medium.jpg,2.5加載demo-big.jpg
我們這里遇到了一個問題,用w對像素的控制更加靈活,因為相同的設備像素比可能有著懸殊的像素差別,進而導致顯示大小發生變化,例如,有兩臺設備,一臺CSS像素寬720,像素比2,另外一臺CSS像素寬1024,像素比也是2;有兩張圖片,分辨率分別為360*200的demo-small.jpg和720*400的demo-big.jpg,用像素比控制顯示:<img src=”demo-small.jpg” srcset=”demo-small.jpg 1px,demo-big.jpg 2x”>,則兩臺設備上都會顯示分辨率為720*400的demo-big.jpg,則他們所占屏幕寬度為:
設備1: ([圖片像素]720 ÷ [像素比]2) ÷ [CSS像素]720 = 50%
設備2: ([圖片像素]720 ÷ [像素比]2) ÷ [CSS像素]720 = 35%
用’w’描述符的方式可能非常靈活的控制加載的圖片和展示的大小,還是上面的設備,可以通過w指定合適的圖片,也可以通過sizes指定圖片的顯示大小。
綜上我們可以得知,使用srcset和描述符,瀏覽器能根據客戶端的情況,自動選擇需要加載的圖片,進行定向加載,相對于文章開頭說的三種響應式圖片的解決方案,靈活性強,節省流量,快速網站加載速度,是更好的響應式圖片解決辦法。
動態Responsive Image生成方案
srcset方案的一個弊端是需要指定不同屏幕情況下的多個圖片,如果手動生成這些圖片,費時費力,利用Responsive Image工具,可以動態自動生成圖片,操作如下:
1,下載代碼,并把所有訪問圖片的請求重定向到Responsive Image的plm.php文件。
2,創建圖片緩存目錄,打開plm文件,根據提示做好配置。
3,獲取指定圖片的操作如下:
剪裁:example.com/example.jpg/(crop:[x[,y,]]width[,height])
縮放:example.com/example.jpg/(reduce:[x[,y,]]width[,height])
括號里面為動作,可以連續多次使用:
example.com/example.jpg/(crop:[x[,y,]]width[,height])/(reduce:[x,[y,]]width[,height])為先進行剪裁,然后壓縮處理
[]中的為可選值,x,y不填默認為0,height不填默認為圖片高度(剪裁)和寬度縮小后圖片高度(縮放)
可以參考Responsive Image的index.html文件進行配置。
參考資料
- 響應式圖片srcset全新釋義sizes屬性w描述符
- HTML img element
- Responsive Image