响应式图片与 CSS image-set

这篇具有很好参考价值的文章主要介绍了响应式图片与 CSS image-set。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 响应式图片
    • 前置知识
      • art direction problem
      • 光栅图像与矢量图像 raster image and vector images
    • img 能否担此重任
      • sizes
      • srcset
      • 实际看一看
    • picture: img 的好姐妹
      • source
      • 实际看一看
    • CSS image-set
      • 语法
      • 兼容性
    • 其他注意事项

响应式图片

图片在网页中占据了 超过 60% 的浏览带宽, 因此在移动设备显示图片或者显示小图时没有必要请求原图或高清图, 同样, 在高分辨率屏幕的设备请求低分辨率的图片也不合适, 因此如何请求图片就有一些门道值得探索!

前置知识

art direction problem

上面提到了在移动设备(或窄屏幕)上显示图像时可以请求低分辨率图, 或者使用裁剪过的图片以便图片的主要信息可以显示出来, 比如将图片中的人物裁剪出来. 另外在更宽一些的屏幕, 比如平板或折叠屏上请求第二个裁剪图片. 在更宽的屏幕, 比如笔记本(laptop)或者大型显示器(desktop)请求完整图像. 这种根据设备特性显示不同图像的问题就叫做 art direction problem, 艺术指导问题.

光栅图像与矢量图像 raster image and vector images

光栅图像是定义为像素网格的图片文件, 也称为位图, 常见的光栅图像有 PNG, JPEG, GIFICO. 光栅图像通常有固定大小的尺寸, 即宽有多少像素, 高有多少像素.

矢量图像是由算法定义的, 矢量图像包含形状(shape)和路径(path)定义, 计算机可以使用这些定义来计算出图像在屏幕上应该如何显示. 如此, 矢量图即便放大或缩小, 也不会像光栅图像变得模糊或像素化.

虽然矢量图有缩放的优势, 但是它只适合非常简单的图形、图案, 一旦矢量图需要包涵很多细节, 它就会变得非常复杂.

img 能否担此重任

sizes

这个属性的值是用英文逗号分开的多个字符串, 用来指定一系列大小, 其中每个大小包含

  • 一个媒体查询条件: 媒体查询条件描述的视口(viewpoint)的属性, 而不是图片的属性. 最后一个字符串不可以有这个值
  • 一个表达大小的值:

一个合法的 sizes 的值可以是

  • (max-width: 800px) 500px, 50vw

这个值表示在媒体查询条件成立时用来展示图片的大小. 比如 (max-width: 800px) 500px 表示如果屏幕宽度小于等于 800px 时, 用来展示图片的宽度应该是 500px. 有了 500px, 浏览器就会从 srcset 中找到最匹配的使用宽度描述符的图片. 如果没有 srcset 或者 srcset 提供的值不包含宽度描述符, 那么 sizes 属性不会生效.

srcset

<img> 有一个必选的 src 属性, 当然也有一个非必选的 srcset 属性. 这个属性的值是用英文逗号分开的字符串, 用来指定浏览器可以使用的图像, 其中每个字符串都由以下部分组成

  • 图像的 URL
  • 一个空格
  • 描述符(以下之一)
    • 宽度描述符(正整数+w), 比如 480w, 其中 w 就表示像素宽度(width), 但不可以使用 px 哦😯. 宽度描述符除以 sizes 属性中给出的大小来计算有效像素密度. 📖这里的宽度指的是图片的宽度, 我们可以在操作系统上查看图片的大小.

      • 响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像
    • 像素密度描述符(正浮点数+x), 比如 1.5x

    • 如果没有指定描述符, 那么默认值为 1x

所以, srcset 的合法值可以是

  • red.jpeg 480w
  • red.jpeg 480w, blue.jpeg 640w

当然, 在一个 srcset 属性中不可以同时使用宽度描述符和像素密度描述符, 比如 red.jpeg 480w, blue.jpeg 2x❌. 同样的, 如果图像的描述符完全相同也不行, 比如 red.jpeg 2x, blue.jpeg 2x

