【第2201期】在Chromium、Safari預覽版和Firefox Nightly中支持新的寬高比CSS屬性

2021-02-20 前端早讀課

前言

新的一年,前端早讀課繼續陪伴你。在【第2200期】Chrome 88 重要更新解讀有提到aspect-ratio屬性,今天可以來看看新老方案。今日前端早讀課文章由@飄飄翻譯投稿分享。

正文從這開始~~

新的CSS屬性,幫助在響應式布局中保持間距。

保持一致的寬高比(稱為寬高比)對於響應式web設計和防止累積布局移位至關重要。現在,有一種更直接的方法可以實現這一點,即在Chromium 88、Firefox 87和Safari技術預覽版118中啟動新的aspect-ratio屬性。

寬高比

寬高比最常見的表示方式是兩個整數和一個冒號,尺寸為:寬:高,或x:y。攝影中最常見的寬高比是4:3和3:2,而視頻和相機則傾向於16:9的寬高比。

兩張寬高比相同的圖片。一張是634 x 951px,另一張是200 x 300px。兩者的寬高比都是2:3。

隨著響應式設計的出現,保持寬高比對Web開發人員來說越來越重要,尤其是當圖像尺寸不同,元素大小隨著可用空間的變化而變化時。

以下例子說明了保持寬高比的重要性:

創建響應式iframe,其寬度為父級的100%,而高度應保持特定的視口比例。

為圖片、視頻和嵌入創建內部佔位容器,以防止在項目加載和佔用空間時重新布局。

為交互式數據可視化或SVG動畫創建統一的、響應性強的空間。

為多元素組件(如卡片或日曆日期)創建統一的、響應性強的空間。

為不同尺寸的多個圖像創建統一的響應空間(可與object-fit一起使用)。

Object-fit

定義寬高比有助於我們在響應式上下文中調整媒體的大小。這個框中的另一個工具是object-fit屬性,它允許用戶描述一個塊中的對象(如圖像)應該如何填充該塊。

展示各種Object-fit值

Codepen:https://codepen.io/una/pen/mdrLGjR

initial值和fill值重新調整圖像以填充空間。在例子中,這導致圖像被擠壓和模糊,因為它重新調整了像素。object-fit: cover 使用圖像的最小尺寸來填充空間,並根據這個尺寸裁剪圖像以適應它。object-fit: contain 確保整個圖像總是可見的,因此與cover相反,它採用最大邊界的尺寸(在上面的例子中是寬度),並調整圖像的大小以保持其固有的寬高比,同時適應空間。object-fit: none的情況下,圖像以其自然尺寸在中心(默認對象位置)進行裁剪。

object-fit: cover 往往在大多數情況下都能確保在處理不同尺寸的圖像時有一個很好的統一界面,但是,這種方式會丟失信息(圖像在其最長的邊緣被裁剪)。

如果這些細節很重要(例如,當使用美容產品的平面時),裁剪重要內容是不可接受的。所以,理想的情況是採用不同尺寸的響應式圖片,以適應UI空間,而不需要裁剪。

老方法:用padding-top來保持寬高比

使用 padding-寬高 在 carousel 中設置後預覽圖像的寬高比為1:1。

為了使這些更有響應性,我們可以使用寬高比。允許我們設置一個特定的比例大小,並將媒體的其餘部分基於一個單獨的軸(高度或寬度)。

目前一個被廣泛接受的基於圖像寬度來保持寬高比的跨瀏覽器解決方案被稱為 "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%。

現在我們已經確定了寬高比值,我們可以將其應用到我們的父容器中。考慮下面的例子。

<div class="container">

<img class="media" src="..." alt="...">

</div>

然後我們可以寫出以下CSS。

.container {

position: relative;

width: 100%;

padding-top: 56.25%; /* 16:9 Aspect Ratio */

}

.media {

position: absolute;

top: 0;

}

用寬高比來維持寬高比

在 carousel 中使用寬高比設置後預覽圖像的1:1寬高比

不幸的是,計算這些padding-top值並不是很直觀,需要一些額外的開銷和定位。有了新的內置 aspect-ratio CSS屬性,維護寬高比的語言就清晰多了。

用同樣的標記,我們可以用aspect-ratio16/9代替padding-top: 56.25%,將aspect-ratio設置為指定的width/height。

使用 padding-top

.container {

width: 100%;

padding-top: 56.25%;

}

使用 aspect-ratio

.container {

width: 100%;

aspect-ratio: 16 / 9;

}

使用 aspect-ratio 代替 padding-top 更加清晰,並且不會修改padding屬性來做一些超出其通常作用域的事情。

這個新屬性還增加了將寬高比設置為auto的功能,其中 "內置寬高比的替換元素使用該寬高比; 否則盒子沒有首選的寬高比。"。如果同時指定了auto和 <ratio>,則首選的寬高比是指定的width除以height的比例,除非它是具有內置寬高比的替換元素,在這種情況下,使用寬高比代替。

例如:網格中的一致性

