图片懒加载及实现方式,懒加载的优点

懒加载的概念:

当我们打开某一个页面时,先只加载浏览器可视区内的图片,当用户向下拖动滚动条时再继续加载后面的图片(也是只加载目前可视窗口区域内的图片,这里毫无疑问要用到鼠标滚轮的事件监听)。

why要用懒加载?

当我们打开一个页面时,浏览器就会从上往下读取页面中的标签src中的地址,并且开启线程来进行加载。
倘若用户的网速不给力或者此页面中的图片太多时,就会发生每张图片都加载了一点但是都没有加载完成,导致最后没有一个图片能正常显示。一方面让用户的体验非常之差,另一方面,加载每个图片都要向服务器发送请求,这会增大服务器的压力。

实现思路:
在写标签时,先将src的值设为一个体积很小的默认图片,自定义一个data-src属性,存储真正要显示的图片的路径。在加载页面时,一开始是默认图片,当在可视区中时,将data-src里存储的真正路径赋值给src属性,并开始加载。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">

	</style>
</head>
<body>
	<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>页面懒加载</title>
        <style>
            img {
                display: block;
                margin: 0 auto 50px;
                width: 660px;
                height: 740px;
            }
        </style>
    </head>
    <body>
        <img src="default.jpg" data-src="https://hbimg.huabanimg.com/857ca2ac0047298f0109b8b488f0a1d29240a07c20ce3-tFcPfR_fw658" alt="">
        <img src="default.jpg" data-src="http://hbimg.huabanimg.com/3561adae57a54d4ce4fac879175e72f4451c06ffa405-ta2Ull_fw658" alt="">
        <img src="default.jpg" data-src="http://n.sinaimg.cn/games/crawl/20160801/XoMQ-fxunyyf6357658.png" alt="">
        <img src="default.jpg" data-src="http://p0.qhimg.com/t0158d9ce33986f6090.jpg" alt="">
        <img src="default.jpg" data-src="https://i0.hdslb.com/bfs/article/ace350b1a3a38db7fce60aa9699c4c056ee80638.jpg" alt="">
        <img src="default.jpg" data-src="http://img.hb.aicdn.com/c2c5ca7d736724df7556b0f188fe21baa3712c3d2b895-iNMmnu_fw658" alt="">
        <img src="default.jpg" data-src="http://5b0988e595225.cdn.sohucs.com/images/20190613/c07709f355bb4f7aba5dec61ff88a7c4.JPG" alt="">
        <img src="default.jpg" data-src="https://c-ssl.duitang.com/uploads/item/201808/01/20180801083850_juzen.thumb.400_0.jpg" alt="">
        <img src="default.jpg" data-src="http://img.qqzhi.com/uploads/2018-11-29/235955672.jpg" alt="">
        <img src="default.jpg" data-src="http://i.serengeseba.com/uploads/i_2_77599483x4251285803_26.jpg" alt="">
        <img src="default.jpg" data-src="http://img.hb.aicdn.com/09ae7fb96159a07cc4f993c166dcf9c546818c3047a41-Fm6Wgt_fw236" alt="">
        <img src="default.jpg" data-src="https://p1.ssl.qhimgs1.com/sdr/400__/t01ec96c4bb1b4e380b.webp" alt="">        
        <img src="default.jpg" data-src="https://p1.ssl.qhimgs1.com/sdr/400__/t01ec96c4bb1b4e380b.webp" alt="">
        <img src="default.jpg" data-src="https://5b0988e595225.cdn.sohucs.com/q_70,c_zoom,w_640/images/20170903/5ee461b1464b492fb5b033b34d06adcb.jpeg" alt="">
        <img src="default.jpg" data-src="https://p2.ssl.qhimgs1.com/sdr/400__/t0106ff1c580238fa02.webp" alt="">
        <img src="default.jpg" data-src="https://p0.ssl.qhimgs1.com/sdr/400__/t01a834ab8bd0a890c6.webp" alt="">
        <img src="default.jpg" data-src="https://p0.ssl.qhimgs1.com/sdr/400__/t01ba9ad7091a098934.webp" alt="">
        <img src="default.jpg" data-src="https://p1.ssl.qhimgs1.com/sdr/400__/t01b6689727e2c7470b.webp" alt="">
    </body>
    <script>
        var num = document.getElementsByTagName('img').length;
        var img = document.getElementsByTagName("img");
        // 存储图片加载到的位置,避免每次都从第一张图片开始遍历
        var n = 0;
        // 页面载入完毕加载可视区域内的图片
        lazyload();                                
        window.onscroll = lazyload;
        // 监听页面滚动事件
        function lazyload() {
            // 可见区域高度
            var seeHeight = document.documentElement.clientHeight;
            // 滚动条距离顶部高度
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            for (var i = n; i < num; i++) {
                if (img[i].offsetTop < seeHeight + scrollTop) {
                    if (img[i].getAttribute("src") == "default.jpg") {
                        img[i].src = img[i].getAttribute("data-src");
                    }
                    n = i + 1;
                }
            }
        }
    </script>