如果 srcset 使用了宽度描述符, 那么 <img> 必须提供 sizes 属性, 否则 srcset 自身会被忽略.

实际看一看

浏览器是如何根据 sizessrcset 做出选择的呢?

  1. 查看设备宽度
  2. 找出 sizes 中第一个为 true 的媒体查询条件并获得设置的大小值, 比如 W
  3. 加载 srcset 中宽度和 W 相同的图片大小, 如果没有, 那么加载一个大于 W 的图片大小.

来看代码

<img 
    src="blue.png"
    alt="test image"
    sizes="
      (max-width: 200px) 100px,
      (max-width: 400px) 200px,
      (max-width: 800px) 400px,
      100px"
    srcset="
      blue.png 100w,
      green.png 200w,
      red.png 400w"
  >

见下图, 和我们想象中的一模一样. 当 viewpoint 宽度小于 200px 时匹配展示的是蓝色图片; 当 viewpoint 宽度在 200px-400px 时展示的是绿色图片; 当 viewpoint 宽度在 400px-800px 时展示红色图片
响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像

这里有两点需要特别说明

1️⃣ 我在 Chrome 测试时表现和预期并不一样, 直到我切换 Firefox 并且选择 DPR (物理像素/逻辑像素) 为 1, 才可以看到预期结果. 后来我在 Chrome 找到了设置 DPR 的地方. 但是如果你在开发者工具中手动拖拽改变 viewpoint 宽度也没有效果, 你必须先手动切换到某一宽度, 然后刷新页面, 才可以看到预期效果, 但是 Firefox 就不是这样, Firefox 中的效果预览是实时的.

2️⃣ 实际上这三个图片的大小是一样的, 都是 200*200, 但是我们在 srcset 写的宽度可以不同于实际宽度从而来达到选择图片的目的哦~

现在你明白了使用如果在 <img> 上配置 sizessrcset 并且一个页面中有很多图像, 那么在移动端可以节省的流量将相当可观并且网页的加载速度也将大大加快! 不支持 srcsetsizes 的旧浏览器将正常加载 src 属性指定的图像.


接下来我们要看看在不同屏幕屏幕分辨率下应该如何设置

<h1 id="devicePixelRatio"></h1>
<img 
  src="blue.png"
  alt="test image"
  srcset="
    blue.png,
    green.png 2x,
    red.png 3x
  "
>
 <div style="width: 300px; border: 1px solid red;"></div>

我们可以使用 window.devicePixelRatio 这个 API 获取有关设备物理分辨率和逻辑分辨率的比值

document.getElementById('devicePixelRatio').innerHTML = `devicePixelRatio: ${window.devicePixelRatio}`

从下图可以看出, 有一点值得注意, 就是图片实际展示的大小在不同分辨率屏幕上不同, 这三张图片大小都是 200*200, 在一倍屏上图像大小就是 200, 在二倍屏上变为 100(1/2), 在三倍屏上变为 66.67(1/3).

响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像

picture: img 的好姐妹

<picture> 元素包含零个或多个 <source><img> 元素来为不同的显示或设备场景提供图像.

浏览器将考虑每一个 <source> 元素并找到最匹配的, 如果没有找到匹配项或者浏览器不支持 <picture> 元素, 那么最后就展示 <img> 这个兜底元素. 因此 <picture> 就有以下的使用场景

  • art direction: 根据不同的 media 条件来裁剪或修改图像, 比如在较窄的屏幕上显示具有更多图片细节的版本
  • 提供替代的图片格式: 针对某些不支持的图片格式提供替代的图片格式. 比如较新的 AVIFWEBP 有很多优点但是浏览器可能不支持, 这时候我们需要提供 PNG 或者 JPG 版本的图片来兜底.
  • 节省带宽, 加快页面加载: 注意这个场景和 art direction 不同, 因为在节省带宽的情况是我们通常加载相同图片的低分辨率版本, 而不是像 art direction 一样裁切图片以便显示图片的细节或特定区域.

再看例子之前我们还需要多了解一下 <source>

