HTML深度探索 :img应用与实践

news2024/9/20 5:46:53

HTML深度探索 :img应用与实践

  • 1、定义和用法
  • 2、图像格式
  • 3、常用属性
  • 4、预加载和懒加载
    • 4.1 预加载
    • 4.2 懒加载


1、定义和用法

  • HTML 元素 <img>将一张图像嵌入文档。

  • 从技术上讲,实际上并没有将图像插入到网页中,而是将图像链接到了网页。<img> 标签创建了一个容器,用于引用图像。

  • <img> 标签有两个必需的属性:

    • src - 规定图像的路径;
    • alt - 如果由于某种原因无法显示图像,则指定图像的替代文本;同时在无障碍的场景下,该属性也十分有用!
  • 注意:另外,始终要指定图像的宽度和高度。如果未指定宽度和高度,则在加载图像时页面可能会闪烁。

当在网页中插入图像但没有明确指定其宽度和高度时,浏览器最初并不知道该图像的实际尺寸。因此,在解析HTML并构建渲染树时,浏览器会预留一个默认大小(通常是32x32像素)或基于CSS的计算值的空间给图像。

一旦图像文件下载并解析,浏览器发现其实际尺寸与预留空间不匹配时,就需要重新布局页面以适应图像的真实大小。这个过程会导致已加载的内容突然移动,从而产生所谓的“内容闪烁”或“重排闪烁”,这会降低用户体验,尤其是在移动设备上。

这种布局变化还会影响网页的累积布局偏移(Cumulative Layout Shift, CLS)。CLS度量了用户在页面加载过程中非预期的布局变化程度。较大的CLS值表明页面元素在加载时有较多的移动,这通常被认为是负面的用户体验。因此,为了优化网页性能和提高用户满意度,最好在HTML中为图像指定确切的宽度和高度属性。这样可以让浏览器在加载图像之前就正确预留空间,避免不必要的布局调整和闪烁现象。

示例

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .image {
            width: 500px;
            height: 500px;
            object-fit: cover;
        }
    </style>

</head>

<body>
    <img class="image"
        src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg" alt="Ai绘图" />
</body>

</html>

在这里插入图片描述

2、图像格式

Web 最常用的图像格式是:

  • APNG(动态可移植网络图形)——无损动画序列的不错选择(GIF 性能较差)。
  • AVIF(AV1 图像文件格式)——静态图像或动画的不错选择,其性能较好。
  • GIF(图像互换格式)——简单图像和动画的不错选择。
  • JPEG(联合图像专家组)——有损压缩静态图像的不错选择(目前最流行的格式)。
  • PNG(便携式网络图形)——对于无损压缩静态图像而言是不错的选择(质量略好于 JPEG)。
  • SVG(可缩放矢量图形)——矢量图像格式。用于必须以不同尺寸准确描绘的图像。
  • WebP(网络图片格式)——图像和动画的绝佳选择。

推荐使用 WebP 图像格式,因为它们在静态图像和动画的性能均比 PNG、JPEG、JIF 好得多。

对于必须以不同尺寸准确绘制的图像,则仍然推荐使用 SVG 格式。

3、常用属性

  • alt – 定义了图像的备用文本描述。

  • title – 元素的值一般作为提示条(tooltip)呈现给用户,在光标于图片上停下后显示出来。

  • height – 图像的固有高度,以像素为单位。必须是没有单位的整数值。

  • width – 图像的宽度,以像素为单位。必须是没有单位的整数。

实际工作中宽度和高度并不会共同使用,因为如果只单独设置了一个属性比如宽度,高度会等比例进行缩放。

  • loading – 指示浏览器应当如何加载该图像。
    • eager:立即加载图像,不管它是否在可视视口(visible viewport)之外(默认值)。
    • lazy:延迟加载图像,直到它和视口接近到一个计算得到的距离(由浏览器定义)。目的是在需要图像之前,避免加载图像所需要的网络和存储带宽。这通常会提高大多数典型用场景中内容的性能。
<img loading="lazy" class="image" src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg" alt="Ai绘图" />
  • decoding – 指定浏览器如何解码图像。可以是 “sync”(同步)或 “async”(异步)。默认为 “sync”。
