前端实现懒加载

75 阅读1分钟

可直接复制到本地调试

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        ul{
            list-style: none;
        }
        .box{
            width: 80%;
            margin: 0 auto;
            display: flex;
            flex-wrap: wrap;
        }
        .item{
            width: calc( 33.33% - 20px );
            margin: 10px;
            min-height: 200px;
        }
        .item img{
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="box">
        <!-- <div class="item">
            <img src="./img/Empty.svg" alt="">
        </div> -->
    </div>
</body>
<script>
	//先做一个数组,用来装图片的网络地址
    var imgList = [
		{
			default:'./img/Empty.svg', //这是默认生效的图片,你可以改成自己的
			url:'https://images.pexels.com/photos/23719800/pexels-photo-23719800.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/20569931/pexels-photo-20569931.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/23105903/pexels-photo-23105903.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/22816073/pexels-photo-22816073.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/18197764/pexels-photo-18197764.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/24031902/pexels-photo-24031902.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/23914518/pexels-photo-23914518.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/16118941/pexels-photo-16118941.jpeg?auto=compress&cs=tinysrgb&w=800&lazy=load'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/22937531/pexels-photo-22937531.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/21915597/pexels-photo-21915597.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/16703290/pexels-photo-16703290.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/13298586/pexels-photo-13298586.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/18109714/pexels-photo-18109714.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/22670156/pexels-photo-22670156.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/21852583/pexels-photo-21852583.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/21367366/pexels-photo-21367366.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/17102067/pexels-photo-17102067.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/24038436/pexels-photo-24038436.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/19473669/pexels-photo-19473669.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/20470948/pexels-photo-20470948.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/22469105/pexels-photo-22469105.jpeg?auto=compress&cs=tinysrgb&w=800&lazy=load'
		}
		,
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/13743557/pexels-photo-13743557.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2'
		},
		{
			default:'./img/Empty.svg',
			url:'https://images.pexels.com/photos/23230661/pexels-photo-23230661.jpeg?auto=compress&cs=tinysrgb&w=800&lazy=load'
		},
	]

    var box = document.querySelector('.box');
	
	//渲染页面结构的工具函数,用来遍历list,然后渲染成dom结构到页面
    function initImg(list){
        for( var i = 0; i < list.length; i++ ){
            var div = document.createElement('div');
            div.className = 'item';
            var img = document.createElement('img');
            img.src = list[i].default;
            img.dataset.url= list[i].url;
            div.appendChild(img);
            box.appendChild(div);
        }
    }
    initImg(imgList);//先调用一次工具函数
    window.onload = function(){
    	//这里要等页面加载完毕,也就是默认图片加载完毕后,再执行之后的逻辑
        var items =  document.querySelectorAll('.item');
        Observer(items);//调用观察者工具函数,给其传要观察的Dom对象
    }
    //观察者工具函数
    function Observer(list){
        var observer = new IntersectionObserver(function(entries){
            for( var n = 0; n < entries.length; n++ ){
                if( entries[n].isIntersecting && entries[n].target.children[0].src.includes( "img/Empty.svg" ) ){
                    entries[n].target.children[0].src = entries[n].target.children[0].dataset.url;
                }
            }
        })
        for( var i = 0; i < list.length; i++ ){
            observer.observe(list[i])
        }
    }
</script>
</html>