前端圖片優化一直以來都是熱門話題,從需求上來看,不少站點每每是圖片體積大於代碼體積, 圖片請求多餘代碼文件請求, 給前端的性能帶來了很大的困擾,那麼應該如何解決呢? css
零、 認識圖片html
咱們一般使用的圖片就是gif、png和jpg了。 前端
其中,gif格式是比較老的圖片格式,它的色彩效果最低(就是不清楚!!!),若是想要使用gif保存鮮豔圖片會讓你的網站看上去很是可怕。 可是gif有着不可忽視的優勢:體積小、有着極好的壓縮效果,支持動畫,而且支持透明效果,雖然這個透明沒有PNG格式圖片支持的強大。。。 動畫選擇gif沒有錯,若是你的圖片只有單調的色彩, 沒有漸變色,例如只有紅藍兩色,那麼選擇gif就再好不過了。 vue
另外,PNG圖片能夠說是最適合網絡的圖片了,優勢就是 無損壓縮,壓縮比率很高, 可漸變透明, 幾乎具有全部GIF的優勢, 缺點是不如JPG格式的顏色色彩豐富, 一樣的圖片體積也比JPG略大,可是PNG圖片應該是網站設計上最爲推廣的,好比Google就是一個很好的例子,它的全部站點中幾乎都是使用的PNG格式, 並且8位的PNG徹底能夠替代掉GIF。 bootstrap
各方面比較:緩存
大小比較:一般地,PNG ≈ JPG > GIF
透明性:PNG > GIF > JPG
色彩豐富程度:JPG > PNG >GIF
兼容程度:GIF ≈ JPG > PNG
1、雪碧圖服務器
即css sprites, 就是把不少小圖片製做成一個大圖,而後做爲背景圖片使用,定位便可。網絡
優勢: 很明顯: 減小了大量的http請求。併發
缺點: 背景定位較爲麻煩,其實不算缺點。svg
2、圖片壓縮
圖片壓縮是很簡單的,就是無損壓縮了。
- 優先使用png而不是GIF
- 壓縮png
- 去掉jpg的metadata
- 壓縮gif動畫
- 嘗試使用png8
- 避免使用AlphaImageLoader
- 壓縮動態生成的圖像
- 使 favicon 更小,可緩存
- 使用css sprites
3、base64
base64編碼的大小比原圖大小更大一些,可是能夠減小http請求。
4、響應式圖片
通常咱們對於圖片的設定方法都是設置圖片爲width: 100%, 可是若是加載的圖片的實際尺寸很大,而咱們所須要的很小,那麼不可避免的就會形成浪費, 因此這時就可使用響應式圖片。
主要用到的屬性就是 srcset 和 sizes 屬性。
5、延遲加載
假設個人網頁很長很長,圖片不少不少(好比多圖慎點那種),可是我可能看了一下就沒興趣了,那是否是徹底沒有必要加載後面的圖片了,這個時候就要有一個延遲加載的思想。
圖片延遲加載也稱懶加載,一般應用於圖片比較多的網頁,若是一個頁面圖片比較多,且頁面高度或寬度有好幾屏,頁面初次加載時,只顯示可視區域的圖片(非可視區域圖片使用1*1的圖片佔位,圖片大小css控制),當頁面滾動的時候,圖片進入了可視區域再進行加載(修改src),這樣能夠顯著的提升頁面的加載速度,更少的圖片併發請求數也能夠減輕服務器的壓力。若是用戶僅僅在首屏停留,還能夠節省流量。具體的實現方法能夠看一個插件,就叫lazeload。
6、 圖標字體
用過bootstrap的同窗確定對方便的fontawesome圖標字體印象深入,能夠無損放大縮小,能夠修改顏色,只要加個類名就可使用圖標,感受是否是很爽🌚。優點呢。。。矢量&方便好用,不過圖標沒有必定的量可能不大須要,並且矢量圖可能美工壓力也比較大,咱們只要知道怎麼用就行啦,有的時候用現成的圖標減輕一下美工同窗的工做量也是極好的。能夠看一下一個專門用來作圖標字體的網站。
7、 SVG
svg做爲矢量圖,和iconfont對比起來優點可能就是字體可能在樣式修改方面受限較多,其次字體文件通常都弄的挺大的,而後兼容性差點。svg也能夠認爲就是圖片,使用方法也很簡單。
1.直接做爲圖片文件引入
<img src=「gblogo.svg」 onerror=「this.onerror=null; this.src=」gblogo.png「」> //or css background:url(gblogo.svg)
2.將svg代碼拷到html文件裏
<g class=「logo」 transform=「translate(0.000000,500.000000) scale(0.100000,-0.100000)」 fill=「#000000」 stroke=「none」> //本質上仍是一個標籤,能夠定義樣式 .logo:hover{ fill: #F08000;}
背景:最近所作的項目中,相似於餓了麼這樣的平臺,就是相對簡單一些,而且,對於每一件商品,都有一個詳情頁,必需要進入這個詳情頁,才能加載一個很大的圖片來展現圖片詳情。
問題:因爲圖片比較大, 因此下載的過程會比較慢,因此出現的狀況就是,剛開始只顯示一個背景層,緊接着圖片開始一點一點的加載出來,而不是徹底加載出來(恩,學過計算機網絡的同窗應該是知道緣由的), 這樣的用戶體驗並非很好。
改進方案: 首先,固定圖片外層div的高度和寬度,而後img設置爲100%(寬高都是如此),背景顏色要有,這樣,即便沒有顯示出來,也是能夠看得。重要,設置圖片的 onload 事件,首先要設置圖片爲display: none; 而後當圖片onload以後,咱們再將之加載出來,而且加載時透明度能夠是一個遞增的過程。 代碼大體以下(vue項目寫的):
<img src="picture" alt="" style="display: none;" v-on:load="getSomething($event)" >
js以下:
getSomething (e) { var target = e.currentTarget; target.style.opacity = 0; target.style.display = 'block' var timer = setInterval(function () { target.style.opacity = parseFloat(target.style.opacity) + 0.01; if (parseFloat(target.style.opacity) >= 0.98) { clearInterval(timer); } }, 30); }
這樣,圖片的顯示就是一個動態的過程, 也不會有視覺上的突變,看着會比較舒服。