js前端實現(xiàn)圖片懶加載(lazyload)的兩種方式
在實際的項目開發(fā)中,我們通常會遇見這樣的場景:一個頁面有很多圖片,而首屏出現(xiàn)的圖片大概就一兩張,那么我們還要一次性把所有圖片都加載出來嗎?顯然這是愚蠢的,不僅影響頁面渲染速度,還浪費帶寬。這也就是們通常所說的首屏加載,技術(shù)上現(xiàn)實其中要用的技術(shù)就是圖片懶加載--到可視區(qū)域再加載。
思路:
將頁面里所有img屬性src屬性用data-xx代替,當(dāng)頁面滾動直至此圖片出現(xiàn)在可視區(qū)域時,用js取到該圖片的data-xx的值賦給src。
關(guān)于各種寬高:
- 頁可見區(qū)域?qū)挘?document.body.clientWidth;
- 網(wǎng)頁可見區(qū)域高: document.body.clientHeight;
- 網(wǎng)頁可見區(qū)域?qū)挘?document.body.offsetWidth (包括邊線的寬);
- 網(wǎng)頁可見區(qū)域高: document.body.offsetHeight (包括邊線的寬);
- 網(wǎng)頁正文全文寬: document.body.scrollWidth;
- 網(wǎng)頁正文全文高: document.body.scrollHeight;
- 網(wǎng)頁被卷去的高: document.body.scrollTop;
- 網(wǎng)頁被卷去的左: document.body.scrollLeft;
- 網(wǎng)頁正文部分上: window.screenTop;
- 網(wǎng)頁正文部分左: window.screenLeft;
- 屏幕分辨率的高: window.screen.height;
- 屏幕分辨率的寬: window.screen.width;
- 屏幕可用工作區(qū)高度: window.screen.availHeight;
示例:
jqueryLazyload方式
下載地址:https://github.com/helijun/helijun/blob/master/plugin/lazyLoad/jquery.lazyload.js
<section class="module-section" id="container"> <img class="lazy-load" data-original="../static/img/loveLetter/teacher/teacher1.jpg" width="640" height="480" alt="測試懶加載圖片"/> </section>
require.config({ baseUrl : "/static", paths: { jquery:'component/jquery/jquery-3.1.0.min' jqueryLazyload: 'component/lazyLoad/jquery.lazyload',//圖片懶加載 }, shim: { jqueryLazyload: { deps: ['jquery'], exports: '$' } } });
require( [ 'jquery', 'jqueryLazyload' ], function($){ $(document).ready(function() { $("img.lazy-load").lazyload({ effect : "fadeIn", //漸現(xiàn),show(直接顯示),fadeIn(淡入),slideDown(下拉) threshold : 180, //預(yù)加載,在圖片距離屏幕180px時提前載入 event: 'click', // 事件觸發(fā)時才加載,click(點擊),mouseover(鼠標(biāo)劃過),sporty(運動的),默認(rèn)為scroll(滑動) container: $("#container"), // 指定對某容器中的圖片實現(xiàn)效果 failure_limit:2 //加載2張可見區(qū)域外的圖片,lazyload默認(rèn)在找到第一張不在可見區(qū)域里的圖片時則不再繼續(xù)加載,但當(dāng)HTML容器混亂的時候可能出現(xiàn)可見區(qū)域內(nèi)圖片并沒加載出來的情況 }); }); });
為了代碼可讀性,屬性值我都寫好了注釋。值得注意的是預(yù)制圖片屬性為data-original,并且最好是給予初始高寬占位,以免影響布局,當(dāng)然這里為了演示我是寫死的640x480,如果是響應(yīng)式頁面,高寬需要動態(tài)計算。
echo.js方式
在前面“前端知識的一些總結(jié)”的博文中,介紹了一款非常簡單實用輕量級的圖片延時加載插件echo.js,如果你的項目中沒有依賴jquery,那么這將是個不錯的選擇,50行代碼,壓縮后才1k。當(dāng)然你完全可以集成到自己項目中去!
下載地址:https://github.com/helijun/helijun/tree/master/plugin/echo
<style> .demo img { width: 736px; height: 490px; background: url(images/loading.gif) 50% no-repeat;} </style>
<div class="demo"> <img class="lazy" src="images/blank.gif" data-echo="images/big-1.jpg"> </div>
<script src="js/echo.min.js"></script> <script> Echo.init({ offset: 0,//離可視區(qū)域多少像素的圖片可以被加載 throttle: 0 //圖片延時多少毫秒加載 }); </script>
說明:blank.gif是一張背景圖片,包含在插件里了。圖片的寬高必須設(shè)定,當(dāng)然,可以使用外部樣式對多張圖片統(tǒng)一控制大小。data-echo指向的是真正的圖片地址。
總結(jié):
兩者都非常簡單,實現(xiàn)思路是一樣的,只是jquerylazyload多幾個屬性。其實常用的echo就足夠了,并且完全可以集成到自己項目中的公共js中,圖片懶加載是相當(dāng)常見且簡單實用的功能,如果你的項目中還是傻瓜式的一次性全部加載,那么請花20分鐘優(yōu)化下~
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實現(xiàn)iframe編輯器光標(biāo)位置插入內(nèi)容的方法(兼容IE和Firefox)
這篇文章主要介紹了JS實現(xiàn)iframe編輯器光標(biāo)位置插入內(nèi)容的方法,可實現(xiàn)文本與圖片的插入功能,并兼容IE和Firefox瀏覽器,需要的朋友可以參考下2016-06-06JavaScript中的函數(shù)申明、函數(shù)表達(dá)式、箭頭函數(shù)
js中的函數(shù)可以通過幾種方式創(chuàng)建,具體創(chuàng)建方法通過實例代碼給大家介紹的非常詳細(xì),文中通過例子給大家介紹了函數(shù)聲明和表達(dá)式之間的差別,感興趣的朋友跟隨小編一起看看吧2019-12-12bootstrap fileinput組件整合Springmvc上傳圖片到本地磁盤
這篇文章主要介紹了bootstrap fileinput組件整合Springmvc上傳圖片到本地磁盤的方法,需要的朋友可以參考下2017-05-05js和jquery批量綁定事件傳參數(shù)一(新豬豬原創(chuàng))
js綁定事件傳參,javascript綁定事件傳參數(shù),jquery綁定事件傳參數(shù)2010-06-06javascript 在網(wǎng)頁中的運用(asp.net)
javascript在網(wǎng)頁中的運用實現(xiàn),需要的朋友可以參考下。2009-11-11