</html>
</body>
</html>
// 可见区域高度
var seeHeight = document.documentElement.clientHeight;
console.log(seeHeight)

运行效果:
在这里插入图片描述

// 滚动条距离顶部高度
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
console.log(scrollTop)

运行效果:
在这里插入图片描述

var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

上面的这段代码,|| 是为了做一个不同浏览器运行下的兼容处理。

来都来了再详细了解一下:
1.各浏览器下 scrollTop的差异:
IE6/7/8:
可以使用 document.documentElement.scrollTop;
IE9及以上:
可以使用window.pageYOffset或者document.documentElement.scrollTop
Safari:
safari: window.pageYOffset 与document.body.scrollTop都可以;
Firefox:
火狐等等相对标准些的浏览器就省心多了,直接用window.pageYOffset 或者 document.documentElement.scrollTop
Chrome:
谷歌浏览器只认识document.body.scrollTop;
注:标准浏览器是只认识documentElement.scrollTop的,但chrome虽然我感觉比firefox还标准,但却不认识这个,在有文档声明时,chrome也只认识document.body.scrollTop.

 for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                    if (img[i].getAttribute("src") == "default.jpg") {
                        img[i].src = img[i].getAttribute("data-src");
                    }
                    n = i + 1;
                }
            }

offsetTop:当前对象到其上级层顶部的距离。
scrollTop:对象的最顶部到对象在当前窗口显示的范围内的顶边的距离
getAttribute() :方法返回指定属性名的属性值。

懒加载在面试中也会被经常问到?
比如让你解释下他的概念,以及优点。
概念在后面就不多赘述了,根据上面的来进行一个优点的总结。
1.减少了加载时的线程数量,使可视区域内的图片也能够快速加载,优化了用户体验。
2.减少了同一时间发向服务器的请求数,大大减轻了服务器的压力。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图片懒加载是一种优化网页性能的方法,它可以减少网页的加载时间和减轻服务器的压力。当网页滚动到需要加载图片的位置时,再去加载图片,而不是一次性加载所有图片。 下面是一种实现图片懒加载的方法: 1. 给需要延迟加载的图片设置一个占位符,比如一个小图片或者一个颜色块。 2. 给每个需要延迟加载的图片添加一个自定义属性,比如 data-src,它存储着图片的真实地址。 3. 使用 JavaScript 监听滚动事件,当页面滚动到需要加载图片的位置时,获取图片的真实地址,将它赋值给图片的 src 属性。 4. 为了避免重复加载,可以给已经加载的图片添加一个标记,比如一个自定义属性或者一个 class。 下面是一个示例代码: ```html <img class="lazyload" data-src="image.jpg" src="placeholder.jpg" alt="image"> <script> function lazyload() { const images = document.querySelectorAll('.lazyload'); images.forEach(image => { const rect = image.getBoundingClientRect(); if (rect.top < window.innerHeight) { // 获取图片真实地址 const src = image.getAttribute('data-src'); // 设置图片的 src 属性 image.setAttribute('src', src); // 添加标记,避免重复加载 image.classList.add('loaded'); } }); } window.addEventListener('scroll', lazyload); </script> ``` 注意:这只是一种简单的实现方法,实际使用时还需要考虑更多因素,比如性能优化、兼容性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值