现代图片性能优化: 懒加载及异步图像解码方案

news2024/11/24 18:36:24

图片的懒加载

懒加载是一种网页性能优化的常见方式,它能极大的提升用户体验。到今天,现在一张图片超过几 M 已经是常见事了。如果每次进入页面都需要请求页面上的所有的图片资源,会较大的影响用户体验,对用户的带宽也是一种极大的损耗。

所以,图片懒加载的意义即是,当页面未滚动到相应区域,该区域内的图片资源(网络请求)不会被加载。反之,当页面滚动到相应区域,相关图片资源的请求才会被发起。

在过去,我们通常都是使用 JavaScript 方案进行图片的懒加载。而今天,我们在图片的懒加载实现上,有了更多不一样的选择。

使用 content-visibility: auto 实现图片内容的延迟渲染

一个相对较为冷门的属性 – content-visibility

content-visibility:属性控制一个元素是否渲染其内容,它允许用户代理(浏览器)潜在地省略大量布局和渲染工作,直到需要它为止。

利用 content-visibility 的特性,我们可以实现如果该元素当前不在屏幕上,则不会渲染其后代元素。

如果有这个的Dom

<div v-for="item in items" :key="item">
   <div class="container-box">
      <p>-------------{{ item.id }}-------------</p>   
      <img :src="item.src" alt=""/>
   </div>
</div>

<script>
export default {
  data() {
    return {
      items: [{
        id: 0,
        src: "http://g.hiphotos.baidu.com/image/pic/item/6d81800a19d8bc3e770bd00d868ba61ea9d345f2.jpg"
      },{
        id: 1,
        src: "https://gtd.alicdn.com/sns_logo/i3/TB1wnBTKFXXXXcQXXXXSutbFXXX.jpg_240x240xz.jpg"
      }, {
        id: 2,
        src: "//www.baidu.com/img/flexible/logo/pc/result.png"
      }, {
        id: 3,
        src: "http://e.hiphotos.baidu.com/image/pic/item/a1ec08fa513d2697e542494057fbb2fb4316d81e.jpg"
      }, {
        id: 4,
        src: "http://c.hiphotos.baidu.com/image/pic/item/30adcbef76094b36de8a2fe5a1cc7cd98d109d99.jpg"
      }, {
        id: 5,
        src: "http://h.hiphotos.baidu.com/image/pic/item/7c1ed21b0ef41bd5f2c2a9e953da81cb39db3d1d.jpg"
      }, {
        id: 6,
        src: "http://g.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d5277fd5d0628535e5dd6f4a.jpg"
      }, {
        id: 7,
        src: "http://e.hiphotos.baidu.com/image/pic/item/4e4a20a4462309f7e41f5cfe760e0cf3d6cad6ee.jpg"
      }, {
        id: 8,
        src: "http://b.hiphotos.baidu.com/image/pic/item/9d82d158ccbf6c81b94575cfb93eb13533fa40a2.jpg"
      }, {
        id: 9,
        src: "http://e.hiphotos.baidu.com/image/pic/item/4bed2e738bd4b31c1badd5a685d6277f9e2ff81e.jpg"
      }, {
        id: 10,
        src: "http://g.hiphotos.baidu.com/image/pic/item/0d338744ebf81a4c87a3add4d52a6059252da61e.jpg"
      }, {
        id: 11,
        src: "http://a.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee5080c8142ff5e0fe99257e19.jpg"
      }, {
        id: 12,
        src: "http://f.hiphotos.baidu.com/image/pic/item/4034970a304e251f503521f5a586c9177e3e53f9.jpg"
      }, {
        id: 13,
        src: "http://b.hiphotos.baidu.com/image/pic/item/279759ee3d6d55fbb3586c0168224f4a20a4dd7e.jpg"
      }, {
        id: 14,
        src: "http://a.hiphotos.baidu.com/image/pic/item/e824b899a9014c087eb617650e7b02087af4f464.jpg"
      }]
    }
  }
}
</script>

只需要给需要延迟(实时)渲染的元素,设置简单的 CSS 样式:

.container-box {
  content-visibility: auto;
}

但是它有一个缺点
滚动条在向下滚动在不断的抽搐,这是由于下面不在可视区域内的内容,一开始是没有被渲染的,在每次滚动的过程中,才逐渐渲染,以此来提升性能。

