图片懒加载与预加载

14 篇文章 0 订阅
订阅专栏
  1. 图片懒加载

在网页中,滑动页面,直到能看到图片时,再加载图片。

前置准备

offsetTop:返回元素相对带有定位父元素上方的偏移;

clientHeight:元素内部的高度(以像素为单位),包含内边距,但不包括边框、外边距和水平滚动条(如果存在)。在根元素(<html> 元素)或怪异模式下的 <body> 元素上使用 clientHeight 时,该属性将返回视口高度(不包含任何滚动条);

scrollTop:属性可以获取或设置一个元素的内容垂直滚动的像素数。

图示:

实现懒加载

假设上图中某元素就是还未显示到的图片,当移动鼠标滚轮时,导致某元素上移,某元素即出现在了浏览器可视区域。此时有,某元素.offsetTop < clientHeight + scrollTop。这个条件即为判定图片是否出现在了浏览器可视区域。

function lazyload() {
    let imgs = document.querySelectorAll('img');
    for (let i = 0; i < imgs.length; i++) {
        if (imgs[i].offsetTop < document.documentElement.clientHeight + document.documentElement.scrollTop) {
            imgs[i].src = imgs[i].getAttribute('data-src');
        }
    }
}
//第一次进入页面,屏幕内的图片正常加载
window.onload = lazyload;
//监听滚动事件
window.addEventListener('scroll', lazyload);

此外,<img>会通过src属性的url来加载图片,因此将需要懒加载的图片url放到data-src属性中,这样src为空就不会加载图片了,或者也可以在src属性存放loading图片。当图片到达可视区时,再给<img>添加src属性。

优化

由于监听鼠标滚轮的滚动会非常频繁,因此要进行节流处理。

附完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片懒加载</title>
    <style>
        body {
            background-color: rgb(241, 222, 167);
        }

        div img {
            width: 220px;
            height: 375px;
            display: block;
            margin: 20px auto;
            border: 2px solid rgb(229, 174, 22);
            background-color: rgb(243, 243, 243);
        }
    </style>
</head>

<body>
    <div>
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227144725.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227012315.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227031103.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227012319.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227012327.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227031058.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227012249.md.jpg">
        <img data-src="https://www.z4a.net/images/2023/02/19/QQ20210227012334.md.jpg">
    </div>
</body>
<script>
    function lazyload() {
        let imgs = document.querySelectorAll('img');
        for (let i = 0; i < imgs.length; i++) {
            if (imgs[i].offsetTop < document.documentElement.clientHeight + document.documentElement.scrollTop) {
                imgs[i].src = imgs[i].getAttribute('data-src');
            }
        }
    }
    //第一次进入页面,屏幕内的图片正常加载
    window.onload = lazyload;
    //节流函数
    function throttle(fn, delay) {
        let preTime = Date.now();
        return function () {
            let context = this,
                args = arguments,
                nowTime = Date.now();
            // 如果两次时间间隔超过了指定时间,则执行函数。
            if (nowTime - preTime >= delay) {
                preTime = Date.now();
                return fn.apply(context, args);
            }
        };
    }
    //监听滚动事件
    window.addEventListener('scroll', throttle(lazyload, 500));
</script>

</html>

其它方法:

1 getBoundingClientRect + clientHeight

getBoundingClientRect:会返回一个对象,包含当前元素的大小及其相对于视口的位置。

如图,如果某元素.getBoundingClientRect().top < clientHeight就会出现在浏览器可视区域。

function lazyload() {
    let imgs = document.querySelectorAll('img');
    for (let i = 0; i < imgs.length; i++) {
        if (imgs[i].getBoundingClientRect().top < document.documentElement.clientHeight) {
            imgs[i].src = imgs[i].getAttribute('data-src');
        }
    }
}
//第一次进入页面,屏幕内的图片正常加载
window.onload = lazyload;
//监听滚动事件
window.addEventListener('scroll', lazyload);

2 Intersection Observer (推荐)

Intersection Observer(交叉观察器) :一种异步查询元素相对于其他元素或窗口位置的能力。常用于追踪一个元素在窗口的可视问题。

