Google 具有 preserveAspectRatio="none" 的 Lighthouse 和 SVG

Google Lighthouse and SVGs with preserveAspectRatio="none"

Google Lighthouse 有一个 红色三角错误,这会显着影响 最佳实践 得分:

我能理解为什么这会被视为固定尺寸光栅图像(以及具有显式设置尺寸的标准 SVG 矢量图像)的错误。

但在这种情况下,我在网页上显示少量 SVG 标志,并且 SVG 标志在页面的一部分以特定尺寸显示,而在另一部分以不同尺寸显示。

为了即使在同一 SVG 的多个实例以不同尺寸显示时也能使用同一个 SVG,我使用了属性:

preserveAspectRatio="none"

这明确表示(我希望)没有不正确的纵横比

但是 Google Lighthouse 仍然会引发上述错误。

在正常的桌面浏览器大小下,图形非常小(27px x 27px27px x 18px)所以,是的,我可以用 .png.webp 替换它们图片。

但是我还需要记住,标志图像尺寸 在较窄的响应式设计断点处尺寸略有增加,所以我需要一个完整的每个断点的固定尺寸光栅图像集。

有什么方法可以指示 Google Lighthouse 忽略明确声明 preserveAspectRatio="none" 的 SVG 图像的纵横比?

Lighthouse 报错:

  • 显示宽高比不正确的图像

正是因为 SVG 包含 preserveAspectRatio="none" 属性。

在两个特定的上下文中:

  • SVG 没有 viewBox 属性
  • SVG 包含 preserveAspectRatio="none" 属性

SVG 的内部尺寸 默认为标准替换元素尺寸:

  • 300px x 150px.

这使 SVG 的 固有宽高比 1:2

此时如果SVG显示在不同宽高比的网页上,Lighthouse会报上面的错误。


包括 viewBox 属性

否则,viewBox 属性将确定 SVG 的内部尺寸内部纵横比

与任何其他 <img> 一样,SVG 可以通过 CSS 设置样式以具有 any widthany height。但是由这些值 产生的 纵横比 必须 与 SVG 确定的 固有纵横比 相同viewBox.

因此,SVG 可以有 CSS widthheight 无限向上或无限向下缩放 - 但它们不能改变 形状 [= viewBox.

定义的 SVG 的 129=]

如果CSS值改变了SVG的shape,Lighthouse会报上面的错误。


结论

为避免上述 Lighthouse 错误:

  1. SVG 必须具有viewBox属性
  2. SVG 不能使用preserveAspectRation="none"
  3. CSS width vs height 宽高比和 SVG viewBox 宽高比 必须 匹配

另请注意:

声明 CSS 属性 aspect-ratio 或 HTML widthheight 属性在这种情况下无济于事。 CSS 和 HTML 都无法覆盖 SVG viewBox.

建立的固有尺寸

示例:

如果你有一个 SVG

viewBox="0 0 360 360"

然后,使用 CSS,您可以将该 SVG 显示为任何尺寸,只要它保持纵横比 1:1

例如

  • width: 24px; height: 24px;
  • width: 36px; height: 36px;
  • width: 48px; height: 48px;

但是,如果您希望使用不同的纵横比设置相同的 SVG-based <img> 样式:

  • width: 36px; height: 24px; // 3:2
  • 的纵横比

然后您必须创建一个新的 SVG viewBox 建立与 CSS 值一致的宽高比:

viewBox="0 0 540 360"

如果您不希望 Lighthouse 报告不正确的纵横比错误