CSS 属性 aspect-ratio

412 阅读3分钟

在响应式网页设计中,保持一致的纵横比(称为纵横比)对于防止布局累积偏移至关重要。 随着在 Chromium 88、Firefox 87 和 Safari Technology Preview 版本中引入纵横比属性“aspect-ratio”,让我们有了更简洁的方法来实现。

padding-top的实现

在没有这个属性的时候,以前的做法是利用padding-top的百分比特性。当设置padding-top的单位是百分比时,它的参考对象是父元素的宽度。为了图片等元素应用宽高比,我们还需要一个额外的容器元素。

“ Padding-Top Hack”方案需要一个父容器和一个绝对放置的子容器。然后,可以将宽高比计算为百分比以设置为padding-top。例如:

  • 1:1长宽比= 1/1 = 1 = padding-top: 100%
  • 4:3长宽比= 3/4 = 0.75 = padding-top: 75%
  • 3:2长宽比= 2/3 = 0.66666 = padding-top: 66.67%
  • 16:9长宽比= 9/16 = 0.5625 = padding-top: 56.25%

比如我们要实现一个图片的宽度自适应且宽高比固定为 16:9:

<div class="parent">
    <img src="" alt="">
</div>

使用padding-top,需要靠容器和绝对定位:

/* 16:9 比例容器 */
parent {
  width: 100%;
  padding-top: 56.25%; /* 9/16 */
  background-color: pink;
  position: relative;
}

img {
  width: 100%;
  position: absolute;
  top: 0;
}

aspect-ratio的实现

**语法 : aspect-ratio: auto

  • auto 默认值,它指定元素没有首选的纵横比,应该像往常一样调整自己的大小。因此,替换元素,如具有固有纵横比的图像,使用 纵横比。
  • <ratio>: 由正斜杠 ( /)分隔的两个正数值,它们周围有或没有空格,目标是元素的宽度和高度。在单个值的情况下,第二个值被认为是 1。涉及首选纵横比的大小计算适用于指定的框的尺寸 box-sizing
  • initial 应用属性的默认设置,即auto
  • inherit 采用aspect-ratio父级的值。
  • unset 从元素中删除当前的纵横比。

使用aspect-ratio就要简单得多了:

.container img {
  width: 100%;
  aspect-ratio: 16 / 9;
}

"/" 和后面的高度比可以省略,默认为 1, 例如设置 aspect-ratio: 4,那么就是设置了 4:1:

aspect-ratio: 4;

aspect-ratio 属性值也可以设置为 auto,相当于是默认值,这样对于图片、视频这样有原始纵横比的,就会保持原始比例:

aspect-ratio: auto;

aspect-ratio 不仅可以用在 img 或 video 标签上,任何一个具有宽高的元素都可以使用它,在缩放的时候,保持一定的纵横比。

Ps:值得注意的是aspect-ratio的优先级比较低。当aspect-ratio和其他属性例如width、height、min-width、min-height产生了冲突的话,会以后者为准。

在一些场景下,维持长宽比显得非常的有用:

1.创建响应式 iframes,它们的宽度为父体的 100%,而高度应保持特定的视口比例。
2.为图片、视频和嵌入创建内在的占位容器,以防止项目加载时重新布局而占用空间。
3.为交互式数据可视化或 SVG 动画创建统一的、响应式的空间。
4.为多元素组件(如卡片或日历日期)创建统一的、响应的空间。
5.为不同尺寸的多幅图像创建统一的响应空间(可与 object-fit 一起使用)

防止布局移动

高宽比的另一大特点是,它可以创建占位符空间,以防止累积布局偏移。从API加载资产,当媒体加载完成后,会产生布局偏移