核心要點
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中文網其他相關文章!