藍(lán)色字“中國最冷小鎮(zhèn)”關(guān)注我們喲!
您看此文用 · 秒,轉(zhuǎn)發(fā)只需1秒呦~
歡迎大家踴躍投稿,我們的郵箱是:hzxcwx@163.com
前做過很多特殊的布局,比如在這兩篇文章 CSS 實(shí)現(xiàn)優(yōu)惠券的技巧 (juejin.cn)[1]、CSS 實(shí)現(xiàn)支持漸變的提示框(tooltips) (juejin.cn)[2],如下
但是一直有一個(gè)痛點(diǎn)就是:無法給這些圖形加上邊框
今天帶來一個(gè)小技巧:利用 drop-shadow 一行代碼搞定所有不規(guī)則邊框
這里需要利用投影 drop-shadow, 不太了解的可以參考 這篇文章: 被低估的CSS濾鏡:drop-shadow[3],這里簡單介紹一下
語法其實(shí)很簡單
filter: drop-shadow(offset-x offset-y blur-radius color)
并不是一個(gè)單獨(dú)的屬性,而是 filter 濾鏡下的一個(gè)方法
這里 offset-x、offset-y為偏移量,blur-radius為模糊半徑,color為投影顏色。實(shí)際作用就是可以模擬真實(shí)世界的投影(透明的部分不會投影),區(qū)別如下
可惜的是,雖然和 box-shadow 比較類似,但是少了擴(kuò)展半徑。試想一下,如果支持了擴(kuò)展半徑,那不規(guī)則邊框是不是很容易了(應(yīng)該不會支持了,因?yàn)檎鎸?shí)世界的投影也沒有擴(kuò)展半徑)?
那么,drop-shadow如何生成邊框呢?
box-shadow 可以很輕易的實(shí)現(xiàn)多重陰影
box-shadow: 0 0 3px #333, 1px 1px 5px #666, ...
可以無限疊加下去。
但是,drop-shadow可就不行了,比如
filter: drop-shadow(0 0 3px #333, 1px 1px 5px #666, ...)
可以看到瀏覽器直接認(rèn)為非法了
不過可以換一種思路,雖然 drop-shadow不支持,但是filter支持多種濾鏡,所以可以這樣來實(shí)現(xiàn)
filter: drop-shadow(0 0 3px #333) drop-shadow(0 0 3px #333) drop-shadow(0 0 3px #333)...
這樣就可以生效了
是不是有點(diǎn)像邊框了?如果只設(shè)置 0.5px 的模糊,多疊加幾次,模糊的部分會變清晰,這個(gè)就有點(diǎn)像一個(gè)比較軟的筆觸,多畫幾筆就變清晰了,于是可以得到這樣的效果
這樣就更加接近了,實(shí)踐下來,可能需要微調(diào),這里給出一個(gè)比較完美的方案(重點(diǎn)來了~)
.wrap{
filter: drop-shadow(0px 0px 0.5px #333) drop-shadow(0px 0px 0px #333) drop-shadow(0px 0px 0px #333) drop-shadow(0px 0px 0px #333) drop-shadow(0px 0px 0px #333)
}
這樣實(shí)現(xiàn)的邊框已經(jīng)足夠清晰,基本可以日常使用了
這段代碼中顏色比較多,可以優(yōu)化一下,投影的顏色默認(rèn)是跟隨當(dāng)前文字顏色的,所以可以簡化為
.wrap{
filter: drop-shadow(0 0 0.5px)drop-shadow(0 0 0)drop-shadow(0 0 0)drop-shadow(0 0 0)drop-shadow(0 0 0);
color: #333;
}
線上示例可訪問 coupon-border[4],還有這個(gè) tooltips-border[5]
使用方式簡單,在容器的最外層加上這一行 CSS 就行了,比如之前的優(yōu)惠券例子,得到的邊框效果這樣的
還有這樣的
邊框還算不錯(cuò),幾乎看不出投影
不過這里需要注意的是,經(jīng)過 mask 裁剪的圖形需要在外層嵌套一層父級,不然投影會被 mask 直接裁剪掉
<div class="wrap">
<div class="coupon">
<!--優(yōu)惠券-->
</div>
</div>
另外,這個(gè)方案進(jìn)適合比較小的邊框,如果較大的邊框,可能會比較圓滑,而且需要疊加更多的濾鏡,效果也不太好,如下
這些就需要自行取舍了(一般情況下不會有太粗的邊框)
本文介紹了一個(gè)實(shí)現(xiàn)不規(guī)則邊框的通用方案,成本非常低,效果也非常不錯(cuò),這里總結(jié)一下:
1.drop-shadow只會對不透明部分生成投影,符合真實(shí)物理世界2.drop-shadow不支持多重投影,filter支持多重濾鏡,可以間接實(shí)現(xiàn)多重投影3.邊框的實(shí)現(xiàn)原理是投影的多重疊加4.有些通過mask裁剪生成的圖形,需要在外包裹一層容器,再生成邊框5.適合比較小的邊框,過大的邊框不太理想6.濾鏡其實(shí)是一個(gè)比較耗費(fèi)性能的屬性,不適合太范圍使用
可能大部分同學(xué)最后可能還是會選擇 “切圖.png”,不過這也算是一個(gè)解決方案 ,多一種方案總是沒錯(cuò)的。最后,如果覺得還不錯(cuò),對你有幫助的話,歡迎點(diǎn)贊、收藏、轉(zhuǎn)發(fā)???
[1] CSS 實(shí)現(xiàn)優(yōu)惠券的技巧 (juejin.cn): https://juejin.cn/post/6945023989555134494
[2] CSS 實(shí)現(xiàn)支持漸變的提示框(tooltips) (juejin.cn): https://juejin.cn/post/6971261516284690468
[3] 這篇文章: 被低估的CSS濾鏡:drop-shadow: https://zhuanlan.zhihu.com/p/195792157
[4] coupon-border: https://codepen.io/xboxyan/pen/jOmeoPd
[5] tooltips-border: https://codepen.io/xboxyan/pen/wvdQgXK
接:https://juejin.im/book/5b936540f265da0a9624b04b
《高性能網(wǎng)站建設(shè)指南》的作者 Steve Souders 曾在一篇博客中提到:
我的大部分性能優(yōu)化工作都集中在 JavaScript 和 CSS 上,從早期的 Move Scripts to the Bottom 和 Put Stylesheets at the Top 規(guī)則。為了強(qiáng)調(diào)這些規(guī)則的重要性,我甚至說過,“JS 和 CSS 是頁面上最重要的部分”。
幾個(gè)月后,我意識到這是錯(cuò)誤的。圖片才是頁面上最重要的部分。
我關(guān)注 JS 和 CSS 的重點(diǎn)也是如何能夠更快地下載圖片。圖片是用戶可以直觀看到的。他們并不會關(guān)注 JS 和 CSS。確實(shí),JS 和 CSS 會影響圖片內(nèi)容的展示,尤其是會影響圖片的展示方式(比如圖片輪播,CSS 背景圖和媒體查詢)。但是我認(rèn)為 JS 和 CSS 只是展示圖片的方式。在頁面加載的過程中,應(yīng)當(dāng)先讓圖片和文字先展示,而不是試圖保證 JS 和 CSS 更快下載完成。
這段話可謂字字珠璣。此外,雅虎軍規(guī)和 Google 官方的最佳實(shí)踐也都將圖片優(yōu)化列為前端性能優(yōu)化必不可少的環(huán)節(jié)——圖片優(yōu)化的優(yōu)先級可見一斑。
就圖片這塊來說,與其說我們是在做“優(yōu)化”,不如說我們是在做“權(quán)衡”。因?yàn)槲覀円龅氖虑椋褪侨嚎s圖片的體積(或者一開始就選取體積較小的圖片格式)。但這個(gè)優(yōu)化操作,是以犧牲一部分成像質(zhì)量為代價(jià)的。因此我們的主要任務(wù),是盡可能地去尋求一個(gè)質(zhì)量與性能之間的平衡點(diǎn)。
2019 年,圖片依然很大
這里先給大家介紹 HTTP-Archive 這個(gè)網(wǎng)站,它會定期抓取 Web 上的站點(diǎn),并記錄資源的加載情況、Web API 的使用情況等頁面的詳細(xì)信息,并會對這些數(shù)據(jù)進(jìn)行處理和分析以確定趨勢。通過它我們可以實(shí)時(shí)地看到世界范圍內(nèi)的 Web 資源的統(tǒng)計(jì)結(jié)果。
截止到 2018 年 8 月,過去一年總的 web 資源的平均請求體積是這樣的:
而具體到圖片這一類的資源,平均請求體積是這樣的:
當(dāng)然,隨著我們工程師在性能方面所做的努力越來越有成效,平均來說,不管是資源總量還是圖片體積,都在往越來越輕量的方向演化。這是一種值得肯定的進(jìn)步。
但同時(shí)我們不得不承認(rèn),如圖所示的這個(gè)圖片體積,依然是太大了。圖片在所有資源中所占的比重,也足夠“觸目驚心”了。為了改變這個(gè)現(xiàn)狀,我們必須把圖片優(yōu)化提上日程。
時(shí)下應(yīng)用較為廣泛的 Web 圖片格式有 JPEG/JPG、PNG、WebP、Base64、SVG 等,這些格式都是很有故事的,值得我們好好研究一把。此外,老生常談的雪碧圖(CSS Sprites)至今也仍在一線的前端應(yīng)用中發(fā)光發(fā)熱,我們也會有所提及。
不談業(yè)務(wù)場景的選型都是耍流氓。下面我們就結(jié)合具體的業(yè)務(wù)場景,一起來解開圖片選型的神秘面紗!
在計(jì)算機(jī)中,像素用二進(jìn)制數(shù)來表示。不同的圖片格式中像素與二進(jìn)制位數(shù)之間的對應(yīng)關(guān)系是不同的。一個(gè)像素對應(yīng)的二進(jìn)制位數(shù)越多,它可以表示的顏色種類就越多,成像效果也就越細(xì)膩,文件體積相應(yīng)也會越大。
一個(gè)二進(jìn)制位表示兩種顏色(0|1 對應(yīng)黑|白),如果一種圖片格式對應(yīng)的二進(jìn)制位數(shù)有 n 個(gè),那么它就可以呈現(xiàn) 2^n 種顏色。
關(guān)鍵字:有損壓縮、體積小、加載快、不支持透明
JPG 的優(yōu)點(diǎn)
JPG 最大的特點(diǎn)是有損壓縮。這種高效的壓縮算法使它成為了一種非常輕巧的圖片格式。另一方面,即使被稱為“有損”壓縮,JPG的壓縮方式仍然是一種高質(zhì)量的壓縮方式:當(dāng)我們把圖片體積壓縮至原有體積的 50% 以下時(shí),JPG 仍然可以保持住 60% 的品質(zhì)。此外,JPG 格式以 24 位存儲單個(gè)圖,可以呈現(xiàn)多達(dá) 1600 萬種顏色,足以應(yīng)對大多數(shù)場景下對色彩的要求,這一點(diǎn)決定了它壓縮前后的質(zhì)量損耗并不容易被我們?nèi)祟惖娜庋鬯煊X——前提是你用對了業(yè)務(wù)場景。
使用場景
JPG 適用于呈現(xiàn)色彩豐富的圖片,在我們?nèi)粘i_發(fā)中,JPG 圖片經(jīng)常作為大的背景圖、輪播圖或 Banner 圖出現(xiàn)。
兩大電商網(wǎng)站對大圖的處理,是 JPG 圖片應(yīng)用場景的最佳寫照:
打開淘寶首頁,我們可以發(fā)現(xiàn)頁面中最醒目、最龐大的圖片,一定是以 .jpg 為后綴的:
京東首頁也不例外:
使用 JPG 呈現(xiàn)大圖,既可以保住圖片的質(zhì)量,又不會帶來令人頭疼的圖片體積,是當(dāng)下比較推崇的一種方案。
JPG 的缺陷
有損壓縮在上文所展示的輪播圖上確實(shí)很難露出馬腳,但當(dāng)它處理矢量圖形和 Logo 等線條感較強(qiáng)、顏色對比強(qiáng)烈的圖像時(shí),人為壓縮導(dǎo)致的圖片模糊會相當(dāng)明顯。
此外,JPEG 圖像不支持透明度處理,透明圖片需要召喚 PNG 來呈現(xiàn)。
關(guān)鍵字:無損壓縮、質(zhì)量高、體積大、支持透明
PNG 的優(yōu)點(diǎn)
PNG(可移植網(wǎng)絡(luò)圖形格式)是一種無損壓縮的高保真的圖片格式。8 和 24,這里都是二進(jìn)制數(shù)的位數(shù)。按照我們前置知識里提到的對應(yīng)關(guān)系,8 位的 PNG 最多支持 256 種顏色,而 24 位的可以呈現(xiàn)約 1600 萬種顏色。
PNG 圖片具有比 JPG 更強(qiáng)的色彩表現(xiàn)力,對線條的處理更加細(xì)膩,對透明度有良好的支持。它彌補(bǔ)了上文我們提到的 JPG 的局限性,唯一的 BUG 就是體積太大。
PNG-8 與 PNG-24 的選擇題
什么時(shí)候用 PNG-8,什么時(shí)候用 PNG-24,這是一個(gè)問題。
理論上來說,當(dāng)你追求最佳的顯示效果、并且不在意文件體積大小時(shí),是推薦使用 PNG-24 的。
但實(shí)踐當(dāng)中,為了規(guī)避體積的問題,我們一般不用PNG去處理較復(fù)雜的圖像。當(dāng)我們遇到適合 PNG 的場景時(shí),也會優(yōu)先選擇更為小巧的 PNG-8。
如何確定一張圖片是該用 PNG-8 還是 PNG-24 去呈現(xiàn)呢?好的做法是把圖片先按照這兩種格式分別輸出,看 PNG-8 輸出的結(jié)果是否會帶來肉眼可見的質(zhì)量損耗,并且確認(rèn)這種損耗是否在我們(尤其是你的 UI 設(shè)計(jì)師)可接受的范圍內(nèi),基于對比的結(jié)果去做判斷。
應(yīng)用場景
前面我們提到,復(fù)雜的、色彩層次豐富的圖片,用 PNG 來處理的話,成本會比較高,我們一般會交給 JPG 去存儲。
考慮到 PNG 在處理線條和顏色對比度方面的優(yōu)勢,我們主要用它來呈現(xiàn)小的 Logo、顏色簡單且對比強(qiáng)烈的圖片或背景等。
此時(shí)我們再次把目光轉(zhuǎn)向性能方面堪稱業(yè)界楷模的淘寶首頁,我們會發(fā)現(xiàn)它頁面上的 Logo,無論大小,還真的都是 PNG 格式:
主 Logo:
較小的 Logo:
顏色簡單、對比度較強(qiáng)的透明小圖也在 PNG 格式下有著良好的表現(xiàn):
關(guān)鍵字:文本文件、體積小、不失真、兼容性好
SVG(可縮放矢量圖形)是一種基于 XML 語法的圖像格式。它和本文提及的其它圖片種類有著本質(zhì)的不同:SVG 對圖像的處理不是基于像素點(diǎn),而是是基于對圖像的形狀描述。
SVG 的特性
和性能關(guān)系最密切的一點(diǎn)就是:SVG 與 PNG 和 JPG 相比,文件體積更小,可壓縮性更強(qiáng)。
當(dāng)然,作為矢量圖,它最顯著的優(yōu)勢還是在于圖片可無限放大而不失真這一點(diǎn)上。這使得 SVG 即使是被放到視網(wǎng)膜屏幕上,也可以一如既往地展現(xiàn)出較好的成像品質(zhì)——1 張 SVG 足以適配 n 種分辨率。
此外,SVG 是文本文件。我們既可以像寫代碼一樣定義 SVG,把它寫在 HTML 里、成為 DOM 的一部分,也可以把對圖形的描述寫入以 .svg 為后綴的獨(dú)立文件(SVG 文件在使用上與普通圖片文件無異)。這使得 SVG 文件可以被非常多的工具讀取和修改,具有較強(qiáng)的靈活性。
SVG 的局限性主要有兩個(gè)方面,一方面是它的渲染成本比較高,這點(diǎn)對性能來說是很不利的。另一方面,SVG 存在著其它圖片格式所沒有的學(xué)習(xí)成本(它是可編程的)。
SVG 的使用方式與應(yīng)用場景
SVG 是文本文件,我們既可以像寫代碼一樣定義 SVG,把它寫在 HTML 里、成為 DOM 的一部分,也可以把對圖形的描述寫入以 .svg 為后綴的獨(dú)立文件(SVG 文件在使用上與普通圖片文件無異)。
將 SVG 寫入 HTML:
將 SVG 寫入獨(dú)立文件后引入 HTML:
<img src="文件名.svg" alt="">
在實(shí)際開發(fā)中,我們更多用到的是后者。很多情況下設(shè)計(jì)師會給到我們 SVG 文件,就算沒有設(shè)計(jì)師,我們還有非常好用的 在線矢量圖形庫。對于矢量圖,我們無須深究過多,只需要對其核心特性有所掌握、日后在應(yīng)用時(shí)做到有跡可循即可。
關(guān)鍵字:文本文件、依賴編碼、小圖標(biāo)解決方案
Base64 并非一種圖片格式,而是一種編碼方式。Base64 和雪碧圖一樣,是作為小圖標(biāo)解決方案而存在的。在了解 Base64 之前,我們先來了解一下雪碧圖。
前置知識:最經(jīng)典的小圖標(biāo)解決方案——雪碧圖(CSS Sprites)
雪碧圖、CSS 精靈、CSS Sprites、圖像精靈,說的都是這個(gè)東西——一種將小圖標(biāo)和背景圖像合并到一張圖片上,然后利用 CSS 的背景定位來顯示其中的每一部分的技術(shù)。
MDN 對雪碧圖的解釋已經(jīng)非常到位:
圖像精靈(sprite,意為精靈),被運(yùn)用于眾多使用大量小圖標(biāo)的網(wǎng)頁應(yīng)用之上。它可取圖像的一部分來使用,使得使用一個(gè)圖像文件替代多個(gè)小文件成為可能。相較于一個(gè)小圖標(biāo)一個(gè)圖像文件,單獨(dú)一張圖片所需的 HTTP 請求更少,對內(nèi)存和帶寬更加友好。
我們幾乎可以在每一個(gè)有小圖標(biāo)出現(xiàn)的網(wǎng)站里找到雪碧圖的影子(下圖截取自京東首頁):
和雪碧圖一樣,Base64 圖片的出現(xiàn),也是為了減少加載網(wǎng)頁圖片時(shí)對服務(wù)器的請求次數(shù),從而提升網(wǎng)頁性能。Base64 是作為雪碧圖的補(bǔ)充而存在的。
理解 Base64
通過我們上文的演示,大家不難看出,每次加載圖片,都是需要單獨(dú)向服務(wù)器請求這個(gè)圖片對應(yīng)的資源的——這也就意味著一次 HTTP 請求的開銷。
Base64 是一種用于傳輸 8Bit 字節(jié)碼的編碼方式,通過對圖片進(jìn)行 Base64 編碼,我們可以直接將編碼結(jié)果寫入 HTML 或者寫入 CSS,從而減少 HTTP 請求的次數(shù)。
我們來一起看一個(gè)實(shí)例,現(xiàn)在我有這么一個(gè)小小的放大鏡 Logo:
它對應(yīng)的鏈接如下:
https://user-gold-cdn.xitu.io/2018/9/15/165db7e94699824b?w=22&h=22&f=png&s=3680
按照一貫的思路,我們加載圖片需要把圖片鏈接寫入 img 標(biāo)簽:
<img src="https://user-gold-cdn.xitu.io/2018/9/15/165db7e94699824b?w=22&h=22&f=png&s=3680">
瀏覽器就會針對我們的圖片鏈接去發(fā)起一個(gè)資源請求。
但是如果我們對這個(gè)圖片進(jìn)行 Base64 編碼,我們會得到一個(gè)很長很長的字符串,我們可以直接用這個(gè)字符串替換掉上文中的鏈接地址。你會發(fā)現(xiàn)瀏覽器原來是可以理解這個(gè)字符串的,它自動(dòng)就將這個(gè)字符串解碼為了一個(gè)圖片,而不需再去發(fā)送 HTTP 請求。
Base64 的應(yīng)用場景
上面這個(gè)實(shí)例,其實(shí)源自我們 掘金 網(wǎng)站 Header 部分的搜索欄 Logo:
既然 Base64 這么棒,我們何不把大圖也換成 Base64 呢?
這是因?yàn)椋珺ase64 編碼后,圖片大小會膨脹為原文件的 4/3(這是由 Base64 的編碼原理決定的)。如果我們把大圖也編碼到 HTML 或 CSS 文件中,后者的體積會明顯增加,即便我們減少了 HTTP 請求,也無法彌補(bǔ)這龐大的體積帶來的性能開銷,得不償失。
在傳輸非常小的圖片的時(shí)候,Base64 帶來的文件體積膨脹、以及瀏覽器解析 Base64 的時(shí)間開銷,與它節(jié)省掉的 HTTP 請求開銷相比,可以忽略不計(jì),這時(shí)候才能真正體現(xiàn)出它在性能方面的優(yōu)勢。
因此,Base64 并非萬全之策,我們往往在一張圖片滿足以下條件時(shí)會對它應(yīng)用 Base64 編碼:
Base64 編碼工具推薦
這里最推薦的是利用 webpack 來進(jìn)行 Base64 的編碼——webpack 的 url-loader 非常聰明,它除了具備基本的 Base64 轉(zhuǎn)碼能力,還可以結(jié)合文件大小,幫我們判斷圖片是否有必要進(jìn)行 Base64 編碼。
除此之外,市面上免費(fèi)的 Base64 編解碼工具種類是非常多樣化的,有很多網(wǎng)站都提供在線編解碼的服務(wù),大家選取自己認(rèn)為順手的工具就好。
關(guān)鍵字:年輕的全能型選手
WebP 是今天在座各類圖片格式中最年輕的一位,它于 2010 年被提出, 是 Google 專為 Web 開發(fā)的一種旨在加快圖片加載速度的圖片格式,它支持有損壓縮和無損壓縮。
WebP 的優(yōu)點(diǎn)
WebP 像 JPEG 一樣對細(xì)節(jié)豐富的圖片信手拈來,像 PNG 一樣支持透明,像 GIF 一樣可以顯示動(dòng)態(tài)圖片——它集多種圖片文件格式的優(yōu)點(diǎn)于一身。
WebP 的官方介紹對這一點(diǎn)有著更權(quán)威的闡述:
與 PNG 相比,WebP 無損圖像的尺寸縮小了 26%。在等效的 SSIM 質(zhì)量指數(shù)下,WebP 有損圖像比同類 JPEG 圖像小 25-34%。 無損 WebP 支持透明度(也稱為 alpha 通道),僅需 22% 的額外字節(jié)。對于有損 RGB 壓縮可接受的情況,有損 WebP 也支持透明度,與 PNG 相比,通常提供 3 倍的文件大小。
我們開篇提到,圖片優(yōu)化是質(zhì)量與性能的博弈,從這個(gè)角度看,WebP 無疑是真正的贏家。
WebP 的局限性
WebP 縱有千般好,但它畢竟太年輕。我們知道,任何新生事物,都逃不開兼容性的大坑。現(xiàn)在是 2018 年 9 月,WebP 的支持情況是這樣的:
坦白地說,雖然沒有特別慘(畢竟還有親爹 Chrome 在撐腰),但也足夠讓人望而卻步了。
此外,WebP 還會增加服務(wù)器的負(fù)擔(dān)——和編碼 JPG 文件相比,編碼同樣質(zhì)量的 WebP 文件會占用更多的計(jì)算資源。
WebP 的應(yīng)用場景
現(xiàn)在限制我們使用 WebP 的最大問題不是“這個(gè)圖片是否適合用 WebP 呈現(xiàn)”的問題,而是“瀏覽器是否允許 WebP”的問題,即我們上文談到的兼容性問題。具體來說,一旦我們選擇了 WebP,就要考慮在 Safari 等瀏覽器下它無法顯示的問題,也就是說我們需要準(zhǔn)備 PlanB,準(zhǔn)備降級方案。
目前真正把 WebP 格式落地到網(wǎng)頁中的網(wǎng)站并不是很多,這其中淘寶首頁對 WebP 兼容性問題的處理方式就非常有趣。我們可以打開 Chrome 的開發(fā)者工具搜索其源碼里的 WebP 關(guān)鍵字:
我們會發(fā)現(xiàn)檢索結(jié)果還是挺多的(單就圖示的加載結(jié)果來看,足足有?200?多條),下面大家注意一下這些 WebP 圖片的鏈接地址(以其中一個(gè)為例):
<img src="http://img.alicdn.com/tps/i4/TB1CKSgIpXXXXccXXXX07tlTXXX-200-200.png_60x60.jpg_.webp" alt="手機(jī)app - 聚劃算" class="app-icon">
.webp 前面,還跟了一個(gè) .jpg 后綴!
我們現(xiàn)在先大膽地猜測,這個(gè)圖片應(yīng)該至少存在 jpg 和 webp 兩種格式,程序會根據(jù)瀏覽器的型號、以及該型號是否支持 WebP 這些信息來決定當(dāng)前瀏覽器顯示的是 .webp 后綴還是 .jpg 后綴。帶著這個(gè)預(yù)判,我們打開并不支持 WebP 格式的 Safari 來進(jìn)入同樣的頁面,再次搜索 WebP 關(guān)鍵字:
Safari 提示我們找不到,這也是情理之中。我們定位到剛剛示例的 WebP 圖片所在的元素,查看一下它在 Safari 里的圖片鏈接:
<img src="http://img.alicdn.com/tps/i4/TB1CKSgIpXXXXccXXXX07tlTXXX-200-200.png_60x60.jpg" alt="手機(jī)app - 聚劃算" class="app-icon">
我們看到同樣的一張圖片,在 Safari 中的后綴從 .webp 變成了 .jpg!看來果然如此——站點(diǎn)確實(shí)是先進(jìn)行了兼容性的預(yù)判,在瀏覽器環(huán)境支持 WebP 的情況下,優(yōu)先使用 WebP 格式,否則就把圖片降級為 JPG 格式(本質(zhì)是對圖片的鏈接地址作簡單的字符串切割)。
此外,還有另一個(gè)維護(hù)性更強(qiáng)、更加靈活的方案——把判斷工作交給后端,由服務(wù)器根據(jù) HTTP 請求頭部的 Accept 字段來決定返回什么格式的圖片。當(dāng) Accept 字段包含 image/webp 時(shí),就返回 WebP 格式的圖片,否則返回原圖。這種做法的好處是,當(dāng)瀏覽器對 WebP 格式圖片的兼容支持發(fā)生改變時(shí),我們也不用再去更新自己的兼容判定代碼,只需要服務(wù)端像往常一樣對 Accept 字段進(jìn)行檢查即可。
由此也可以看出,我們 WebP 格式的局限性確實(shí)比較明顯,如果決定使用 WebP,兼容性處理是必不可少的。
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。