小編給大家分享一下html中如何實現懶加載,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創新互聯主要為客戶提供服務項目涵蓋了網頁視覺設計、VI標志設計、營銷推廣、網站程序開發、HTML5響應式網站建設公司、手機網站制作設計、微商城、網站托管及網站維護公司、WEB系統開發、域名注冊、國內外服務器租用、視頻、平面設計、SEO優化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經為三輪攪拌車行業客戶提供了網站改版服務。優勢
性能收益:瀏覽器加載圖片、decode、渲染都需要耗費資源,懶加載能節約性能消耗,縮短onload事件時間。
節約帶寬:這個不需要解釋。
通常,我們在html中展示圖片,會有兩種方式:
img 標簽
css background-image
img有兩種方式實現懶加載:
事件監聽(scroll、resize、orientationChange)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>event</title> <style> img { background: #F1F1FA; width: 400px; height: 300px; display: block; margin: 10px auto; border: 0; } </style> </head> <body> <img src="https://cache.yisu.com/upload/information/20200318/89/8338.jpg?tr=w-400,h-300" /> <img src="https://cache.yisu.com/upload/information/20200318/89/8339.jpg?tr=w-400,h-300" /> <img src="https://cache.yisu.com/upload/information/20200318/89/8340.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8339.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8340.jpg?tr=w-400,h-300" /> --> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8341.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8342.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8343.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8345.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8346.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8355.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8356.jpg?tr=w-400,h-300" /> <script> document.addEventListener("DOMContentLoaded", function() { var lazyloadImages = document.querySelectorAll("img.lazy"); var lazyloadThrottleTimeout; function lazyload () { if(lazyloadThrottleTimeout) { clearTimeout(lazyloadThrottleTimeout); } lazyloadThrottleTimeout = setTimeout(function() { var scrollTop = window.pageYOffset; lazyloadImages.forEach(function(img) { if(img.offsetTop < (window.innerHeight + scrollTop)) { img.src = img.dataset.src; img.classList.remove('lazy'); } }); if(lazyloadImages.length == 0) { document.removeEventListener("scroll", lazyload); window.removeEventListener("resize", lazyload); window.removeEventListener("orientationChange", lazyload); } }, 20); } document.addEventListener("scroll", lazyload); window.addEventListener("resize", lazyload); window.addEventListener("orientationChange", lazyload); }); </script> </body> </html>
Intersection Observer(兼容性問題)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>observer</title> <style> img { background: #F1F1FA; width: 400px; height: 300px; display: block; margin: 10px auto; border: 0; } </style> </head> <body> <img src="https://cache.yisu.com/upload/information/20200318/89/8339.jpg?tr=w-400,h-300" /> <img src="https://cache.yisu.com/upload/information/20200318/89/8340.jpg?tr=w-400,h-300" /> --> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8338.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8339.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8340.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8341.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8342.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8343.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8345.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8346.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8355.jpg?tr=w-400,h-300" /> <img class="lazy" src="https://cache.yisu.com/upload/information/20200318/89/8356.jpg?tr=w-400,h-300" /> <script> document.addEventListener("DOMContentLoaded", function() { var lazyloadImages = document.querySelectorAll(".lazy"); var imageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { var image = entry.target; image.src = image.dataset.src; image.classList.remove("lazy"); imageObserver.unobserve(image); } }); }); lazyloadImages.forEach(function(image) { imageObserver.observe(image); }); }); </script> </body> </html>
background-image的實現跟img的原理基本是一樣的,區別是在對class的處理上:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>background</title> <style> body { margin: 0; } .bg { height: 200px; } #bg-image.lazy { background-image: none; background-color: #F1F1FA; } #bg-image { background-image: url("https://cache.yisu.com/upload/information/20200318/89/8338.jpg?tr=w-400,h-300"); background-size: 100%; } </style> </head> <body> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <p id="bg-image" class="bg lazy"></p> <script> document.addEventListener("DOMContentLoaded", function() { var lazyloadImages = document.querySelectorAll(".lazy"); var imageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { var image = entry.target; image.classList.remove("lazy"); imageObserver.unobserve(image); } }); }); lazyloadImages.forEach(function(image) { imageObserver.observe(image); }); }); </script> </body> </html>
漸進式懶加載,指的是存在降級處理,通常html形式如下:
<a href="full.jpg" class="progressive replace"> <img src="tiny.jpg" class="preview" alt="image" /> </a>
這樣的代碼會有2個好處:
如果js執行失敗,可以點擊預覽
大小與實際圖一致的占位data URI,避免reflow
最終的代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>progressive</title> <style> a.progressive { position: relative; display: block; overflow: hidden; outline: none; } a.progressive:not(.replace) { cursor: default; } a.progressive img { display: block; width: 100%; max-width: none; height: auto; border: 0 none; } a.progressive img.preview { filter: blur(2vw); transform: scale(1.05); } a.progressive img.reveal { position: absolute; left: 0; top: 0; will-change: transform, opacity; animation: reveal 1s ease-out; } @keyframes reveal { 0% {transform: scale(1.05); opacity: 0;} 100% {transform: scale(1); opacity: 1;} } </style> </head> <body> <a href="https://cache.yisu.com/upload/information/20200318/89/8357.jpg" srcset="https://cache.yisu.com/upload/information/20200318/89/8357.jpg 800w, https://cache.yisu.com/upload/information/20200318/89/8358.jpg 1600w" class="progressive replace"> <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh2c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gNzAK/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8AAEQgABQAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh5uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h6eoKDhIWGh5iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A5yC3e2S3gM7OEQHdgA57VTuLAPqUoaUk7yM7R2BPSiivS5VN8stjmk2ldGVM3lyshG7bxk0UUV4skk2jdN2P/9k=" class="preview" alt="palm trees" /> </a> <a href="https://cache.yisu.com/upload/information/20200318/89/8361.jpg" class="progressive replace"> <img src="http://lorempixel.com/20/15/nature/2/" class="preview" alt="sunset" /> </a> <a href="https://cache.yisu.com/upload/information/20200318/89/8362.jpg" class="progressive replace"> <img src="http://lorempixel.com/20/15/nature/3/" class="preview" alt="tide" /> </a> <a href="https://cache.yisu.com/upload/information/20200318/89/8357.jpg" srcset="https://cache.yisu.com/upload/information/20200318/89/8357.jpg 800w, https://cache.yisu.com/upload/information/20200318/89/8358.jpg 1600w" class="progressive replace"> <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh2c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gNzAK/9sAQwAKBwcIBwYKCAgICwoKCw4YEA4NDQ4dFRYRGCMfJSQiHyIhJis3LyYpNCkhIjBBMTQ5Oz4+PiUuRElDPEg3PT47/9sAQwEKCwsODQ4cEBAcOygiKDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7/8AAEQgABQAUAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh5uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h6eoKDhIWGh5iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A5yC3e2S3gM7OEQHdgA57VTuLAPqUoaUk7yM7R2BPSiivS5VN8stjmk2ldGVM3lyshG7bxk0UUV4skk2jdN2P/9k=" class="preview" alt="palm trees" /> </a> <a href="https://cache.yisu.com/upload/information/20200318/89/8361.jpg" class="progressive replace"> <img src="http://lorempixel.com/20/15/nature/2/" class="preview" alt="sunset" /> </a> <a href="https://cache.yisu.com/upload/information/20200318/89/8362.jpg" class="progressive replace"> <img src="http://lorempixel.com/20/15/nature/3/" class="preview" alt="tide" /> </a> <script> window.addEventListener('load', function() { var pItem = document.getElementsByClassName('progressive replace'), timer; window.addEventListener('scroll', scroller, false); window.addEventListener('resize', scroller, false); inView(); function scroller(e) { timer = timer || setTimeout(function() { timer = null; requestAnimationFrame(inView); }, 300); } function inView() { var scrollTop = window.pageYOffset; var innerHeight = window.innerHeight; var p = 0; while (p < pItem.length) { var offsetTop = pItem[p].offsetTop; if (offsetTop < (scrollTop + innerHeight)) { loadFullImage(pItem[p]); pItem[p].classList.remove('replace'); } else p++; } } function loadFullImage(item) { var img = new Image(); if (item.dataset) { img.srcset = item.dataset.srcset || ''; img.sizes = item.dataset.sizes || ''; } img.src = item.href; img.className = 'reveal'; if (img.complete) addImg(); else img.onload = addImg; function addImg() { item.addEventListener('click', function(e) { e.preventDefault(); }, false); item.appendChild(img).addEventListener('animationend', function(e) { var pImg = item.querySelector('img.preview'); if (pImg) { e.target.alt = pImg.alt || ''; item.removeChild(pImg); e.target.classList.remove('reveal'); } }); } } }, false); </script> </body> </html>
以上是html中如何實現懶加載的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前標題:html中如何實現懶加載-創新互聯
分享URL:http://vcdvsql.cn/article26/egsjg.html
成都網站建設公司_創新互聯,為您提供網站收錄、全網營銷推廣、軟件開發、網站導航、電子商務、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