<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>懒加载图片三种方式</title>
<style type="text/css">
body{
margin: 0;
padding: 0 20%;
}
.contain{
width: 100%;
min-height: 100vh;
background-color: #F2F2F2;
}
img{
display: block;
width: 100%;
height: 800px;
transition: all 3s;
}
</style>
</head>
<body>
<div class="contain">
<img data-src="./images/banner (1).jpeg" >
<img data-src="./images/banner (2).jpeg" >
<img data-src="./images/banner (3).jpeg" >
<img data-src="./images/banner (4).jpeg" >
<img data-src="./images/banner (5).jpeg" >
<img data-src="./images/banner (6).jpeg" >
<img data-src="./images/banner (7).jpeg" >
<img data-src="./images/banner (8).jpeg" >
<img data-src="./images/banner (9).jpeg" >
</div>
<script>
/* 第一种:通过scrollTop等 */
// const imgs = document.querySelectorAll("img")
// //offsetTop是元素与offsetParent的距离,循环获取直到页面顶部
// function getTop(e) {
// var T = e.offsetTop;
// while(e = e.offsetParent) {
// T += e.offsetTop;
// }
// return T;
// }
// function lazyLoad(imgs) {
// var H = document.documentElement.clientHeight;//获取可视区域高度
// var S = document.documentElement.scrollTop || document.body.scrollTop;
// for (var i = 0; i < imgs.length; i++) {
// if (H + S > getTop(imgs[i])) {
// imgs[i].src = imgs[i].getAttribute('data-src');
// }
// }
// }
// window.onload = window.onscroll = function(){
// lazyLoad(imgs)
// }
/* 第二种:通过getBoundingClientRect */
// var imgs = document.querySelectorAll('img');
// //用来判断bound.top<=clientHeight的函数,返回一个bool值
// function isIn(el) {
// var bound = el.getBoundingClientRect();
// var clientHeight = window.innerHeight;
// console.log(bound)
// console.log(clientHeight+'--')
// return bound.top <= clientHeight;
// }
// //检查图片是否在可视区内,如果不在,则加载
// function check() {
// Array.from(imgs).forEach(function(el){
// if(isIn(el)){
// loadImg(el);
// }
// })
// }
// function loadImg(el) {
// if(!el.src){
// var source = el.dataset.src;
// el.src = source;
// }
// }
// window.onload = window.onscroll = function () { //onscroll()在滚动条滚动的时候触发
// check();
// }
/* 第三种:通过IntersectionObserver */
var io = new IntersectionObserver((entries)=>{
// entires为监听的节点数组对象
entries.forEach((item,index) => {
console.log(item)
if(item.isIntersecting) {
item.target.src = item.target.getAttribute('data-src')
// 这里资源加载后就停止进行观察
io.unobserve(item.target)
}
})
});
let data = Array.from(document.querySelectorAll('img'))
data.forEach(item => {
// observe用来观察指定的DOM节点
io.observe(item)
})
</script>
</body>
</html>