<img decoding="sync" class="image" src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg" alt="Ai绘图" />

decoding 和 loading 属性在 <img> 标签中控制着图像的加载和解码行为,它们各自负责不同的层面。decoding 属性控制图像的解码方式。loading 属性控制图像何时开始加载。

  • crossorigin (crossOrigin) – 设置跨域资源共享(CORS)属性,允许从不同源加载图像并访问其像素数据。

  • src – 图像的 URL,这个属性对<img>元素来说是必需的。

  • sizes – 用于响应式设计,告诉浏览器根据不同的视口尺寸选择合适的图像资源。

  • srcset – 以逗号分隔的一个或多个字符串列表表明一系列用户代理使用的可能的图像。

<img src="image-small.jpg"
     srcset="image-320w.jpg 320w,
             image-480w.jpg 480w,
             image-800w.jpg 800w,
             image-large.jpg 1200w"
     sizes="(max-width: 600px) 100vw,
            (max-width: 900px) 50vw,
            33vw"
     alt="example image">

这个配置告诉浏览器:

在屏幕宽度小于等于600px时,图像应占据整个视口宽度 (100vw)。 在屏幕宽度小于等于900px时,图像应占据视口的一半宽度
(50vw)。 在屏幕宽度大于900px时,图像应占据视口的三分之一宽度 (33vw)。
浏览器会根据当前视口宽度和可用的图像资源来决定加载哪个图像版本,以达到最佳的性能和视觉效果。

<picture>
  <source media="(max-width: 600px)" srcset="small-image.jpg">
  <img src="large-image.jpg" alt="图片描述">
</picture>

4、预加载和懒加载

4.1 预加载

  • 图像预加载(Image Preloading)是一种优化技术,它允许在页面的其他部分完全加载之前就开始加载图像,从而提高用户体验,尤其是对于那些位于页面下方但对用户来说很重要的图像。以下是在HTML中实现图像预加载的几种方式:
  1. 使用 <link rel="preload">
  • <link rel="preload"> 标签允许开发者提前告知浏览器加载特定的资源,包括图像。这是目前推荐的方法,因为它是专门为预加载设计的,而且被广泛支持。
<link rel="preload" href="path/to/image.jpg" as="image">
  • 这里的 as 属性指定了资源的类型,在这里是图像。这使得浏览器可以优先加载这些图像,即使它们在页面上的位置很远。
  1. 使用 JavaScript
  • 通过JavaScript,你可以动态地创建一个新的 Image 对象并加载图像。这种方法在旧的浏览器中更为常见,但现在由于 <link rel="preload"> 的存在而较少使用。
// JavaScript 预加载图像示例
window.addEventListener('DOMContentLoaded', function() {
    var img = new Image();
    img.src = 'path/to/image.jpg';
});
const imageUrls = ["image1.jpg", "image2.jpg", "image3.jpg"];
const images = [];
 
imageUrls.forEach(url => {
  const img = new Image();
  img.src = url;
  images.push(img);
});
  • 在上述代码中,通过创建一个新的 Image 对象,并设置其 src 属性,可以在后台加载图像。这样,当需要显示这些图像时,它们已经在浏览器中缓存了。
  1. 利用 CSS Background Images
  • 如果图像将用作背景图像,你可以利用CSS的背景图像属性进行预加载。虽然这不是严格意义上的预加载,但它可以确保背景图像在需要时已经加载完成。
/* CSS 预加载背景图像 */
.some-element {
    background-image: url('path/to/image.jpg');
}

4.2 懒加载

  1. 使用 loading 属性(HTML5):HTML5 引入了 loading 属性,可以用于延迟加载图像,仅当图像进入用户视口时才会加载。当用户滚动到图像所在的位置时,浏览器会自动加载图像。
<img src="image.jpg" alt="图片描述" loading="lazy">
  1. 使用 Intersection Observer(JavaScript):Intersection Observer 是一种 JavaScript API,可以监听元素是否进入用户视口,从而实现懒加载
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .image {
            width: 500px;
            height: 500px;
            object-fit: cover;
            display: block;
        }
    </style>

</head>

