核心要点
object-fit
和 object-position
可用于调整嵌入图像和其他替换元素的大小和位置,类似于 CSS 属性 background-size
和 background-position
用于背景图像。object-fit
属性提供多种选项,用于控制图像在指定区域内的显示方式,必要时可隐藏图像的部分内容。这对于在不失真情况下将图像适配到特定空间非常有用。object-fit
属性主要有五个关键字值:cover
、contain
、none
、scale-down
和 fill
。这些值决定图像在其容器内的显示方式,可以是覆盖区域、适应区域、保持自然尺寸、缩小以适应或填充内容框。object-position
属性控制图像元素在其内容框内的位置。其默认值为 50% 50%
,将图像中心与内容框中心对齐,但可以使用一系列关键字值或长度值进行调整。object-fit
和 object-position
设计用于处理任何类型的替换元素,但它们最常用于在不失真情况下将图像适配到特定空间。它们在所有现代浏览器中都受支持,但在 Internet Explorer 中不受支持。CSS 提供了 background-size
和 background-position
属性来调整背景图像的大小和位置。object-fit
和 object-position
属性允许我们对嵌入式图像(以及其他替换元素,如视频)执行类似的操作。本文将深入探讨如何使用 object-fit
将图像适配到特定空间,以及如何使用 object-position
精确控制图像在该空间中的位置。
object-fit
的用途
有时,图像可能太大,无法适应我们想要的空间。过去,我们必须在图像编辑器中裁剪图像,或者通过设置宽度和/或高度约束来调整图像大小(这并非完美的选择),或者执行某种复杂的剪裁,或者可能诉诸使用背景图像(如果图像不仅仅用于装饰,这很可惜)。
object-fit
属性对图像的作用类似于 background-size
对背景图像的作用:它提供多种选项,用于控制图像在指定区域内的显示方式,必要时可隐藏图像的部分内容。此指定区域可能具有固定宽度和高度,也可能是一个更具响应性的空间,例如网格区域,该区域会根据浏览器视口的尺寸而增长、缩小和弯曲。
object-fit
的工作原理
每个 HTML 元素都有自己的“内容框”,它代表元素占据的空间。默认情况下,图像的内容框与其自然尺寸匹配。
当我们对图像应用不同的宽度和/或高度时,实际上是在更改内容框的尺寸。如果内容框的尺寸发生变化,图像仍然会填充内容框。因此,如果我们有一个 300px x 300px 的图像,并将它的尺寸设置为 300px x 200px,则图像将显得变形。
object-fit
属性为我们在调整大小的内容框中显示图像提供了多种选项。我们可以隐藏图像的一部分,或者强制图像仅部分填充其内容框,以便图像完全可见且不会变形。
设置
为了详细说明 object-fit
属性的工作原理,我们将一个图像放置在一个使用网格布局居中的 div 中。该 div 具有棕色背景,并且由 ::before
伪元素提供点状边框,这将有助于我们了解图像发生了什么变化。
查看 CodePen 上 SitePoint (@SitePoint) 的示例: object-fit: setup
对于我们的图像演示,我们将使用以下图像(希腊圣托里尼岛的伊亚)。其自然尺寸为 400px x 600px。
我们的图像比我们的 div 大得多,如果我们将图像放置在 div 内,它将溢出,如下所示。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: setup2
我们的目标是防止图像像这样溢出其容器,同时使其舒适地适应容器,而 object-fit
将帮助我们实现这一点。
如果我们使用的是背景图像,我们可以设置类似于 background-size: cover
的内容,背景图像将被限制在容器的区域内。但是,正如我们所看到的,为了使 object-fit
发挥作用,我们首先需要定义图像内容框的宽度和高度,使其与自然尺寸不同。在下面的示例中,我们将图像的宽度和高度限制为 100%,以便其内容框与容器 div 的大小匹配:
<code class="language-css">img { width: 100%; height: 100%; }</code>
这就是它的样子。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: setup3
图像及其内容框现在与容器完美契合,但图像严重变形。这就是 object-fit
的魔力发挥作用的地方,让我们看看它能提供什么。
使用 object-fit
将图像适配到容器
object-fit
属性提供五个主要的关键字值,用于确定图像在其容器内的显示方式。其中两个关键字——cover
和 contain
——与它们的 background-size
对应物执行相同的作用。
object-fit: cover
cover
值强制图像完全覆盖容器区域,在不失真情况下显示尽可能多的图像:
<code class="language-css">img { width: 100%; height: 100%; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: cover
因为图像非常高,所以我们看到它的全宽,但看不到它的全高,如下图所示。
cover
值可能是提供的最实用的值,在大多数情况下都是首选选项。
这里值得注意的是图像的位置。与 background-position
(默认为 0 0
,从容器的左上角定位背景图像)不同,默认的 object-position
是 50% 50%
,它将图像居中在其内容框中。当我们稍后查看 object-position
属性时,我们将学习如何指定图像的哪一部分可见。
object-fit: contain
contain
值强制图像完全适应其内容框,但不失真。图像保留其自然纵横比,因此不会填充其容器:
<code class="language-css">img { width: 100%; height: 100%; object-fit: cover; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: contain
看起来我们只需在图像上设置 height: 100%
以及其他内容,就可以获得上述相同的结果。但事实并非如此,因为那样会使图像定位在左侧而不是居中,而这是 object-fit
的默认设置。结合 object-position
,object-fit
提供了更多关于图像在容器中如何定位的选项。
object-fit: none
none
属性允许图像保持其自然、原始尺寸。只有可以适应调整大小的内容框的部分图像可见。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: none
与 object-fit: cover
不同,我们的图像不会被强制至少沿一个轴完全可见。原始图像比内容框更宽和更高,因此它在两个方向上都会溢出,如下图所示。
再次注意,图像中心默认与内容框中心对齐。
另请注意,object-fit: none
并不意味着 object-fit
什么也没做。正如我们所看到的,与根本没有设置 object-fit
相比,它做了很多事情。(作为提醒,请查看上面示例中删除 object-fit: none
后的情况。)
object-fit: scale-down
scale-down
属性要么与 none
相同,要么与 contain
相同。它选择将导致图像显示更小的结果。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: scale-down
显然,在我们当前的示例中,它将选择 contain
,因为我们的容器小于图像。如果我们的容器大于图像,则 none
将占主导地位,图像将保持其自然大小,而不是在一个方向上填充容器,你可以在这个 CodePen 演示中看到。
object-fit: fill
如果我们在演示中将 object-fit
值更改为 fill
,则就像没有设置 object-fit
一样。这是因为,默认情况下,无论设置什么尺寸,图像都会填充其内容框。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: fill
由于 fill
属性可能会使图像变形,因此在大多数情况下它可能不是最佳选择。
在没有容器的情况下使用 object-fit
在上面的示例中,我们一直在使用 object-fit
来调整图像在 div 容器中的大小,但是我们在实践中看到的原理在没有该容器的情况下也能同样有效。重要的是图像内容框的大小以及图像在其内容框中的显示方式。
例如,我们可以将以下 CSS 应用于图像,而无需任何周围的 div:
<code class="language-css">img { width: 100%; height: 100%; }</code>
结果显示在下面的 CodePen 演示中。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit: no container
尝试在上面的示例中更改 object-fit
属性上的值以覆盖、填充、缩小和无,以查看每个值的行为。结果与图像设置为 100% 的宽度和高度并包含在设置为 300px x 300px 的 div 中的结果相同。
在响应式布局中使用 object-fit
object-fit
属性在图像的指定区域的尺寸响应浏览器视口大小时可能最有用。以下演示将我们的图像分配给一个特定的、灵活的网格区域:
<code class="language-css">img { width: 100%; height: 100%; object-fit: cover; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-fit in a responsive area
随着视口和网格区域的扩展和收缩,cover
值确保图像始终完美地适应其网格区域,更改图像的可见部分,使其永不失真。(查看全页视图中的演示以获得最佳效果。)
要了解有关网格区域的更多信息,请查看我们的 CSS 网格入门指南。
使用 object-position
设置图像位置
正如使用 background-position
设置背景图像在其容器中的位置一样,object-position
属性用于控制图像元素在其内容框内的位置。
正如我们所看到的,object-position
默认值为 50% 50%
,这意味着图像中心与内容框中心在水平和垂直轴上对齐。我们可以使用一系列关键字值(顶部、底部、左侧、右侧、中心)或使用长度值(例如 px、em 或 %)或同时使用两者来更改它。
假设我们现在想要从右下角定位我们的图像。我们可以使用关键字 right bottom
或百分比值 100% 100%
:
<code class="language-css">img { width: 100%; height: 100%; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-position 1: keywords
下图说明了我们图像的当前位置。
你可以在上面的示例中随意使用定位关键字来查看它们是如何工作的,以及 object-fit
关键字,但结果应该很容易预测。
我们还可以使用像素或 em 等单位从其容器偏移图像。例如:
<code class="language-css">img { width: 100%; height: 100%; object-fit: cover; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-position 2: units
我们可以通过组合单位和关键字来从右下角进行类似的偏移,如下所示:
<code class="language-css">img { width: 100%; height: 100%; object-fit: contain; }</code>
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-position 3: units and keywords
我们已经看到,我们可以使用百分比来定位内容框中的图像。与 background-position
属性一样,使用百分比与 object-position
可能会有点混乱。object-position
的 50% 50%
意味着图像中心与内容框中心在水平和垂直轴上对齐。
如果我们将 object-position
设置为 20% 40%
,则意味着图像左侧 20% 处的一条垂直线与内容框左侧 20% 处的一条垂直线重合,图像顶部 40% 处的一条水平线与内容框顶部 40% 处的一条水平线重合,如下图所示。
我们可以在下面的 CodePen 演示中看到这一点。
查看 CodePen 上 SitePoint (@SitePoint) 的示例:object-position 4: percentages
结论
object-fit
属性旨在与任何类型的替换元素一起使用,例如图像、视频、iframe 和嵌入对象。将视频等元素适配到定义的区域(其中可能隐藏部分元素)到底有多有用,可能是一个有待讨论的问题,但毫无疑问,存在可行的用例。更好的选择可能是将 iframe 的宽度设置为可用空间的 width: 100%
,然后使用 aspect-ratio
属性来保持其比例。
更常见的情况是需要将图像适应到特定空间,因此 object-fit
对于允许图像适应该空间而不失真非常有用(即使必须隐藏部分图像)。
要了解有关 object-fit
和 object-position
的更多信息,请查看这些属性的 MDN 页面:
最后,如上所述,值得将 object-fit
和 object-position
属性与 background-size
和 background-position
属性进行比较,它们有很多相似之处。查看如何使用 CSS background-size
和 background-position
来了解它们。
关于 CSS object-fit
和 object-position
属性的常见问题解答 (FAQ)
object-fit
和 object-position
在 CSS 中有什么区别?CSS 中的 object-fit
和 object-position
属性用于控制替换元素(例如图像或视频)的内容。object-fit
属性定义元素如何响应其内容框的高度和宽度。它类似于 CSS 中的 background-size
,但适用于替换元素。它有五个值:fill
、contain
、cover
、none
和 scale-down
。
另一方面,object-position
属性确定替换元素在其框内的位置。它类似于 background-position
,但适用于替换元素。它采用两个值来表示 x 和 y 坐标,这些坐标设置元素的位置。
object-fit
属性调整图像大小?object-fit
属性可用于控制应如何调整图像大小以适应其容器。这是一个例子:
<code class="language-css">img { width: 100%; height: 100%; }</code>
在此示例中,图像将调整大小以覆盖其容器的整个宽度和高度,同时保持其纵横比。如果图像的纵横比与容器的纵横比不匹配,则图像将被裁剪。
object-position
与背景图像一起使用吗?不可以,object-position
属性不能与背景图像一起使用。它仅适用于替换元素,例如 img
、video
或 embed
。对于背景图像,您可以改用 background-position
属性。
object-fit
的 contain
值是如何工作的?object-fit
属性的 contain
值将内容调整大小以适应内容框,同时保持其纵横比。如果其纵横比与内容的纵横比不匹配,则整个内容将可见,但内容框中可能仍有一些空间。
object-fit
的 none
值的作用是什么?object-fit
属性的 none
值意味着内容将忽略内容框的高度和宽度。它将保留其原始尺寸,如果它大于内容框,则可能会导致内容被裁剪。
object-position
居中图像?您可以使用 object-position
属性将图像居中在其内容框内。这是一个例子:
<code class="language-css">img { width: 100%; height: 100%; }</code>
在此示例中,图像将位于其内容框的中心。
object-position
中使用百分比值吗?是的,您可以在 object-position
属性中使用百分比值。这些值表示内容相对于内容框的位置。例如,0% 0%
将内容定位在内容框的左上角,而 100% 100%
将其定位在右下角。
object-position
值会发生什么?如果您不指定 object-position
值,则默认值为 50% 50%
,这将使内容在其内容框内居中。
object-fit
和 object-position
吗?是的,您可以同时使用 object-fit
和 object-position
属性来控制内容的大小和位置。这是一个例子:
<code class="language-css">img { width: 100%; height: 100%; object-fit: cover; }</code>
在此示例中,图像将调整大小以覆盖其内容框并在其中居中。
object-fit
和 object-position
属性吗?所有现代浏览器(包括 Chrome、Firefox、Safari 和 Edge)都广泛支持 object-fit
和 object-position
属性。但是,Internet Explorer 不支持它们。
所有代码示例中的CodePen链接都需要替换成实际的链接。 请注意,这篇文章已经进行了大幅度的改写和润色,以满足伪原创的要求,同时保留了原文的全部信息和图片。
以上是如何使用CSS对象拟合和对象位置的详细内容。更多信息请关注PHP中文网其他相关文章!