在声明img元素时,只需要将其图片地址放到data-src中,并且声明class="lazyload"即可实现图片的懒加载效果。
示例:
<img data-src="https://xxxxxx.com?sjdijsa" class="lazyload">
<img data-src="https://xxxxxx.com?sjdijsa" class="lazyload">
调用lazyload函数,并传入参数。
- 第一个参数表示所有的img标签,可以根据具体的元素进行调整
- 第二个参数表示图片距离视口多少距离
lazyload(document.querySelectorAll('img'),0)
以下为实现的源码。
具体思路:每次触发scroll事件时(节流),找到所有含有class为lazyload的img标签。遍历所有标签,判断是否符合加载的要求,完成渲染。
lazyload(document.querySelectorAll('img'),0)
function lazyload(images,distance){
imgs = Array.from(images)
if('IntersectionObserver' in window){
let observer = new IntersectionObserver(function(entries){
entries.forEach(entry=>{
loadImage(entry.target,()=>{
observer.unobserve(entry.target)
})
})
},{threshold: 0.01})
imgs.forEach(img=>observer.observe(img))
}else{
document.onscroll = throttle(function(){
imgs = imgs.filter(img=>img.classList.contains('lazyload'))
imgs.forEach(img=>{
if(imgView(img,distance)){
loadImage(img)
}
})
},200)
document.dispatchEvent(new Event('scroll'))
}
function throttle(fn,wait){
let lastTime = null
let nowTime = null
return function(){
nowTime = new Date()
if(!lastTime || nowTime - lastTime > wait){
fn.apply(this,arguments)
lastTime = nowTime
}
}
}
function imgView(img,distance){
let { top } = img.getBoundingClientRect()
let viewHeight = document.documentElement.clientHeight
return top>0 && top<viewHeight+distance
}
function loadImage(img,callback){
let image = new Image()
image.src = img.dataset.src
image.onload = function(){
img.src = image.src
img.classList.remove('lazyload')
callback()
}
}
}
网友评论