做者:hateonionjavascript
https://hateonion.me/posts/19jan30/php
爲何要作圖片的懶加載
圖片懶加載的原理
圖片懶加載的簡單實現
<!-- index.html --> <img src="placeholder.jpg" src="real_image.jpt" />
// index.css
img[src] { filter: blur(0.2em); }
img { filter: blur(0em); transition: filter 0.5s; }
(function lazyLoad(){ const imageToLazy = document.querySelectorAll('img[src]'); const loadImage = function (image) { image.setAttribute('src', image.getAttribute('src')); image.addEventListener('load', function() { image.removeAttribute("src"); }) }
imageToLazy.forEach(function(image){ loadImage(image); })})()
圖片懶加載的進階實現–滾動加載
(function lazyLoad(){ const imageToLazy = document.querySelectorAll('img[src]'); const loadImage = function (image) { image.setAttribute('src', image.getAttribute('src')); image.addEventListener('load', function() { image.removeAttribute("src"); }) }
const intersectionObserver = new IntersectionObserver(function(items, observer) { items.forEach(function(item) { if(item.isIntersecting) { loadImage(item.target); observer.unobserve(item.target); } }); });
imageToLazy.forEach(function(image){ intersectionObserver.observe(image); })})()
如何選擇合適的Placeholder圖片
圖片尺寸已知
圖片尺寸未知
懶加載防止佈局抖動
<div class="lazy-load__container feature"> <img src="placeholder.jpg" src="real.jpg" /></div>
.lazy-load__container{ position: relative; display: block; height: 0;}
.lazy-load__container.feature { // feature image 的高寬比設置成42.8% // 對於其餘圖片 好比 post圖片,高寬比可能會不一樣,可使用其餘css class去設置 padding-bottom: 42.8%;}
.lazy-load__container img { position: absolute; top:0; left:0; height: 100%; width: 100%;}
像Medium同樣懶加載圖片
-
使用 aspect ratio box 建立佔位元素。 -
在html解析時只加載一個小尺寸的圖片,而且添加blur效果。 -
最後使用js選擇性的加載真實圖片。
總結
-
懶加載用戶當前視窗中的圖片能夠提高頁面的加載性能。 -
懶加載的思路是在html解析時先加載一個placeholder圖片,最後再用js選擇性的加載真實圖片。 -
若是須要滾動加載可使用 Intersection Observer 。 -
對於固定尺寸和不定尺寸的圖片,咱們能夠選擇不一樣的服務去或者placeholder圖片。 -
對於圖片尺寸不肯定引發的佈局抖動問題咱們可使用 aspect ratio box 來解決。
參考資料
Progressive Loading Lazy loading with responsive images and unknown height Simple image placeholders for lazy loading images How Medium does progressive image loading Sizing Fluid Image Containers with a Little CSS Padding Hack
點個『在看』支持下 css
本文分享自微信公衆號 - 前端技術江湖(bigerfe)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。html