摘要:一個簡單的圖片懶加載共涉及兩個方面,約定我們首先需要給準備實施懶加載的元素添加指定的這里為同時將賦值給屬性。
源碼地址
歡迎一起交流插件完整版地址 m-lazy
https://github.com/zhanyouwei...
歡迎關注我的個人公眾號,不定期更新自己的工作心得。
Web 圖片的懶加載就是通過讀取img元素,然后獲得img元素的data-src(也可以約定為其他屬性名)屬性的值,并賦予img的src,從而實現動態加載圖片的機制。
這里需要注意的是: img在初始化的時候不要設置src屬性,因為即使設置 src="" 瀏覽器也會嘗試加載圖片。
一個簡單的圖片懶加載共涉及兩個方面,
1. HTML 約定我們首先需要給準備實施懶加載的img元素添加指定的class 這里為m-lazyload ,同時將img src賦值給 data-src屬性。
具體示例為:
動態加載總共分為以下幾個步驟,這里每個步驟都將被拆分為獨立的函數
window.addEventListener("scroll", _delay, false); function _delay() { clearTimeout(delay); delay = setTimeout(function () { _loadImage(); }, time); }
function _loadImage() { for (var i = imgList.length; i--;) { var el = imgList[i]; if (_isShow(el)) { el.src = el.getAttribute("data-src"); el.className = el.className.replace(new RegExp("(s|^)" + _selector.substring(1, _selector.length) + "(s|$)"), " "); imgList.splice(i, 1); } } }
雖然執行了_loadImage函數,但是我們得知道哪些圖片需要被加載,這里的判斷依據是什么呢?
依據就是判斷該圖片是否在當前窗口的可視區域內,在這里我們封裝一個_isShow函數來實現
function _isShow(el) { var coords = el.getBoundingClientRect(); return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset)); }
自此一個圖片加載的閉環就形成了
當網頁滾動的事件被觸發 -> 執行加載圖片操作 -> 判斷圖片是否在可視區域內 -> 在,則動態將data-src的值賦予該圖片。
太簡單了?事實就是如此!!!
如此簡單,不妨擴展一下添加一些自定義參數,誰都喜歡自定義,不是嗎?
支持iScroll, iScroll是一個高性能,資源占用少,無依賴,多平臺的javascript滾動插件。
圖片加載后移除選擇器,避免重復判斷。
緩存img元素結合,減少dom元素查詢性能損耗
擴展prototype添加getNode方法,支持分頁數據懶加載(由于我們之前緩存了dom元素)
OK!說了這么多,show me the code 吧!
(function () { var imgList = [], // 頁面所有img元素集合 delay, // setTimeout 對象 offset, //偏移量,用于指定圖片距離可視區域多少距離,進行加載 time, // 延遲載入時間 _selector; // 選擇器 默認為 .m-lazyload function _isShow(el) { var coords = el.getBoundingClientRect(); return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset)); } function _loadImage() { for (var i = imgList.length; i--;) { var el = imgList[i]; if (_isShow(el)) { el.src = el.getAttribute("data-src"); el.className = el.className.replace(new RegExp("(s|^)" + _selector.substring(1, _selector.length) + "(s|$)"), " "); imgList.splice(i, 1); } } } function _delay() { clearTimeout(delay); delay = setTimeout(function () { _loadImage(); }, time); } function ImageLazyload(selector, options) { var defaults = options || {}; offset = defaults.offset || 0; time = defaults.time || 250; _selector = selector || ".m-lazyload"; this.getNode(); _delay();//避免首次加載未觸發touch事件,主動觸發一次加載函數 if (defaults.iScroll) { defaults.iScroll.on("scroll", _delay); defaults.iScroll.on("scrollEnd", _delay); } else { window.addEventListener("scroll", _delay, false); } } ImageLazyload.prototype.getNode = function () { imgList = []; var nodes = document.querySelectorAll(_selector); for (var i = 0, l = nodes.length; i < l; i++) { imgList.push(nodes[i]); } }; })();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/49805.html
摘要:一個簡單的圖片懶加載共涉及兩個方面,約定我們首先需要給準備實施懶加載的元素添加指定的這里為同時將賦值給屬性。 源碼地址 插件完整版地址 m-lazyhttps://github.com/zhanyouwei... 歡迎一起交流 歡迎關注我的個人公眾號,不定期更新自己的工作心得。showImg(https://segmentfault.com/img/bVEk23?w=258&h=258...
摘要:前端優化已經是一個被寫爛的題材了。前端模板方案有很多。重繪是瀏覽器性能優化的一個重點,特別是針對的優化。如果你對前端性能優化有自己的想法,歡迎騷擾我。 前端優化已經是一個被寫爛的題材了。 雖千萬人吾往矣,這里我僅分享我的一些實踐經驗。 歡迎一起交流 歡迎關注我的個人公眾號,不定期更新自己的工作心得。 showImg(https://segmentfault.com/img/remote...
摘要:前端優化已經是一個被寫爛的題材了。前端模板方案有很多。重繪是瀏覽器性能優化的一個重點,特別是針對的優化。如果你對前端性能優化有自己的想法,歡迎騷擾我。 前端優化已經是一個被寫爛的題材了。 雖千萬人吾往矣,這里我僅分享我的一些實踐經驗。 歡迎一起交流 歡迎關注我的個人公眾號,不定期更新自己的工作心得。 showImg(https://segmentfault.com/img/remote...
閱讀 1740·2021-11-24 10:18
閱讀 2252·2021-11-18 13:20
閱讀 2343·2021-08-23 09:46
閱讀 1001·2019-08-30 15:56
閱讀 2849·2019-08-30 15:53
閱讀 745·2019-08-30 14:22
閱讀 476·2019-08-29 15:34
閱讀 2542·2019-08-29 12:14