source

<source><picture>, <audio><video> 元素提供媒体资源. <source> 标签没有结束标签并且也没有内容(即开始标签和结束标签之间的内容). <source> 通常用于为相同的媒体内容提供不同的文件格式, 以便与不同的浏览器兼容. 有几个属性需要留意

  • type: 媒体类型的 MIME 类型, 比如 image/png
    • MIME: Multipurpose Internet Mail Extensions, 多用途互联网邮件扩展类型
  • src: 资源地址, 如果父元素是 <audio><video> 那么 src 不能为空; 如果父元素是 <picture> 可以为空
  • media: 媒体查询条件. 如果父元素是 <picture> 可以有这个属性, 否则不可以有这个属性.
  • srcset: 同 <img>srcset.

回到正题, <picture> 要决定加载那个 URL, 浏览器就会检查 <source>srcset, mediatype 属性以选择最兼容的 URL 来匹配当前的布局和设备.

实际看一看

<picture>
  <source media="(orientation: portrait)" srcset="blue.png">
  <source media="(orientation: landscape)" srcset="green.png">
  <img src="blue.png" />
</picture>

可以从下图看出, 当屏幕高度大于宽度时, 显示的是蓝色图, 高度小于宽度时显示的是绿色图.
响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像

其实案例还可以更复杂, 就是在 srcset 中匹配不同的 DPR, 当然篇幅有限就不一一尝试了.

CSS image-set()

CSS 中也有类似根据 DPR 选择图片的函数, 那就是 image-set(), 其让浏览器从给定集合中选择最合适的 CSS 图像, 主要用于高像素密度屏幕.

语法

[ <image> | <string> ] [ <resolution> || type( <string> ) ]

  • <image>: 可以是任何合法的 CSS 图像值, 包括 url() 引入的图片或者类似 CSS 函数 linear-gradient() 这类可以创建图像的函数. 但是不可以是 image-set(), 也就是 image-set() 不支持嵌套.
  • <string>: 如果第一个参数不是 <image>, 可以直接是一个图片的 URL.
  • <resolution>: (可选) image-set() 中每个图像都必须有独一无二的 resolution 值. 其中单位包括
    • x 或 dppx: 每像素单位点数
    • dpi: 每英寸点数
    • dcpm: 每厘米点数
  • type( <string> ): (可选)图片的 MIME 类型
.box {
  width: 200px;
  height: 200px;
  background-image: image-set(
    url("https://.../blue.png") 1x type("image/png"),
    linear-gradient(45deg, lightpink, lightskyblue) 2x,
    "https://.../red.png" 3x
  );
}

响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像

image-set() 不像 <picture> 一样有兜底的 <img> 可选, 因此对于不支持 image-set() 的浏览器来说, 需要在使用 image-set() 之前单独设置图像. 比如,

.box {
  background-image: url("https://.../blue.png"); /** 兜底 */
  background-image: image-set(
    url("https://.../blue.png") 1x type("image/png"),
    linear-gradient(45deg, lightpink, lightskyblue) 2x,
    "https://.../red.png" 3x
  );
}

兼容性

兼容性不太好, 看来这个属性距离大面积使用还差点时间. 另外在 Firefox 90 及以后版本, 也增加了 -webkit-image-set() 作为 image-set() 的别名支持.

响应式图片与 CSS image-set,css,HTML,css,前端,html,响应式图像

其他注意事项

在使用图片时常遇到的一个问题, 就是图片会超过父容器的宽度, 好巧不巧的是 CSSoverflow 的默认值是 visible, 就导致图像溢出, 因此可以考虑给所有的 <img> 或者 <video> 等元素设置最大宽度 (当然, <img> 的默认 displayinline, 但是一般的组件库或者 CSS 库都会修改 <img>displayblock 或者 inline-block)

img, video {
  max-width: 100%;
}

除此之外, 我们还需要为 <img> 的非必需 alt 属性提供有意义的描述, 这样做的目的是提高网页的可访问性. 通常屏幕阅读器或者其他辅助技术会读取 alt 的值以告诉用户图片展示了什么内容. 另外如果图片因为网络等其他原因无法加载时页面会展示 alt 的内容.

