编写代码实现图片的懒加载
编写代码实现图片的懒加载
1 前端性能优化的重要方案,通过图片或者数据的延迟加载,我们可以加快页面的渲染的速度,让我们第一次打开页面的速度变快
2 只有滑动到某个区域,我们才加载真实的图片,这样也可以节省加载的流量
如何实现图片懒加载
把所有需要延迟加载的图片用一个盒子包起来,设置宽高和默认的占位图,
开始让所有的img的src为空,把真实图片的地址放到img的自定义属性上,让img隐藏
等待所有其他资源都加载完之后,我们再开始加载图片
等于很多图片,需要当页面滚动的时候,当前图片区域完全显示出来后在加载真实图片
单张图片的延迟加载, 当图片进入显示区在加载
html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .imgBox{ margin: 1000px auto; width: 300px; height: 100px; overflow: hidden; background-color: #bbb; } .imgBox img{ display: none; /* 图片一开始是隐藏的*/ width: 100%; } </style> </head> <body> <div class="imgBox"> <img src="" alt="" data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg" > </div> <script src="/jquery-3.2.1.js"></script> <script src="/01.js"></script> </body> </html>
js文件
let $imgBox = $('.imgBox'),
$img = $imgBox.children('img');
// jq中的事件绑定支持多事件绑定:window.onload & window.onscroll 两个事件触发的时候执行相同的事情
// load当页面中所有资源都加载完成之后触发,scroll浏览器滚动触发
// $imgBox.outerHeight() 表示 获取$imgBox元素的高度 (当前元素的高度)
// $imgBox.offset() 表示 获取$imgBox元素顶部距离body页面顶部/左边的距离
// $(window).outerHeight()表示浏览器的高度
// $A 图片底边到页面顶部的距离 = 图片的高度 + 图片顶边到页面顶边的距离
// $B 浏览器底边到页面顶边的距离 = 浏览器的可视区一屏幕的高度 + 滚动条卷去的高度
$(window).on('load scroll',function(){
if($img.attr('isLoad')==='true'){
return; // 如果加载过就不会再加载
}
// 图片的高度 + 图片顶边到页面顶边的距离
let $A = $imgBox.outerHeight() + $imgBox.offset().top
// 浏览器的高度(一屏幕高) + 滚动条卷去的高度
let $B = $(window).outerHeight() + $(window).scrollTop();
if( $A <= $B){ // 如果 图片底边到页面顶部的距离 <= 浏览器底边到页面顶边的距离就加载真实图片
// 加载真实图片
$img.attr('src',$img.attr('data-img'));//获取自定义属性的值,赋值给src
$img.on('load',function(){
//当图片加载成功后,再在页面上显示图片
// $img.css('display','block')
$img.stop().fadeIn(); // 使图片渐变出来
});
$img.attr('isLoad',true) // attr储存自定义属性值都是字符串格式'true'
}
})
如何实现 多张图片的延迟加载
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .imgBox{ margin-bottom: 20px; height: 160px; overflow: hidden; background-color: #bbb; } .imgBox img{ display: none; /* 图片一开始是隐藏的*/ width: 100%; } .container{ width: 800px; margin: 0 auto; } </style> </head> <body> <div class="container"> <!-- <div class="imgBox"> <img src="" alt="" data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg" > </div> --> </div> <script src="/jquery-3.2.1.js"></script> <script src="/01.js"></script> </body> </html>
js文件
let $container = $('.container')
$imgBoxs = null;
// 制造假数据
let str = ``;
// 创造一个长度为20的数组,每一项都用null填充
new Array(20).fill(null).forEach((item,index)=>{//其实就是个for循环
str += `
<div class="imgBox">
<img src="" alt="" data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg" >
</div>
`
})
$container.html(str)
$imgBoxs = $container.children('.imgBox');
// 多张图片延迟加载
$(window).on('load scroll',function(){
//获取浏览器底边框到body页顶边的距离
let $B = $(window).outerHeight() + $(window).scrollTop(); // 浏览器的可视区一屏幕的高度 + 滚动条卷去的高度
//循环每一张图片区域,根据当前图片到body页顶边的距离,计算出里面的图片是否加载
$imgBoxs.each((index,item)=>{
let $item = $(item);
$itemA = $item.outerHeight() + $item.offset().top // 图片的高度 + 图片顶边到页面顶边的距离
isLoad = $item.attr('isLoad')
if( $B >= $itemA && isLoad !== 'true'){//如果 浏览器底边到页面顶端的距离 >= 图片底边到页面顶端的距离
$item.attr('isLoad',true)
//加载当前区域中的图片
let $img = $item.children('img') //获得每张图片
$img.attr('src',$img.attr('data-img'));//获取自定义属性的值,赋值给src
$img.on('load',()=>{
//当图片加载成功后,再在页面上显示图片
// $img.css('display','block')
$img.stop().fadeIn(); // 使图片渐变出来
});
}
})
})

浙公网安备 33010602011771号