<body>
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />
    <img class="image" src=''
        data-src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/dcf2ba9b17ef9b09020a67e42fa6cf28.jpg"
        alt="Ai绘图" />

    <script>
        document.addEventListener('DOMContentLoaded', function () {
            const images = document.querySelectorAll('.image');

            const observer = new IntersectionObserver((entries, observer) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        // 当图像进入视口时,用实际的图像URL替换占位符
                        entry.target.src = entry.target.dataset.src;
                        console.log(entry.target.src);
                        // 从图像中删除懒加载类,防止重复加载
                        entry.target.classList.remove('lazy-load');
                        // 不再观察这个元素,避免不必要的计算
                        observer.unobserve(entry.target);
                    }
                });
            }, {
                // 可选:配置观察选项,如根元素、阈值等
                threshold: 0.5 // 当元素有50%出现在视口中时就开始加载
            });

            images.forEach(image => {
                observer.observe(image);
            });
        });
    </script>
</body>

</html>
  • 在文档加载完成后,选取所有具有image类的图像元素。创建一个新的IntersectionObserver实例,当被观察的元素与视口相交时调用回调函数。遍历所有被观察的图像,如果图像进入了视口,就用data-src属性中存储的URL替换src属性的值,同时删除image类,并停止对该图像的观察。

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

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

相关文章

17种最佳的联盟营销工具,助你赚取更多佣金

通过最新、最先进的工具获得竞争优势&#xff0c;并启动你的联盟营销策略&#xff0c;以提高效率和节省&#xff08;大量&#xff09;时间。 如果你销售联盟产品或服务&#xff0c;你可能知道&#xff0c;当你意识到市场营销涉及大量工作&#xff08;有时还包括金钱&#xff0…

【算法思想·二叉树】后续篇