這對於CSS布局機制(如CSS Grid和Flexbox)也非常有效。考慮一個帶有子元素的列表,你想保持1:1的寬高比,比如贊助商圖標的網格。

<ul class="sponsor-grid">

<li class="sponsor">

<img src="..." alt="..."/>

</li>

<li class="sponsor">

<img src="..." alt="..."/>

</li>

</ul>

.sponsor-grid {

display: grid;

grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));

}

.sponsor img {

aspect-ratio: 1 / 1;

width: 100%;

object-fit: contain;

}

在網格中的圖像,其父元素具有不同的寬高比尺寸。

codepen:https://codepen.io/una/pen/PoGddaw

例子:防止布局移位

高寬比的另一個重要特性是,它可以創建佔位符空間,以防止累積布局移位,並提供更好的Web Vitals。在第一個例子中,從諸如 Unsplash 之類的 API 加載資源,當媒體加載完成後會產生布局變化。

視頻的布局移位發生時,沒有設置寬高比的負載資源。這個視頻是用一個仿真的3G 網絡錄製的。

另一方面,使用高寬比會創建一個佔位符來防止這種布局偏移。

img {

width: 100%;

aspect-ratio: 8 / 6;

}

在已加載的資源上設置視頻的寬高比。這個視頻是用模擬的3G網絡錄製的。Codepen:https://codepen.io/una/pen/GRjLZmG

額外的提示:圖像屬性的寬高比

另一種設置圖像寬高比的方法是通過圖像屬性。如果你事先知道圖片的尺寸,最好的做法是將這些尺寸設置為它的寬度和高度。

對於我們上面的例子,知道尺寸是800px×600px,圖像標記就會像這樣。<imgsrc="image.jpg"alt="..."width="800"height="600">。如果發送的圖片具有相同的寬高比,但不一定是精確的像素值,仍然可以使用圖像屬性值來設置比例,結合width:100%的樣式,使圖像佔據適當的空間。綜合起來就會是這樣的:

<!-- Markup -->

<img src="image.jpg" alt="..." width="8" height="6">

/* CSS */

img {

width: 100%;

}

最後,效果和通過CSS設置圖片的aspect-ratio是一樣的,而且避免了布局的偏移。codePen:https://codepen.io/una/pen/gOwJWoz

結論

在多個現代瀏覽器中,有了新的aspect-ratio CSS屬性,在你的媒體和布局容器中保持適當的寬高比變得更加簡單。

關於本文原文:https://web.dev/aspect-ratio/

為你推薦

【第2193期】7個你可能不認識的CSS單位

【第2149期】V8中的快屬性

歡迎自薦投稿,前端早讀課等你來