当然,其实使用 content-visibility: auto 并不能真正意义上实现图片的懒加载。

这是因为,即便当前页面可视区域外的内容未被渲染,但是图片资源的 HTTP/HTTPS 请求,依然会在页面一开始被触发!

因此,这也得到了一个非常重要的结论:

content-visibility: auto 无法直接替代图片懒加载,设置了 content-visibility: auto 的元素在可视区外只是未被渲染,但是其中的静态资源仍旧会在页面初始化的时候被全部加载。因此,它更像是一个虚拟列表的替代方案。

参考:https://github.com/chokcoco/iCSS/issues/185

使用 loading=“lazy” 和 decoding=“async” HTML属性实现图片懒加载

content-visibility略有瑕疵,还好我们有其他方式

loading="lazy"

HTML5 新增了一个 loading 属性。

到今天,除了 IE 系列浏览器,目前都支持通过 loading 属性实现延迟加载。此属性可以添加到 < img > 元素中,也可以添加到 < iframe > 元素中。

属性的值为 loading=lazy 会告诉浏览器,如果图像位于可视区时,则立即加载图像,并在用户滚动到它们附近时获取其他图像。

可以这样使用它

<img :src="item.src" alt="" loading="lazy"/>

这样,便可以非常便捷的实现图片的懒加载,省去了添加繁琐的 JavaScript 代码的过程。

loading=lazy 到(2023-02-26)的兼容性,还是非常不错的:
在这里插入图片描述

decoding="async

使用 decoding=async 实现图片的异步解码
除了 loading=lazy,HTML5 还新增了一个非常有意思的属性增强图片的用户体验。那就是 decoding 属性。

HTMLImageElement 接口的 decoding 属性用于告诉浏览器使用何种方式解析图像数据。

它的可选取值如下:

sync: 同步解码图像,保证与其他内容一起显示。
async: 异步解码图像,加快显示其他内容。
auto: 默认模式,表示不偏好解码模式。由浏览器决定哪种方式更适合用户。
上文其实也提及了,浏览器在进行图片渲染展示的过程中,是需要对图片文件进行解码的,这一个过程快慢与图片格式有关。

而如果我们不希望图片的渲染解码影响页面的其他内容的展示,可以使用 decoding=async 选项,像是这样:

<img :src="item.src" alt="" loading="lazy" decoding="async"/>

这样,浏览器便会异步解码图像,加快显示其他内容。这是图片优化方案中可选的一环。

同样的,我们来看看到(2023-02-26),decoding=“async” 的兼容性,整体还是非常不错的,作为渐进增强方案使用,是非常好的选择。

在这里插入图片描述

性能测试

检验 loading=lazy 与 decoding=async 效果

准备14张图片的页面,每个图片url大小不一

<template>
  <div class="container">
    <!-- loading="lazy" 懒加载 -->
    <div v-for="item in items" :key="item">
      <div class="container-box2">
        <p>-------------{{ item.id }}-------------</p>   
        <img :src="item.src" alt="" loading="lazy" decoding="async"/>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [{
        id: 0,
        src: "http://g.hiphotos.baidu.com/image/pic/item/6d81800a19d8bc3e770bd00d868ba61ea9d345f2.jpg"
      },{
        id: 1,
        src: "https://gtd.alicdn.com/sns_logo/i3/TB1wnBTKFXXXXcQXXXXSutbFXXX.jpg_240x240xz.jpg"
      }, {
        id: 2,
        src: "//www.baidu.com/img/flexible/logo/pc/result.png"
      }, {
        id: 3,
        src: "http://e.hiphotos.baidu.com/image/pic/item/a1ec08fa513d2697e542494057fbb2fb4316d81e.jpg"
      }, {
        id: 4,
        src: "http://c.hiphotos.baidu.com/image/pic/item/30adcbef76094b36de8a2fe5a1cc7cd98d109d99.jpg"
      }, {
        id: 5,
        src: "http://h.hiphotos.baidu.com/image/pic/item/7c1ed21b0ef41bd5f2c2a9e953da81cb39db3d1d.jpg"
      }, {
        id: 6,
        src: "http://g.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d5277fd5d0628535e5dd6f4a.jpg"
      }, {
        id: 7,
        src: "http://e.hiphotos.baidu.com/image/pic/item/4e4a20a4462309f7e41f5cfe760e0cf3d6cad6ee.jpg"
      }, {
        id: 8,
        src: "http://b.hiphotos.baidu.com/image/pic/item/9d82d158ccbf6c81b94575cfb93eb13533fa40a2.jpg"
      }, {
        id: 9,
        src: "http://e.hiphotos.baidu.com/image/pic/item/4bed2e738bd4b31c1badd5a685d6277f9e2ff81e.jpg"
      }, {
        id: 10,
        src: "http://g.hiphotos.baidu.com/image/pic/item/0d338744ebf81a4c87a3add4d52a6059252da61e.jpg"
      }, {
        id: 11,
        src: "http://a.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee5080c8142ff5e0fe99257e19.jpg"
      }, {
        id: 12,
        src: "http://f.hiphotos.baidu.com/image/pic/item/4034970a304e251f503521f5a586c9177e3e53f9.jpg"
      }, {
        id: 13,
        src: "http://b.hiphotos.baidu.com/image/pic/item/279759ee3d6d55fbb3586c0168224f4a20a4dd7e.jpg"
      }, {
        id: 14,
        src: "http://a.hiphotos.baidu.com/image/pic/item/e824b899a9014c087eb617650e7b02087af4f464.jpg"
      }]
    }
  }
}
</script>