可见本质:目标元素与视口产生的交叉区,所以叫交叉观察器。

使用:

const i = new IntersectionObserver(callback, options);
//callback是可见性变化时的回调函数,options是配置对象(该参数可选)
//callback也有参数,entries是一个数组,每个元素都是IntersectionObserver的实例。描述了目标元素与root的交叉状态。如果有三个被观察的对象的可见性发生变化,entries数组就会有三个元素。
const i2 = new IntersectionObserver(
  entries => {
    console.log(entries);
  },options);

entries数组中的对象有如下属性、方法

属性

功能

boundingClientRect

返回包含目标元素的边界信息,返回结果与element.getBoundingClientRect() 相同

intersectionRatio

返回目标元素出现在可视区的比例

intersectionRect

用来描述root和目标元素的相交区域

isIntersecting

返回一个布尔值,下列两种操作均会触发callback:1. 如果目标元素出现在root可视区,返回true。2. 如果从root可视区消失,返回false

rootBounds

用来描述交叉区域观察者(intersection observer)中的根.

target

目标元素:与根出现相交区域改变的元素 (Element)

time

返回一个记录从 IntersectionObserver 的时间原点到交叉被触发的时间的时间戳

function Observer() {
    let imgs = document.querySelectorAll('img');
    let observer = new IntersectionObserver(entries => {
        entries.forEach(entry => {
            //判断目标元素是否出现在root可视区
            if (entry.isIntersecting) {
                entry.target.src = entry.target.dataset.src;
                //当图片出现在可视区,就停止监听
                observer.unobserve(entry.target);
            }
        })
    });
    //监听图片元素
    imgs.forEach(img => observer.observe(img));
}
Observer();

相较于offsetTop getBoundingClientRect两种方法,使用交叉观察器性能更优。

  1. 图片预加载

提前加载好后面会用到的图片

通过css实现

利用 background-image 属性,当打开非正式页面时,可以提前利用css请求所需要的图片资源,然后浏览器会将返回的图片资源进行本地存储。当需要在正式页面引入预加载图片时,可直接从本地中拿去,减少了正式页面等待请求时间。

缺点:会导致非正式页面css加载时间过长,可能导致非正式页面短暂空白。

css
#preload1 {
    background-image: url(https://www.z4a.net/images/2023/02/19/QQ20210227144725.md.jpg);
    width: 0;
    height: 0;
}

#preload2 {
    background-image: url(https://www.z4a.net/images/2023/02/19/QQ20210227012315.md.jpg);
    width: 0;
    height: 0;
}

#preload3 {
    background-image: url(https://www.z4a.net/images/2023/02/19/QQ20210227031103.md.jpg);
    width: 0;
    height: 0;
}
html
<img id="preload1">
<img id="preload2">
<img id="preload3">

通过js实现

使用 js 中的 image 对象,通过为 image 对象来设置 src 属性,来实现图片的预加载。

const imgs = [];
function preload() {
    for (let i = 0; i < arguments.length; i++) {
        imgs[i] = new Image();
        imgs[i].src = arguments[i];
    }
}
preload(
    'https://www.z4a.net/images/2023/02/19/QQ20210227144725.md.jpg',
    'https://www.z4a.net/images/2023/02/19/QQ20210227012315.md.jpg',
    'https://www.z4a.net/images/2023/02/19/QQ20210227031103.md.jpg'
);
  1. 懒加载与预加载区别

懒加载也叫延迟加载,指的是在长网页中延迟加载图片的时机,当用户需要访问时,再去加载,这样可以提高网站的首屏加载速度,提升用户的体验,并且可以减少服务器的压力。它适用于图片很多,页面很长的电商网站的场景。

预加载指的是将所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。通过预加载能够减少用户的等待时间,提高用户的体验。常见于漫画、图片画廊场景。

这两种方式都是提高网页性能的方式,两者主要区别是一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。