相關焦點

  • CSS中position定位和z-index屬性用法詳解
    你對CSS中的position定位和z-index屬性的用法是否了解,position屬性中static、absolute、relative三個參數,這裡和大家分享一下其用法。如果沒有指定position屬性,支持position屬性的html對象都是默認為static,可以這麼理解:把html頁面看作一個文檔流,原始碼中各個標籤的先後位置就是它們所對應的對象的呈現次序,所有取值為static的對象都按照你所編寫的html標籤的順序依次呈現。如下圖所示,這是一個常見的指定了float:left;的橫嚮導航:
  • Safari 技術預覽版 46 發布:默認啟用 Service Workers
    Safari 技術預覽版 46 已於昨天發布,最重大的更新莫過於默認啟用 Service Workers,這意味著蘋果也開始擁抱 PWA 了,再聯想到此前報導過的新聞 ——「Chrome Web
  • 大浪淘沙程式設計師精品工具箱軟體推薦2:Firefox與網頁前端調試工具
    不論怎樣當一名 pc 程式設計師面對 web 前端工作時,實際上是非常吃力的,需要大量的時間去轉換角色,艱難的程度和前端轉做 pc 也差不多。我有一位前端同事無論如何就是看不懂 pc 裡的循環代碼 ... 這種轉換的艱難很大程序上是不了解對方的工作環境,其實代碼和布局的原理是一樣的,比如我不做前端是無論如何不知道 firefox 還能調試程序的,隔行如隔山那!即使大家都是程式設計師。
  • 49 張 GIF 圖中學習 49 個 CSS 知識點
    另外這裡,老姚謝謝各位一如既往的支持。😘😘😘01.【負邊距】💘負邊距的效果。注意左右負邊距表現並不一致。左為負時,是左移,右為負時,是左拉。上下與左右類似02.【shape-outside】❤不要自以為是了。你以為自己是方的,在別人眼裡你卻是圓的
  • 常用的CSS框架
    這裡寫圖片描述關於樣式的屬性我們都會在data-options這個屬性上設置的。如果我們想要變成是中文格式,可以到以下的目錄找到對應的JS,在項目中導入進去就行了!" alt="safari">            <h2>Safari</h2>            <p>Safari,是蘋果計算機的最新作業系統Mac OS X中的瀏覽器。
  • CSS實現水平垂直居中的10種方式
    >顯示效果如下:水平方向垂直方向更神奇的是所有水平方向上的css屬性,都會變為垂直方向上的屬性,比如text-align,通過writing-mode和text-align就可以做到水平和垂直方向的居中了,只不過要稍微麻煩一點<div>    <div>        <div>123123</div
  • H5:常用css3屬性box-sizing,display:box
    box-sizing有三個取值:content-box|border-box|inherit;默認情況下值為content-boxcontent-box:寬度和高度分別應用到元素的內容框。在寬度和高度之外繪製元素的內邊距和邊框。border-box:為元素設定的寬度和高度決定了元素的邊框盒。
  • 前端工程化(ES6模塊化和webpack打包css,less,scss,圖片,字體...
    編輯js文件中的代碼如下const presets = [ ["@babel/env",{ targets:{ edge:"17", firefox:"60", chrome:"67
  • 蘋果發布最新Safari技術預覽版正式停止支持Flash
    1月23日消息,據9to5mac報導,在蘋果發布的最新Safari技術預覽版中,正式停止支持Flash。此前Adobe在2017年宣布,將於2020年底停止支持Flash。據悉,技術預覽版就是Safari瀏覽器的測試版 ,主要面向開發者,測試新功能和改進。當一個功能完善之後,會出現在Safari正式版中。
  • 前端Web-CSS語法全解1
    >(2)好處:功能強大將內容展示和樣式控制分離 降低耦合度,能夠解耦 讓分工協作更容易 提高開發效率注意:css對大小寫不敏感,如果涉及到與html文檔一起使用時,class與id名稱對大小寫敏感
  • CSS中position屬性的用法和作用
    CSS中position屬性的用法和作用 本文向大家介紹一下CSS中Position屬性的用法和作用,Position屬性有四個可選值,它們分別是:static、absolute、fixed、relative。
  • 注意CSS代碼中的!important屬性
    important屬性 CSS中的!important是一個非常重要的屬性,有時候發揮著非常大的作用,這方面的知識並不是非常多,我們看下面的文章,對它作比較感觀的了解。
  • 蘋果的 Safari 已成為新的 IE
    IE 一直以來都因為不兼容標準而遭人詬病,因為早期的 IE 佔有率太高,IE 不支持的 html/js 特性網站就無法使用。
  • CSS Display屬性的雙值寫法
    這幾年,我們也知道了Grid 布局和彈性盒布局。我們只需要將display屬性的值設置為display: grid或display: flex就可以實現這兩種布局。當display屬性改變後,其子元素才變成了flex或者grid元素,從而對一些特性進行響應。display: grid和display: flex對一個元素的產生了對外和對內兩方面的影響。
  • CSS中behavior屬性語法簡介
    CSS中behavior屬性語法簡介 你對CSS中behavior屬性的語法是否熟悉,這裡向大家簡單描述一下,在進行CSS網頁布局的時候,我們經遇到刷新要保留表單裡內容的時候,CSS中的behavior就為我們很好的解決了這個問題。
  • 層疊樣式表(CSS)屬性(上篇)
    今天我們繼續上期的話題,上期我們對層疊樣式表(css)的基礎做了下大致的介紹,那麼今天我們來學習一些它的屬性。盒子屬性說到css屬性其中最重要的就是它的盒子屬性了,代表標籤為無屬性標籤<div>,包括的屬性有:padding 內邊距(內填充)border 邊框margin 外邊距
  • css flex屬性筆記
    flex屬性定義及用法在css中,flex屬性是使用來設置或檢索彈性盒模型對象的子元素如何分配空間,是 flex-grow屬性、flex-shrink屬性和 flex-basis 屬性的簡寫屬性。flex屬性針對的是彈性盒模型對象的子元素,對於其它元素,flex屬性不起任何作用;一些主流瀏覽器還不支持flex屬性,需要在該屬性之前加對應的前綴才能識別該屬性。Internet Explorer 9及更早版本不支持flex屬性,但是可以通過-ms-flex屬性來支持, IE11 及更新版本完全支持flex屬性,不再需要-ms-前綴。
  • css3 cale()屬性介紹以及自適應布局使用方法
    最近在做項目的時候用到了css3中的cale()屬性,在之前也了解過相關的知識,但都是太膚淺的認知而已,並沒有去深入的了解,今天在寫頁面自適應布局的時候,一位同事推薦說css3中有一個屬性能很好地自適應布局,而且還能計算,不得不想起cale(),咋一看還以為是個函數呢,但是函數又怎麼會出現在css中呢?
  • 10個關於css高頻面試題
    CSS3中新增的選擇器以及屬性這裡只是列出來, 具體的使用,請查看我的關於css3新增選擇器與屬性文章屬性選擇器含義描述E[att^="val"]屬性att的值以"val"開頭的元素E[att$="val"]屬性att的值以"val"結尾的元素E[att*="val"]屬性att的值包含
  • Google推出Google Toolbar FireFox版
    Google Toolbar for FireFox 5的更新功能如下:可支持小工具的自定義按鈕谷歌 工具欄的自定義按鈕不僅僅是書籤,它們還可以支持實時供稿和自定義網站搜索。現在,自定義按鈕甚至可以支持谷歌小工具。