本文参考labuladong算法笔记[二叉树心法&#xff08;后序篇 | labuladong 的算法笔记] 前序位置的代码只能从函数参数中获取父节点传递来的数据&#xff0c;而后序位置的代码不仅可以获取参数数据&#xff0c;还可以获取到子树通过函数返回值传递回来的数据。 那么换句话说&am…

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器 Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方…

在python里把图变成gif

import scipy.io import matplotlib.pyplot as plt import imageio import numpy as npdata scipy.io.loadmat("/文件路径/Sol.mat")# 提取数据 t_current data[t].flatten() XX, YY np.meshgrid(data[x].flatten(), data[y].flatten()) u_pred_plot_final data[…

轻松应对:环保专包二级资质续期常见问题解答

在环保专包二级资质续期过程中&#xff0c;企业可能会遇到一系列常见问题。以下是对这些问题的详细解答&#xff0c;旨在帮助企业轻松应对续期挑战&#xff1a; 一、政策理解与把握 问题&#xff1a;如何准确理解和把握最新的环保政策和资质续期要求&#xff1f; 解答&#x…

HCIA--实验十三:VLAN间通信子接口实验/双单臂路由实验

一、实验内容 1.需求/要求&#xff1a; 将两个单臂路由通过两台交换机连接起来&#xff0c;成为双臂路由&#xff0c;并探讨这么做的原因。实现全网通&#xff0c;让任何一台主机之间都可以通信。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC配置ip地址…

传感器技术在构建实时监控系统中有什么作用

在无线传感器技术中&#xff0c;物联网生成的传感器数据通过无线方式传输到网络服务器&#xff0c;工程师可以在其中跟踪参数。远距离无线通信提高了工业 4.0 的成本效率并减少了人力。实时监控系统旨在显示传感器节点周围的快速变化&#xff0c;这需要快速、低延迟的数据传输。…

数据分析与挖掘课程相关资源

这是在gitee上整的关于这门课的一个开源项目。 https://gitee.com/rainpet/python-data-analysis-and-mining-demo 头歌平台。 常见问题&#xff1a; 1、如何确认conda的版本&#xff0c;执行如下命令&#xff1a; conda list anaconda$2、实验室登陆后&#xff0c;无法上网&a…

JAVA开源项目 大学生租房平台 计算机毕业设计

本文项目编号 T 019 &#xff0c;文末自助获取源码 \color{red}{T019&#xff0c;文末自助获取源码} T019&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

浅谈人工智能之基于ollama的常见变量设置

浅谈人工智能之基于ollama的常见变量设置 全局命令设置 现象&#xff1a;无法直接使用命令ollama 问题显示如下&#xff1a; [rootlocalhost LLM]# ollama -bash: ollama: command not found 解决方法一&#xff1a; 第一步&#xff1a;输入如下命令&#xff1a; [rootloca…

Android Studio偶尔打开Flutter项目没有智能提示的解决方案

Flutter支持多种IDE来编程&#xff0c;我曾使用过Android Studio和VSC两款软件&#xff0c;但因为长期使用Android Studio的原因&#xff0c;使用起来会比VSC顺手&#xff0c;然后就发现偶尔AS加载Flutter项目会无法使用智能提示&#xff0c;也没有代码高亮等 问题出现的原因&…

力扣面试150 三角形最小路径和 DFS 记忆化搜索 DP 滚动数组优化DP

Problem: 120. 三角形最小路径和 &#x1f469;‍&#x1f3eb; 甜姐题解 Code class Solution {// 朴素DP// public int minimumTotal(List<List<Integer>> triangle) {// int n triangle.size();// int[][] dp new int[n1][n1];// for(int i n-1; i > 0…

公积金基数两万,养了征信三个月之后,结果怎么样了?

近期&#xff0c;有幸与一位颇具代表性的信贷经历者&#xff0c;进行了深入的交流。她的故事&#xff0c;尤其是对那些在信贷领域迷茫徘徊的朋友来说&#xff0c;无疑是一盏警示灯&#xff0c;提醒我们如何在金融海洋中稳健航行。 黄女士的信贷迷航 黄女士&#xff0c;一位拥有…

SpringMvc 之处理器方法参数解析器(HandlerMethodArgumentResolver)

概述 HandlerMethodArgumentResolver 是 Spring MVC 框架中的一个关键组件&#xff0c;用于解析控制器&#xff08;Controller&#xff09;方法的参数。在 Spring MVC 中&#xff0c;当一个请求到达时&#xff0c;DispatcherServlet 会负责找到对应的处理器&#xff08;即控制器…

9月9日星期一今日早报简报微语报早读

9月9日星期一&#xff0c;农历八月初七&#xff0c;早报微语早读。 1、庆祝第40个教师节&#xff0c;全国585个单位、1790人受表彰&#xff1b; 2、中国残奥军团94金76银50铜收官&#xff1a;连续6届残奥会金牌和奖牌榜第一&#xff1b; 3、三部门&#xff1a;拟允许在京津沪…

1688电商运营到底怎么做竞品分析(超细节)

你得学会看同行数据&#xff0c;因为同行是蕞好的老师。你把同行分析透&#xff0c;把市场分析透以后&#xff0c;你才能真正的做好这个类目。我们就来详细的讲一下具体该怎么去分析同行&#xff0c;以及要看竞品的哪些数据。 一、分析市场 就是先看一下你的这个产品&#xf…

【go-zero】api与rpc使用k8s服务发现和部署

【go-zero】api与rpc使用k8s服务发现和部署 k8s安装 参考 debian12极简快速安装k8s 1、代码准备 参考上一篇【go-zero】api与rpc使用etcd服务发现 代码搬过来&#xff0c;因为要用到k8s环境换到linux了 &#xff0c;做一下修改 rpc 修改一下rpc的logic文件&#xff0c;增…

运放双电源供电和单电源供电的区别

运放是一种常见的电路元器件&#xff0c;广泛应用于模拟电路中。它可以使用不同的电源电压进行供电&#xff0c;其中最常见的是双电源供电和单电源供电。 下面将详细介绍它们之间的区别。 1.双电源供电 双电源供电意味着运放有两个电源引脚&#xff1a;正极和负极。正极一般连…

docker部署it工具箱,各种工具包

1.效果 2.步骤 2.1安装docker&&docker-compose 复制粘贴两脚本 bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrorsmain/DockerInstallation.sh)curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose…

调度任务是什么?如何设置调度任务?

本文将解释什么是调度任务&#xff0c;并且以FineDataLink为例说明如何设置调度任务。 一. 什么是调度任务&#xff1f; 调度平台是管理和自动化 ETL 的任务执行工具&#xff0c;通过指定任务依赖关系和执行顺序实现任务的自动执行&#xff0c;一般需要代码开发&#xff0c;使…