JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式
引言
現(xiàn)在的科技發(fā)達(dá),圖片的資源占比越來(lái)越大,對(duì)圖片在頁(yè)面的優(yōu)化已經(jīng)成為前端開(kāi)發(fā)必備的技術(shù)之一,難的圖片懶加載方法咱們看著頭大,簡(jiǎn)單,易懂的才適合我們程序員。
很好,開(kāi)始第一步將圖片的標(biāo)簽放好,設(shè)定一個(gè)data-origin標(biāo)簽在img當(dāng)中,這樣使用data-的命名方式是為了與HTML5的自定義數(shù)據(jù)屬性約定保持一致。
簡(jiǎn)單的方式
思路就是
- 先獲取到可視區(qū)域,我們使用
clientHeight,它可以獲取到html元素的客戶端高度。 - 獲取到帶有
data-origin標(biāo)簽的全部img屬性 - 獲取每張圖片相對(duì)視窗口的高度,使用
getBoundingClientRect,其中包含各種元素相對(duì)于視口的信息和元素本身的信息。 - 一旦圖片相對(duì)于視窗頂部的距離小于可視區(qū)域高度,那就將
data-origin標(biāo)簽的url賦給src,最后清除data-origin標(biāo)簽。
<style>
img{
height: 300px;
width: 300px;
margin-bottom: 50px;
display: block;
}
</style>
</head>
<body>
<img src="" data-origin="https://t7.baidu.com/it/u=2604797219,1573897854&fm=193&f=GIF" alt="">
<img src="" data-origin="https://img1.baidu.com/it/u=435134468,1942448903&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=889" alt="">
<img src="" data-origin="https://img0.baidu.com/it/u=3628503530,464378779&fm=253&fmt=auto&app=120&f=JPEG?w=1200&h=800">
<img src="" data-origin="https://img2.baidu.com/it/u=855369075,175194576&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500" alt="">
<img src="" data-origin="https://img2.baidu.com/it/u=2004708195,3393283717&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500" alt="">
<img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt="">
<img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt="">
<img src="" data-origin="https://img0.baidu.com/it/u=2788901948,3907873318&fm=253&fmt=auto?w=500&h=281" alt="">
<img src="" data-origin="https://img2.baidu.com/it/u=811993169,635123395&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=889" alt="">
<img src="" data-origin="https://img0.baidu.com/it/u=924031950,2251460669&fm=253&fmt=auto&app=138&f=JPEG?w=1105&h=500" alt="">
<script>
//獲取可視區(qū)域的高度 offsetHeight包含外部高度(邊框)
const viewHeight = document.documentElement.clientHeight //window.innerHeight
// console.log(viewHeight);
function lazyLoad(){
const imgs = document.querySelectorAll('img[data-origin]') //屬性選擇
console.log(imgs);
imgs.forEach(item =>{
let res = item.getBoundingClientRect()
// console.log(res);
if(res.top < viewHeight){
item.src = item.dataset.origin
item.removeAttribute('data-origin')
}
})
// 獲取可視區(qū)域的高度
// const viewHeight = document.documentElement.clientHeight
// const io = new IntersectionObserver(
// (entries) => {
// entries.forEach(entry => {
// if (entry.isIntersecting) {
// entry.target.src = entry.target.dataset.original || ''
// entry.target.removeAttribute('data-original')
// io.unobserve(entry.target)
// }
// })
// },
// {
// threshold: 0
// }
// )
// const imgs = document.querySelectorAll('img[data-original]')
// imgs.forEach(item => {
// io.observe(item)
// })
}
document.addEventListener('scroll',lazyLoad)
lazyLoad()
</script>
</body>
第二個(gè)方法
第二個(gè)方法就相對(duì)更復(fù)雜一些,通過(guò)判斷某個(gè)元素和父元素交叉比例來(lái)判斷是否需要懶加載。是異步監(jiān)聽(tīng)的。當(dāng)交叉比例達(dá)到某個(gè)值就會(huì)觸發(fā)回調(diào)函數(shù)。我們這里使用的是IntersectionObserver方法,用一個(gè)外部box包裹所有圖片,讓圖片超出box就滾動(dòng)??戳松厦娴姆椒ǎ@個(gè)方法也就明白在干什么了。
#box{
width: 100vw;
height: 100vh;
overflow: scroll;
}
img{
height: 300px;
margin-bottom: 50px;
display: block;
}
const viewHeight = document.documentElement.clientHeight
const io = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
//判斷是否進(jìn)入可視區(qū)
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.original || ''
//移除標(biāo)簽
entry.target.removeAttribute('data-original')
io.unobserve(entry.target)
}
})
},
{
取值范圍從0~1,表示交叉比例
threshold: 0
}
)
//監(jiān)聽(tīng)每一張圖片
const imgs = document.querySelectorAll('img[data-original]')
imgs.forEach(item => {
io.observe(item)
})
到此這篇關(guān)于JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式的文章就介紹到這了,更多相關(guān)JavaScript圖片懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實(shí)現(xiàn)時(shí)間格式輸出FormatDate函數(shù)
這篇文章主要介紹了javascript實(shí)現(xiàn)時(shí)間格式輸出FormatDate函數(shù),可實(shí)現(xiàn)fmt標(biāo)簽一樣對(duì)日期時(shí)間型內(nèi)容格式輸入的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2015-01-01
小程序中canvas的drawImage方法參數(shù)使用詳解
這篇文章主要介紹了小程序中canvas的drawImage方法參數(shù)使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
JavaScript參數(shù)個(gè)數(shù)可變的函數(shù)舉例說(shuō)明
JavaScript允許一個(gè)函數(shù)傳遞個(gè)數(shù)可變的參數(shù),因?yàn)橛衋rguments這個(gè)內(nèi)置對(duì)象,它一個(gè)函數(shù)傳遞的所有參數(shù)的數(shù)組2014-10-10
location對(duì)象的屬性和方法應(yīng)用(解析URL)
本文將與大家分享下location對(duì)象使用屬性和方法來(lái)解析URL的實(shí)例,感興趣的朋友可以參考下,希望對(duì)你有所幫助2013-04-04
微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問(wèn)題解決
這篇文章主要介紹了微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
微信小程序的開(kāi)發(fā)范式BeautyWe.js入門詳解
這篇文章主要介紹了微信小程序的開(kāi)發(fā)范式BeautyWe.js詳解,它是一套專注于微信小程序的企業(yè)級(jí)開(kāi)發(fā)范式,它的愿景是:讓企業(yè)級(jí)的微信小程序項(xiàng)目中的代碼,更加簡(jiǎn)單、漂亮,需要的朋友可以參考下2019-07-07
javascript自動(dòng)給文本url地址增加鏈接的方法分享
這篇文章主要介紹了javascript自動(dòng)給文本url地址增加鏈接的方法,有需要的朋友可以參考一下2014-01-01