CSS 的设置也很重要,由于是纯图片页面,如果不给图片设置默认高宽,最页面刷新的一瞬间, 元素的高宽都是 0,会导致所有 元素都在可视区内,所以,我们需要给 设置一个默认的高宽:

<style>
  img {
    margin: 8px;
    width: 202px;
    height: 166px;
    object-fit: cover;
  }
</style>

首先看看没有添加懒加载的效果(试验环境的网不太好)
](https://img-blog.csdnimg.cn/18943ccdd0594212b0fc319faae60f06.png)

可以看到,全部的图片资源在页面加载的过程中都请求了,页面 Load 事件完成的时间为 1.01s

现在我们为他加上 loading="lazy"decoding=async"

首次进入页面仅请求显示在屏幕上的图片,只发送了6个请求,页面 Load 事件完成的时间为 367 ms
在这里插入图片描述
页面滚动时,显示的图片才会继续发送请求

如果在图片量更大的情况下,优化效果会更加显著

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【id:76】【20分】B. 商旅信用卡(多重继承)

题目描述 某旅游网站&#xff08;假设旅程网&#xff09;和某银行推出旅游综合服务联名卡—旅程信用卡&#xff0c;兼具旅程会员卡和银行信用卡功能。 旅程会员卡&#xff0c;有会员卡号&#xff08;int&#xff09;、旅程积分&#xff08;int&#xff09;&#xff0c;通过会员…

Spring Cloud Kubernetes详解

目录 一、 为什么你需要 Spring Cloud Kubernetes&#xff1f; 二、 Starter 三、 用于 Kubernetes 的 DiscoveryClient 四、Kubernetes 原生服务发现&#xff08;service discovery&#xff09; 五、Kubernetes PropertySource 的实现 1、使用 ConfigMap PropertySource …

ssg标识符

1. 关键字&#xff08;keyword&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; HelloWorld案例中&#xff0c;出现的关键字有 class、public 、 static 、 void 等&#xff0c;这些单词已经被Java定义…

【appium】appium自动化入门之API(上)

这个系列预计会讲启动APP—元素定位—初步使用—API命令详解 本系列没提过的知识点也不用急&#xff0c;大家可以点击文末小卡片进群来一起交流 目录 第 2 章 初步使用 2.1 启动 app&#xff08;淘宝&#xff09; 前言 2.1.1 下载 aapt 2.1.2 获取 apk 包名 2.1.3 获取 launch…

Linux之通配符、引号的使用

目录 Linux之通配符、引号的使用 通配符 定义 范围 用法及含义 案例 引号使用 案例 Linux之通配符、引号的使用 通配符 定义 通配符是一种特殊语句&#xff0c;主要有星号(*)、问号(?)等表示&#xff0c;用来模糊搜索文件&#xff0c;当查找目录或文件时&#xff0c;…

Gin微服务框架_golang web框架_完整示例Demo

Gin简介 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&…

Spark入门

Spark概述 1.1 什么是Spark 回顾&#xff1a;Hadoop主要解决&#xff0c;海量数据的存储和海量数据的分析计算。 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 1.2 Hadoop与Spark历史 MR是进程模型&#xff0c;ResourceManager NodeManager都是进程&…

107-Spring的底层原理(上篇)

Spring的底层原理 之前说明的都是Spring的应用&#xff08;64章博客开始&#xff08;包括其后面的相关博客&#xff09;&#xff09;&#xff0c;现在来说明他为什么可以那样做 在说明之前&#xff0c;这里需要对64章博客中的spring的了解需要再次的说明&#xff1a; Spring…

Unity中UI方案。IMGUI、UIElement、UGUI、NGUI

引言 unity中有很多ui方案&#xff0c;各种方案有什么优势劣势&#xff0c;这里一一列举一下&#xff0c;知识扩充一下。 UI方案适用范围IMGUI仅用于Editor扩展&#xff0c;或运行时DebugUIElement可用于发布运行时和EditorUGUIRuntime&#xff0c;两大主流 UI 解决方案之一NG…

python语法-MySQL数据库(综合案例:读取文件,写入MySQL数据库中)

python语法-MySQL数据库 综合案例&#xff1a;读取文件&#xff0c;写入MySQL数据库中 &#xff08;项目数据见文章末参考内容&#xff09; 解析&#xff1a; sql代码如下&#xff1a; create database pysql charset utf8;use pysql;select database();create table orders…

华为OD机试真题 JavaScript 实现【求小球落地5次后所经历的路程和第5次反弹的高度】【牛客练习题 HJ38】

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…

今年十八,期末速刷(操作系统篇1)

马上期末了&#xff0c;想问问各位期末考几科 我家学校网安考7科呜呜呜 只能出点文章一把梭了。。。 争取只挂一科 先来先算法&#xff08;FCFS&#xff09; 算法思想 我今天学FCFS只有一个要求 公平、公平 还是tnd公平 算法规则 按照进程的先后顺序来进行服务。 是否…

Web自动化测试:WebDriverWait元素等待和全局设置

由于现在部分web应用加载方式的选择&#xff0c;页面会需要一定时间逐渐加载完毕&#xff0c;也就是说有的页面元素先加载出来&#xff0c;有的元素后加载出来。如果直接定位所查找的元素的话&#xff0c;可能会由于此元素尚未加载完毕找不到元素从而报错&#xff0c;由于网络不…

leetcode 647.回文子串

题目描述 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会…

【干货】有效的项目绩效管理评估,能成为组织成长的引擎

是谁已经开始在写年中总结了&#xff1f; 对于这件事&#xff0c;项目经理们肯定不会缺席&#xff0c;毕竟每周、每月、每个季度都少不了项目报告。这两天项目经理小刘&#xff0c;还在办公室吐槽项目绩效的数据实在太差了&#xff0c;询问如何能巧妙美化数据&#xff0c;这是…

算法学习day20

文章目录 513.找树左下角的值递归迭代 112 .路径总和递归迭代 113.路径总和II递归 106.从中序与后序遍历序列构造二叉树递归 105.从前序与中序遍历序列构造二叉树卡尔递归版本递归优化 总结 513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底…

K8S从入门到精通之基本组件介绍

文章目录 0.前言k8s 的dashboard基本组件活动图 1. 基本概念1.1. kube-apiserver1.2. etcd1.3. kube-scheduler1.4. kube-controller-manager1.5. kubelet1.6. kube-proxy1.7. coredns&#xff1a;1.8. Container Runtime1.9. Ingress Controller1.10. Storage Plugin1.11. Das…

原点安全携“金融机构消费者个人信息保护解决方案”亮相 2023 中国金融数字化转型发展大会

6 月 7 日&#xff0c;由中国金融电子化集团有限公司、南京市建邺区人民政府、中国人民银行南京分行主办&#xff0c;主题为“数驱转型 智创未来”的「2023 中国金融数字化转型发展大会暨第十三届中国城市商业银行信息化发展创新座谈会」于南京国际博览中心隆重召开。 本次会议…

使用POI实现JAVA操作Excel

Apache POI POI提供API给JAVA程序对Microsoft Office格式档案读和写的功能 POI工具介绍 POI 是用Java编写的免费开源的跨平台的 Java API&#xff0c;Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。主要是运用其中读取和输出excel的功能。 POI官网地…