性能优化——图片懒加载

197 阅读13分钟

图片懒加载是只加载可视区(当前能看到浏览器内容的区域)里的图片,监听滚动事件,判断当前图片是否在可视区中。

特点

提高网页加载速度,提升用户体验 减少服务器压力

原理

  • 设置图片地址为data-xxx属性,这样图片就默认不加载
  • 监听浏览器滚动事件
  • 判断当前图片是否在可视区,是的话就将src属性设置为图片地址

实现

getBoundingClientRect()

getBoundingClientRect() 是一个用于获取元素位置和尺寸信息的方法。它返回一个 DOMRect对象,其提供了元素的大小及其相对于视口的位置

const box = document.getElementById('box');
const rect = box.getBoundingClientRect();

console.log(rect.x);        // 元素左边界相对于视口的 x 坐标
console.log(rect.y);        // 元素上边界相对于视口的 y 坐标
console.log(rect.width);    // 元素的宽度
console.log(rect.height);   // 元素的高度
console.log(rect.top);      // 元素上边界相对于视口顶部的距离
console.log(rect.right);    // 元素右边界相对于视口左侧的距离
console.log(rect.bottom);   // 元素下边界相对于视口顶部的距离
console.log(rect.left);     // 元素左边界相对于视口左侧的距离
<body>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <!-- 图片放在div中才会一个个依次加载,不然会三个同时加载 -->
    <div>
        <img data-src="./static/2d6aa7e497a059df30d635667b1ec998.jpeg">
    </div>
    <div>
        <img data-src="./static/492424705e4649cbacce912bb5a8c41d.jpeg">
    </div>
    <img data-src="./static/58e55f45e1adbb8a2d40174660cb35b7.jpeg">

    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>
    <p>“孙悟空那么能飞,而且自带导航熟门熟路,一个筋斗飞过去,把经书拎回来交给师父不就得了吗?悟空快递,使命必达,何必费那么大劲呢?”这个有趣的提问,来自评论家李敬泽,这是他打小阅读《西游记》时,心中生成的疑惑。近日,译林出版社推出他的新作《空山横:讲演集,关于文学关于人》,收录其中的《北京雨燕以及行者》一文,涉及了对孙行者悟空的解读,他的本性是飞,有着翱翔长空的青云之志,他也终于学会了落地行走。飞在天上、走云路能解决的问题就不是问题,人之为人必须走本路,在大地上用双脚一步一步走过去,在人世的苦、人生的难中走过去,这才是道成肉身,才算得了真经,这是他在阅读《西游记》时的理解。李敬泽如“青鸟”穿越般自由联想的写作风格,被华东师范大学教授毛尖称为,这是人类能够与ChatGPT竞争的写作风格。</p>

图片元素上边界相对于视口顶部的距离getBoundingClientRect().top当前浏览器窗口高度window.innerHeight进行对比,若小于则证明图片在可视区内,加载图片。但该方法在图片加载完后还会持续触发事件

const images = document.querySelectorAll('img');

window.addEventListener('scroll', (e) => {
    images.forEach(image => {
        const imgTop = image.getBoundingClientRect().top;
        if(imgTop < window.innerHeight) {
            const data_src = image.getAttribute('data-src');
            image.setAttribute('src',data_src);
            console.log("srcoll 触发了");
        };
    })
})

利用intersectionObserve函数

它可以异步地监测一个元素与其祖先或顶级文档视口之间的交叉状态。它会告诉我们目标元素是否进入或离开了视口,或者与其他元素重叠

const images = document.querySelectorAll('img');

const callback = entries => {
    entries.forEach(entry => {
        if(entry.isIntersecting) { // 若在可视区,该属性为true
            const image = entry.target;
            const data_src = image.getAttribute('data-src');
            image.setAttribute('src',data_src);
            observer.unobserve(image); //解除监测 
            console.log('触发');       
        }
    })
}

const observer = new IntersectionObserver( callback );

images.forEach( image => {
    observer.observe(image);
});