常见图片分类及适用场景
黑山老妖的小站
11-12 4929
图片优化–质量与性能的博弈 无论是作者还是《高性能网站建设指南》的作者,都认为图片的优化优先级高于js和css的优先级,因为这是用户可感知的。 图片压缩我们通常会选择压缩图片的体积来减少网络加载时长,但一般会牺牲一些图片成像效果。 目前主要的图片分类有JPEG/JPG、PNG、WebP、Base64、SVG JPEG/JPG 关键词:有损压缩、体积小、加载快、不支持透明 JPG 适用于呈现色彩丰富的图片,在我们日常开发中,JPG 图片经常作为大的背景图、轮播图或 Banner 图出现。 当在处理颜色对比强烈
实现图片加载的几种方式
热门推荐
前端小工
07-26 4万+
感觉自己好久没有写博客了,可能自己变懒了。不知道为什么最近有点迷茫,不知道是该去学一下新东西还是该去看一下具有深度的东西。新的技术需要关注,但是我要去研究一下jquery的源码,这个东西很早就想去看,无奈时间安排不过来。学了新的东西,没有机会去实践,很快就忘记了,但是我们还是要保持一种不断吸收新知识的姿态。讲了这么多废话,好了,开始今天的话题。实现图片加载的几种方式。 在开发的过程,我们经常会遇到
懒加载加载
weixin_33859844的博客
05-29 327
一、懒加载 1.什么是懒加载 懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式。用户滚动到它们之前,可视区域外的图像不会加载。这与图像加载相反,在长网页上使用延迟加载将使网页加载更快。在某些情况下,它还可以帮助减少服务器负载。常适用图片很多,页面很长的电商网站场景中。 2.为什么要用懒加载 能提升用户的体验,不妨设想下,用户打开像手机淘宝长页面的时候,如果页面上所...
前端性能优化-图片的加载懒加载
最新发布
weixin_43279210的博客
08-27 1193
在说到对图片资源进行优化时,那就不得不提到图片加载图片懒加载,可能很多朋友都了解这两者,但是一直没有很清晰的概念,以及什么时候用,用在什么场景下,今天就来详细的了解一下吧!
关于图片懒加载加载
Edison.困的博客
11-20 635
1、懒加载1.什么是懒加载懒加载也就是延迟加载。 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。2.为什么要使用懒加载?很多页面,内容很丰富,页面很长,图片较多。比如说各种商城页面。这些页面图片数量多,而且比较大,少
解析javascript图片懒加载加载的分析总结
10-21
总结来说,图片懒加载加载各有优劣,懒加载着重于减少服务器压力和提高首屏加载速度,而加载则侧重于提升用户体验,保证用户访问资源的快速响应。在实际开发中,开发者需要根据具体需求和场景选择合适的实现...
微信小程序实现图片懒加载的示例代码
08-28
微信小程序实现图片懒加载的示例代码是指通过在页面加载图片,提高用户体验度的一种技术。这种技术可以在微信小程序中实现,通过加载图片,减少用户等待的时间,提高用户体验度。 图片懒加载的原理是通过加载...
超详细的图片加载懒加载教程
FOR 的博客
09-04 8576
最近接手一个项目 。 结果光安装依赖都出现了一堆 麻烦 。 好不容易处理完一个 , 又来一个 。头疼啊 看到之前有一些加载的学习笔记。于是又查查找找 ,想想写写 把加载懒加载的笔记写完整 发现制图挺麻烦的!不知道你们有没有什么推荐? 写了挺久的这篇文章,有什么不对的地方欢迎评论或私聊指出 图片的加载懒加载 加载懒加载的字眼总会看到 。 其实加载懒加载不仅仅是用于加载图片资源。其他资源,文字,视频。都可以。 我们较常用或较需要使用的场景就是加载图片资源。 这里,我们也只讨论加载图片资源。.
前端图片懒加载(lazyload)的实现方法(提高用户体验)
08-29
图片懒加载(Lazy Load)是一种优化网页性能的技术,它允许我们在网页内容加载时,只加载用户当前可视区域内的图片,而将不在视口范围内的图片延迟加载。这种技术尤其适用于内容丰富的网页,如社交媒体、博客或者...
图片加载
weixin_35749796的博客
01-05 322
图片加载是指在页面加载过程中提前加载图片的过程。这样做的好处是可以提高页面的加载速度,因为图片加载完成后就可以立即显示,而不必等到其他资源加载完成。 要实现图片加载,可以使用 <img> 标签的 src 属性来指定图片的 URL,并将该标签添加到页面的 <head> 部分中。例如: <head> <img src="image1.jpg" styl...
图片懒加载加载
weixin_44669966的博客
03-04 167
加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染,增加服务器前端压力 懒加载:迟缓甚至不加载,主要目的是作为服务器前端的优化,减少请求书或延迟请求数,对服务器前端有一定的缓解压力作用 ...
js懒加载加载
web_Fkk的博客
07-01 382
js懒加载 意义 懒加载(LazyLoad)是前端优化的一种有效方式,能极大的提升用户体验,图片加载是其重点,如果加载图片过多将大大增http请求次数或大小,然而更多时候用户并不会浏览到全部加载进来的图片,这种代价是非常不值得的,所以当用户浏览到当前视口时再去加载相应的图片无疑是两全其美的选择 原理 只有img标签中的src写入了图片的地址,加载页面时才会请求图片,所以使用懒加载时在src中并不写...
图片懒加载加载
qq_42451776的博客
06-02 326
图片懒加载 1. 给需要懒加载的都加上类名 lazy_load <img class="lazy_load" src="img/default.png" data-src="img/sinaweibo.png" alt=""> 2. js文件 $(function () { let length = $(".lazy_load").length srcrllLazy() setTimeout(() => { window.scrollTo(0,0)
图片的懒加载加载
weixin_47450807的博客
03-09 1905
一、写在前面 图片的懒加载和图片的加载都是前端性能优化的一个方案,当然可能存在不同的应用场景,下面我们将总结一下这两个方案。 二、图片懒加载 图片的懒加载是什么? 图片的懒加载指的是在长网页中延迟加载图像,是一种很好的优化网页性能的方式。用户滚动到他们之前,可视区域之外的图像是不会加载的。在某种情况下,他还可以帮助减少服务器负载,常适使图片很多,页面很长的电商网站场景中。 为什么要使用懒加载? 可以提升用户体验:我们可以想一下,当用户打开手机淘宝的话,如果页面上全部的图片都需要加载,由于图片 数量巨大,等
JS图片加载技术解析与插件应用
**加载懒加载的区别** 1. **行为差异**:加载是提前加载所有或部分资源,而懒加载是在需要时才加载。 2. **服务器压力**:加载增加服务器前端的负载,而懒加载有助于缓解服务器压力。 3. **用户体验**:...
33
原创
11
点赞
20
收藏
4
粉丝
关注
私信
写文章

热门文章

  • javascript创建对象及继承方式 1615
  • javascript数据结构——队列 1418
  • 微信小程序引入阿里巴巴icon步骤及报错解决 1394
  • javascript数据结构——栈 902
  • HTML5—拖拽 696

分类专栏

  • 前端私密
  • Css 7篇
  • Promise 2篇
  • Javascript 14篇
  • Javascript设计模式 2篇
  • 浏览器 1篇
  • javascript数据结构 4篇
  • 微信小程序 1篇

最新文章

  • HTML5—拖拽
  • 志愿东农使用说明
  • CSS居中
2023年25篇
2022年8篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳坪山网站建设公司奉化网站优化云南网站seo优化需要多少钱网站seo优化软件优质商家网站长尾关键词优化如何收费枣庄seo网站优化平台公司通辽市网站seo优化排名茶山网站优化网站建设优化首推金手指霸屏都匀网站seo优化关键词武汉网站优化一年多少钱如何优化网站提高收录宝山区360网站优化平台网站栏目怎么优化南宁网站优化常识网站优化需要做什么动作怎样优化网站潘刳乚云速捷做移动网站优化排名首页杭州好的服务行业网站优化嵊州高端网站优化热门网站优化系统加盟平台尖草坪网站优化眉山营销企业网站优化湖州专业网站优化怀化咨询营销型网站优化浏阳网站优化seo推广服务郑州网站优化如何收费商丘网站建设优化渠道电话网站进行优化武汉专业seo网站优化费用广州网站优化推广市场香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化