图片懒加载:优化网页加载速度的利器

146 阅读2分钟

一.浏览器行为和加载过程

HTML到DOM:浏览器解析HTML时构建文档对象模型(DOM)树。
CSS到渲染树:CSS样式被应用到渲染树中,确定元素在页面上的显示方式。
CSS下载:浏览器会下载并应用CSS样式表。
JavaScript:尽管JavaScript是单线程的,但浏览器通过多个线程同时处理各种任务。
资源加载:图片(`img`)、样式表(`link`)、脚本(`script`)等会启动并发下载线程,以优化加载速度。

二.懒加载和性能优化

初始加载优化:优先加载视窗内的图片(即首屏内容),确保快速初始渲染。
滚动懒加载:随着用户滚动页面,按需加载图片,减少初始加载时间,提升感知性能。
前端响应性**:前端开发者通过懒加载等技术,最大程度地减少加载时间,优化内容显示。

三.实现步骤

手动控制:最初使用`img src=""`属性加载图片,实现即时下载。
数据属性(`data-src`) :使用`data-src`属性指定图片URL,在图片进入视窗时进行懒加载。
性能考虑:优化并发图片下载数量,平衡快速显示与资源使用效率。

四.展现实例

  代码事例展示:
  
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./common.css">

</head>
<body>
    <img  data-src="https://img0.baidu.com/it/u=3944821654,1843674929&fm=253&fmt=auto&app=138&f=JPEG?w=752&h=500">
    <img  data-src="https://img0.baidu.com/it/u=339312915,19099424&fm=253&fmt=auto&app=138&f=JPEG?w=499&h=333">
    <img  data-src="https://img0.baidu.com/it/u=2904974581,2094441891&fm=253&fmt=auto&app=138&f=JPEG?w=752&h=500">
    <img  data-src="https://img1.baidu.com/it/u=1183890827,3356066797&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500">
    <img  data-src="https://img2.baidu.com/it/u=3221529243,730458823&fm=253&fmt=auto&app=138&f=JPEG?w=731&h=500">
    <img  data-src="https://img2.baidu.com/it/u=1507496597,3356769496&fm=253&fmt=auto&app=138&f=JPEG?w=784&h=500">
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
    <script>
        const imgs=document.querySelectorAll('img');
        const num=imgs.length;
        let screenHeight=document.documentElement.clientHeight;//一屏的高度
        document.addEventListener('DOMContentLoaded',()=>{
            loadImage();
        })
        function loadImage(){
            console.log("开始加载");
            //是否可视区
            //滚动条
            //不同浏览器的兼容性问题
            let scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
            for(let i=0;i<num;i++){
                // console.log(imgs[i].offsetTop);
                if(imgs[i].offsetTop<screenHeight+scrollTop){
                    //数据属性
                    // console.log(imgs[i].dataset.src);
                    imgs[i].src=imgs[i].dataset.src
                   // imgs[i].src=imgs[i].getAttribute('data-src');
                   n=i+1;
                   if(n==num){
                    console.log('所有图片已加载');
                    window.removeEventListener('scroll',throttlrLayLoad);
                   }
                }
            }
        }
        const throttlrLayLoad=_.throttle(loadImage,500);
        window.addEventListener('scroll',throttlrLayLoad)
    </script>
    
</body>
</html>
    
body{
    background-color: gray;;
}
img{
    display: block;
    margin-bottom: 50px;
    width: 600px;
    height: 400px;
}
 效果展现:
 

image.png

ea902b96657359219382334e76bb816.png

五.关键概念和注意事项

浏览器机制:理解浏览器如何管理并发下载,优化资源处理。
DOM操作:利用DOM属性(如`clientHeight``scrollTop``offsetHeight`)基于用户交互或滚动位置触发懒加载。
数据集使用:使用`dataset`存储自定义数据属性(`data-*`),灵活管理HTML元素的数据。
业务逻辑优化**:调整懒加载逻辑,减少不必要的触发(如优化滚动事件),提升性能表现。

六.总结

     总之,有效的图片懒加载利用浏览器能力优化资源管理,改善页面加载速度。
     通过了解浏览器行为和采用适当的技术手段,开发者可以显著提升用户体验和前端性能。