js前端實(shí)現(xiàn)圖片懶加載(lazyload)的兩種方式
在實(shí)際的項(xiàng)目開(kāi)發(fā)中,我們通常會(huì)遇見(jiàn)這樣的場(chǎng)景:一個(gè)頁(yè)面有很多圖片,而首屏出現(xiàn)的圖片大概就一兩張,那么我們還要一次性把所有圖片都加載出來(lái)嗎?顯然這是愚蠢的,不僅影響頁(yè)面渲染速度,還浪費(fèi)帶寬。這也就是們通常所說(shuō)的首屏加載,技術(shù)上現(xiàn)實(shí)其中要用的技術(shù)就是圖片懶加載--到可視區(qū)域再加載。
思路:
將頁(yè)面里所有img屬性src屬性用data-xx代替,當(dāng)頁(yè)面滾動(dòng)直至此圖片出現(xiàn)在可視區(qū)域時(shí),用js取到該圖片的data-xx的值賦給src。
關(guān)于各種寬高:
- 頁(yè)可見(jiàn)區(qū)域?qū)挘?document.body.clientWidth;
- 網(wǎng)頁(yè)可見(jiàn)區(qū)域高: document.body.clientHeight;
- 網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)挘?document.body.offsetWidth (包括邊線的寬);
- 網(wǎng)頁(yè)可見(jiàn)區(qū)域高: document.body.offsetHeight (包括邊線的寬);
- 網(wǎng)頁(yè)正文全文寬: document.body.scrollWidth;
- 網(wǎng)頁(yè)正文全文高: document.body.scrollHeight;
- 網(wǎng)頁(yè)被卷去的高: document.body.scrollTop;
- 網(wǎng)頁(yè)被卷去的左: document.body.scrollLeft;
- 網(wǎng)頁(yè)正文部分上: window.screenTop;
- 網(wǎng)頁(yè)正文部分左: 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="測(cè)試懶加載圖片"/> </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時(shí)提前載入
event: 'click', // 事件觸發(fā)時(shí)才加載,click(點(diǎn)擊),mouseover(鼠標(biāo)劃過(guò)),sporty(運(yùn)動(dòng)的),默認(rèn)為scroll(滑動(dòng))
container: $("#container"), // 指定對(duì)某容器中的圖片實(shí)現(xiàn)效果
failure_limit:2 //加載2張可見(jiàn)區(qū)域外的圖片,lazyload默認(rèn)在找到第一張不在可見(jiàn)區(qū)域里的圖片時(shí)則不再繼續(xù)加載,但當(dāng)HTML容器混亂的時(shí)候可能出現(xiàn)可見(jiàn)區(qū)域內(nèi)圖片并沒(méi)加載出來(lái)的情況
});
});
});
為了代碼可讀性,屬性值我都寫好了注釋。值得注意的是預(yù)制圖片屬性為data-original,并且最好是給予初始高寬占位,以免影響布局,當(dāng)然這里為了演示我是寫死的640x480,如果是響應(yīng)式頁(yè)面,高寬需要?jiǎng)討B(tài)計(jì)算。
echo.js方式
在前面“前端知識(shí)的一些總結(jié)”的博文中,介紹了一款非常簡(jiǎn)單實(shí)用輕量級(jí)的圖片延時(shí)加載插件echo.js,如果你的項(xiàng)目中沒(méi)有依賴jquery,那么這將是個(gè)不錯(cuò)的選擇,50行代碼,壓縮后才1k。當(dāng)然你完全可以集成到自己項(xià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 //圖片延時(shí)多少毫秒加載
});
</script>
說(shuō)明:blank.gif是一張背景圖片,包含在插件里了。圖片的寬高必須設(shè)定,當(dāng)然,可以使用外部樣式對(duì)多張圖片統(tǒng)一控制大小。data-echo指向的是真正的圖片地址。
總結(jié):
兩者都非常簡(jiǎn)單,實(shí)現(xiàn)思路是一樣的,只是jquerylazyload多幾個(gè)屬性。其實(shí)常用的echo就足夠了,并且完全可以集成到自己項(xiàng)目中的公共js中,圖片懶加載是相當(dāng)常見(jiàn)且簡(jiǎn)單實(shí)用的功能,如果你的項(xiàng)目中還是傻瓜式的一次性全部加載,那么請(qǐng)花20分鐘優(yōu)化下~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript判斷數(shù)組是否存在key的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇JavaScript判斷數(shù)組是否存在key的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
js借助ActiveXObject實(shí)現(xiàn)創(chuàng)建文件
創(chuàng)建文件的方法有很多,在本文為大家詳細(xì)介紹下js中時(shí)如何實(shí)現(xiàn)的,感興趣的朋友不要錯(cuò)過(guò)了2013-09-09
ztree獲取當(dāng)前選中節(jié)點(diǎn)子節(jié)點(diǎn)id集合的方法
這篇文章主要介紹了ztree獲取當(dāng)前選中節(jié)點(diǎn)子節(jié)點(diǎn)id集合的方法,實(shí)例分析了ztree的方法transformToArray使用技巧,需要的朋友可以參考下2015-02-02
JavaScript實(shí)現(xiàn)復(fù)選框全選和取消全選
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)復(fù)選框全選和取消全選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11
JavaScript中的observables?操作符創(chuàng)建實(shí)例
這篇文章主要介紹了JavaScript中的observables?操作符創(chuàng)建實(shí)例的相關(guān)資料,文章介紹詳細(xì),需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-03-03
networkInformation.downlink測(cè)用戶網(wǎng)速方法詳解
這篇文章主要為大家介紹了networkInformation.downlink測(cè)用戶網(wǎng)速方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
微信小程序在web-view頁(yè)面增加一個(gè)按鈕具體代碼
web-view是一個(gè)可以用來(lái)承載網(wǎng)頁(yè)的容器,會(huì)自動(dòng)鋪滿整個(gè)小程序頁(yè)面,這篇文章主要給大家介紹了關(guān)于微信小程序在web-view頁(yè)面增加一個(gè)按鈕的具體代碼,需要的朋友可以參考下2023-10-10

