闽公网安备 35020302035485号
我们可以发现,当我们在往下方滚动的时候,下方商品的图片在你看不到之前是没有加载的,而是当你滚到到它的时候,这个图片才加载,这就是懒加载的一个应用!
<body>
<img class='img-item' src="https://img.zcool.cn/community/011e0e5c231dcaa80121df9063b03f.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/01427a5c63c7dba801213f26fa8f1f.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/0132fb60a7171011013f472074ee82.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="https://pic2.zhimg.com/v2-ac79ec66a08cdbbfd36c3f9e4f307077_1440w.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/01702360a7171511013e3b7d2249ef.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/01c9e05da91bcea8012163bae9a7ea.jpg@2o.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/010c155dcec2b0a8012053c0802a12.jpg@3000w_1l_0o_100sh.jpg" alt="">
<img class='img-item' src="https://pic2.zhimg.com/v2-b2ab50d677e6f8a9101dae446dd99acd_r.jpg" alt="">
<img class='img-item' src="https://img.3dmgame.com/uploads/images/thumbpicfirst/20180824/1535099402_352803.jpg" alt="">
<img class='img-item' src="https://img.zcool.cn/community/0193a55b9df41ba8012099c8aedcd0.jpg@3000w_1l_0o_100sh.jpg" alt="">
</body>
由于图片尺寸问题,我们为了看得更加舒服,我们加点样式:<style>
.img-item{
display: block;
height: 300px;
margin-top: 50px;
}
</style>
将其变为块级元素,从上往下显示,设置图片高度为300px,上外边距为50px<body>
<img class='img-item' src="" data-original="https://img.zcool.cn/community/011e0e5c231dcaa80121df9063b03f.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/01427a5c63c7dba801213f26fa8f1f.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/0132fb60a7171011013f472074ee82.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="" data-original="https://pic2.zhimg.com/v2-ac79ec66a08cdbbfd36c3f9e4f307077_1440w.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/01702360a7171511013e3b7d2249ef.jpg@1280w_1l_2o_100sh.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/01c9e05da91bcea8012163bae9a7ea.jpg@2o.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/010c155dcec2b0a8012053c0802a12.jpg@3000w_1l_0o_100sh.jpg" alt="">
<img class='img-item' src="" data-original="https://pic2.zhimg.com/v2-b2ab50d677e6f8a9101dae446dd99acd_r.jpg" alt="">
<img class='img-item' src="" data-original="https://img.3dmgame.com/uploads/images/thumbpicfirst/20180824/1535099402_352803.jpg" alt="">
<img class='img-item' src="" data-original="https://img.zcool.cn/community/0193a55b9df41ba8012099c8aedcd0.jpg@3000w_1l_0o_100sh.jpg" alt="">
</body>
我们将src属性先置为空!然后我们自己定义一个data-original属性存我们图片的地址!<script>
// 拿到可视区域的高度 innerHeight是window上独有的方法 别的用outerHeight或者innerHeight
let viewHeight = window.innerHeight;
// 拿到所有的img元素 img[data-original]只要具有data-original属性的img元素
let imgs = document.querySelectorAll('img[data-original]');
imgs.forEach(el=>{
// getBoundingClientRect()专门获取容器的几何信息
let rect = el.getBoundingClientRect()
})
</script>
我们可以通过window.innerHeight;拿到用户可视区域的高度<script>
// 拿到可视觉区域的高度
let viewHeight = window.innerHeight;
function lazyLoad(){
// 拿到所有的img元素 img[data-original]只要具有data-original属性的img元素
let imgs = document.querySelectorAll('img[data-original]');
imgs.forEach(el=>{
// getBoundingClientRect()专门获取容器的几何信息
let rect = el.getBoundingClientRect()
if(rect.top<viewHeight){
//进行赋值操作
}
}
})
}
</script>
我们可以想象一下,只要到图片顶部的距离小于可视区域的高度,我们就应该加载图片了!if(rect.top<viewHeight){
//进行赋值操作
let image = new Image()
image.src = el.dataset.original;
}
值得注意的是:data-original在js中有专有写法,写成dataset.original 。el.src = image.src但是我们不会这样写,而是写成
if(rect.top<viewHeight){
let image = new Image()
image.src = el.dataset.original;
image.onload = function(){
el.src = image.src
}
}
为什么这样写呢?这样写我们就通过onload函数的执行,当我们创造的image标签加载完毕的时候,我们才去把el.src赋值为image.src。if(rect.top<viewHeight){
let image = new Image()
image.src = el.dataset.original;
image.onload = function(){
el.src = image.src
}
// 图片加载完毕就移除属性
el.removeAttribute('data-original')
}
写到这里,功能我们就实现了,我们调用一遍这个函数,同时添加一个事件监听器监听滚动事件,随着页面的滚动来加载图片,最终我们js部分就写成了这样!<script>
// 拿到可视觉区域的高度
let viewHeight = window.innerHeight;
function lazyLoad(){
// 拿到所有的img元素
let imgs = document.querySelectorAll('img[data-original]');
imgs.forEach(el=>{
// getBoundingClientRect()专门获取容器的几何信息
let rect = el.getBoundingClientRect()
if(rect.top<viewHeight){
// img元素自带一个构造函数,可以创建一个图片对象
let image = new Image()
// js专有写法dataset.original; = data-original
image.src = el.dataset.original;
image.onload = function(){
el.src = image.src
}
// 图片加载完毕就移除属性
el.removeAttribute('data-original')
}
})
}
lazyLoad()
// 添加滚动事件监听器
document.addEventListener('scroll',lazyLoad)
</script>
我们来看看现在页面的效果!