谢谢你看到这里😊文章来源地址https://www.toymoban.com/news/detail-690294.html

到了这里,关于响应式图片与 CSS image-set的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用CSS实现一个响应式图片幻灯片(Responsive Image Slider)效果?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月10日
    浏览(54)
  • 前端基础HTML、CSS--6(CSS-3)

    1.CSS的三大特性 CSS有三个非常重要的三个特性:层叠性、继承性、优先级。 1.1层叠性 相同选择器给设置相同的样式 ,此时一个样式就会 覆盖(层叠) 另一个冲突的样式。层叠性主要解决样式冲突的问题。 层叠性原则: ·样式冲突,遵循的是 就近原则 ,哪个样式离结构近

    2023年04月08日
    浏览(47)
  • HTML--CSS--图片和背景样式

    最基本的应该就是对大小的管理 width:像素值; 宽度 height:像素值; 高度 一样使用 border 进行定义 效果: 图片对齐和文本的对齐是一样的,也是用 text-align 进行,但需要注意不能直接在 img 定义,需要在父元素处定义 属性依然是: left 左对齐 center 居中 right 右对齐 效果: 用法

    2024年01月18日
    浏览(61)
  • web前端——HTML+CSS

    HTML CSS CSS进阶 CSS盒子模型 定位装饰 CSS精灵图 目录 基础认识  HTML  一、HTML概念 二、HTML页面固定结构  三、HTML标签的结构   四、标签学习 1、排版标签 1)标题标签  2)段落标签  3)换行标签 4)水平线标签  2、文本格式化标签  3、媒体标签 1)图片标签 2)路径  3)音

    2024年01月16日
    浏览(56)
  • 前端(HTML + CSS + JS)

    HTML是超文本标记语言,超文本是指文本、声音、图片、视频、表格、链接等等。标记表示由许许多多的标签组成。HTML页面是运行到浏览器上的。 (1)HTML 文件基本结构 html 标签是整个 html 文件的根标签(最顶层标签) head 标签中写页面的属性 body 标签中写的是页面上显示的内

    2024年02月05日
    浏览(49)
  • 基于html+css的图片展示18

    项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目结构 index.html代码如下 总结 此代码可以实现图片的无限重复向下移动展示效果

    2023年04月20日
    浏览(43)
  • HTML CSS动画实现图片过渡与变换

    需要实现过渡和变换效果时,使用CSS动画是一种常见的方法。CSS动画允许我们在元素上应用一系列的动画效果,从而创建出流畅和引人注目的过渡和变换效果。 1. `transition`属性:通过指定过渡的属性、持续时间和过渡函数,我们可以实现元素属性的平滑过渡。在例子中,我们

    2024年04月16日
    浏览(54)
  • 基于html+css的四张图片并排

    项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目结构 index.html代码如下 总结 此代码可以实现在有限的宽度下,四张图片自动弹

    2024年02月11日
    浏览(38)
  • 前端基础:HTML和CSS简介

    目录 1、HTML 简介 (1)在 HTML 中引入外部 CSS (2)在 HTML 中引入外部 JavaScript 2、CSS 简介 (1)CSS 的基本语法 (2)三种使用 CSS 的方法 2.1 - 外部 CSS 的使用 2.2 - 内部 CSS 的使用 2.3 - 行内 CSS 的使用         HTML 指的是超文本标记语言 ( H yper  T ext  M arkup  L anguage), 标记语

    2024年02月16日
    浏览(42)
  • Web前端开发:HTML、CSS

    在介绍Web网站工作流程的时候提到, 前端开发,主要的职责就是将数据以好看的样式呈现出来,说白了,就是开发网页程序 ,如下图所示: 1.   网页有哪些部分组成 ? 文字、图片、音频、视频、超链接、表格等等。 2.  我们看到的网页,背后的本质是什么 ? 程序员写的前端

    2023年04月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包