大漠老師:2022 年的 CSS,到底有哪些特性
關(guān)于2022年的CSS新特性,自己之前也有篇原創(chuàng),CSS?的未來:Cascade?Layers (CSS?@layer),專門是在介紹@layer(級聯(lián)層)的文章,而新的一年會有更多的CSS的新特性會出現(xiàn)在瀏覽器中。
今天分享一篇大漠老師的文章,主要內(nèi)容是2022年哪些CSS特性將在瀏覽器中出現(xiàn),以下是正文。
原文: https://www.w3cplus.com/css/what-is-new-css-in-2022.html作者:大漠老師,請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
雖然近些年 CSS 變化很快,但我認(rèn)為 2021 年是 CSS 的元年。在即將過去的 2021 年,CSS 變化非常地大,其中新增了很多特性,比如 CSS 容器查詢、CSS 父選擇器、CSS 層疊控制規(guī)則、CSS 子網(wǎng)格等等。而且這些特性已經(jīng)在個(gè)別,甚至是在大部分主流瀏覽器已經(jīng)可以看到了。幾大主流瀏覽器(Chrome、Firefox、Safari和Edge)還專注于修復(fù)瀏覽器兼容性痛點(diǎn),讓 Web 開發(fā)者的工作變得更輕松。
瀏覽器兼容性方面的修復(fù),在 Web.dev 上發(fā)布了 2021 年的年中和年終報(bào)告,報(bào)告雖然簡單,但我們可以看到瀏覽器廠商都在致于力磨平 CSS 特性在瀏覽器上的兼容性。為此,我們應(yīng)該感謝他們的付出!
隨著 2021 年的結(jié)束,讓我們一起來看看 2022 年,我們可以期待哪些 CSS 特性將會在瀏覽器中出現(xiàn)。這了是我連續(xù)第三年整理有關(guān)于 CSS 新特性方面的文章了,另外兩篇是(可自行搜索):
- 2020年CSS有哪些新特性
- 應(yīng)用于下一代Web的樣式
- 2021年你可能不知道的 CSS 特性
你即將看到是 2022 年的,你會發(fā)現(xiàn)這三篇文章提到的 CSS 特性有相同的,但他們也是有變化的。
回顧近兩年的 CSS 發(fā)展
@Bramus 前兩天在Twitter 上發(fā)了一條信息,他整理了一份 2022 年的將會出現(xiàn)在瀏覽器的 CSS 清單:
有關(guān)于清單中列出的 CSS 相關(guān)介紹,可以閱讀他的文章:《CSS In 2022》
這份清單中列出的 CSS 特性和 @Adam Argyle 分別在 2020 年 和 2021 年分享的 CSS 新特性列的出的清單差不多,不同的是,在2021年,有些CSS特性已經(jīng)得到了瀏覽器的支持,有些已經(jīng)進(jìn)入了瀏覽器的實(shí)驗(yàn)屬性列表清單,說不定2022年,你就能看到了!
有關(guān)于 @Adam Argyle 在 2020 和 2021 分享的 CSS 新特性,我也曾整理過一份,清單有些類似,但內(nèi)容還是有差異,主要涵蓋了一些我自己在 CSS 方面的認(rèn)識和嘗試,分別記錄在《2020年CSS有哪些新特性》和《2021年你可能不知道的 CSS 特性》以及《應(yīng)用于下一代Web的樣式》
當(dāng)然,如果你也是 CSS 的忠實(shí)愛好者,不斷的在關(guān)注和推進(jìn) CSS 向前發(fā)展,那么你可能已經(jīng)知道了,自 2019 年開始,每年年低都會有一份關(guān)于 CSS 發(fā)展?fàn)顟B(tài)相關(guān)的報(bào)告(2019、2020 和 2021)呈現(xiàn)給你。在每年的報(bào)告中,我們都可以看到一項(xiàng)關(guān)于”開發(fā)者期待的CSS特性“的統(tǒng)計(jì):

在第一份報(bào)告出來的時(shí)候,我特意還花了一點(diǎn)時(shí)間去理解這份有關(guān)于 CSS的報(bào)告:《從9102年的CSS狀態(tài)報(bào)告中看CSS特性的使用》,另外有幸運(yùn)在 2020年年底和一些大學(xué)生一起聊了一個(gè)關(guān)于CSS狀態(tài)和學(xué)習(xí)的話題!如果你對該話題感興趣的話,可以閱讀《CSS現(xiàn)狀和如何學(xué)習(xí)》,文章中附有分享時(shí)錄制的視頻!
除此之外,W3C 的 CSS 工作小組,這兩年也都出了 CSS 規(guī)范的重點(diǎn)報(bào)告,最新的是 2020年 和 2021年的。注意,W3C 關(guān)于 CSS 規(guī)范的重點(diǎn)報(bào)告并不是每年都有的!接下來,我將按著 @Bramus 的 《CSS In 2022》大綱往下梳理,其中會加入一些我自己對這方面的認(rèn)識和見解。

我需要額外提出的是,接下來內(nèi)容中提到的 CSS 特性只會涉及到那些全新的或仍然沒有得到瀏覽器支持的(哪怕是實(shí)驗(yàn)性方面的)特性。但這并不代表著它們不值得期待,說不定在2022年你就能使用了!如果你對這方面感興趣的話,請繼續(xù)往下閱讀!
熱門的 CSS 特性
在這節(jié)中提到的 CSS 特性是近些年來,Web 開發(fā)者一直期待的特性(或者說 CSS 中遺失的特性)。這些特性將在 2022 年的某個(gè)時(shí)候就得到了主流瀏覽器的支持。慶幸的是,有些特性已經(jīng)在一個(gè)或多個(gè)主流瀏覽器中得到了支持,其他特性也將隨著時(shí)間的推移也會隨之而來。在 2022 年,學(xué)習(xí)或了解這些 CSS 特性,我想你會獲得收益的!
有意思的是,CSSWG一直還維護(hù)著一份關(guān)于 CSS 設(shè)計(jì)中不完整的錯語列表。感興趣的可以點(diǎn)擊這里閱讀!
CSS 容器查詢

CSS 容器查詢的特性一直以來都是 Web 設(shè)計(jì)師和開發(fā)者所期待的功能之一,從這幾年的 CSS 發(fā)展?fàn)顟B(tài)的報(bào)告就可以看得出來。在沒有容器查詢之前,Web 開發(fā)者大多是依賴于 JavaScript 腳本來做判斷,從而改變 UI 網(wǎng)格。雖然 CSS 容器查詢存在于 CSS Containment Module 中有些年頭,但一直未得到瀏覽器的支持。慶幸的是,在 2021 年,該特性得到了飛速的發(fā)展,時(shí)至今日,能在主流瀏覽器中看到 CSS 容器查詢功能。這一切,都離不開 @TerribleMia ,是她為我們帶來了這么好的 CSS 特性,并且一直在推進(jìn)該特性向前發(fā)展。
@TerribleMia 除了設(shè)計(jì) CSS 容器查詢特性之外,還設(shè)計(jì)了 CSS 另外兩個(gè)非常優(yōu)秀的特性,那就是 CSS 的
@layer和@scoped兩個(gè)@(At rule)規(guī)則。詳細(xì)的可以閱讀《Miriam's CSS Sandbox》。
CSS 容器查詢 @container 有點(diǎn)類似于 CSS 的媒體查詢 @media ,只是它將根據(jù)元素的父容器(或祖先元素)的尺寸(size)或樣式(style)來調(diào)整自己或自己后代元素的樣式規(guī)則。在沒有 CSS 容器查詢,Web 開發(fā)者為了能在不同容器下調(diào)整 UI,大多都是依賴于媒體查詢來做。也就是說,有了該特性之后,不需要再依賴視窗大小加添加類名的方式來調(diào)整UI了:
上圖演示了,基于視窗的設(shè)計(jì)和基于容器的尺寸設(shè)計(jì)。可以說, CSS 容器查詢的出現(xiàn),除了改變 Web 開發(fā)者的開發(fā)方式之外,也將給 Web 設(shè)計(jì)帶來變革命。這個(gè)論點(diǎn)在 2021 年的 GDS 大會上,@Una Kravets 在分享的 《The New Responsive: Web design in a compoent-driven world》主題(該主題視頻可以在 YouTube上訪問)中就提出這樣的觀點(diǎn):
CSS 容器查詢將會成為下一代響應(yīng)式 Web 設(shè)計(jì)必不可少的特性之一。

有了 CSS 容器查詢之后,我們就可以基于同一個(gè)組件,在不同尺寸下調(diào)整其UI,比如我們手淘 APP 頂部的搜索框效果:
上面效果的關(guān)鍵性代碼如下:
.form__container?{
????container:?inline-size;
}
.form?{
????display:?grid;
????align-items:?center;
}
@container?(min-width:?480px)?{
????.form?{
????????grid-template-columns:?min-content?1fr?200px;
????????grid-template-areas:?"searchIcon?searchInput?button";
????????grid-template-rows:?88px;
????????gap:?10px;
????}
}
@container?(min-width:?768px)?{
????.form?{
????????grid-template-columns:?min-content?1fr?min-content?200px;
????????grid-template-areas:?"searchIcon?searchInput?cameraIcon?button";
????????grid-template-rows:?88px;
????????gap:?10px;
????}
}
詳細(xì)代碼可以點(diǎn)擊這里閱讀或獲取。
CSS 容器查詢在主流瀏覽器都能體驗(yàn)效果了,但需要開啟其相關(guān)標(biāo)記。如果你要運(yùn)用于生產(chǎn)環(huán)境,可以考慮其相應(yīng)的 Polyfill:
CSS容器查詢特性絕對是眾望所歸的一個(gè)特性,在2022年更會全速向前!
有關(guān)于 CSS 容器查詢更多的介紹可以移步閱讀下面這些文章:
- 初探CSS容器查詢
- 容器查詢中的
container和@container - 容器查詢給設(shè)計(jì)帶來的變化
- 現(xiàn)代Web技術(shù)讓我們離容器查詢更近一步
CSS的父選擇器 :has()
CSS 選擇器是 CSS 中最基礎(chǔ)的知識,也是必不可少的一部分,如果你沒掌握好 CSS 選擇器的話,那么你將會在 CSS 的世界中有那種”眾里尋她千百度,驀然回首,那人卻在燈火闌珊處“的感覺!也正因此,CSS 選擇器模塊的迭代非常的快,現(xiàn)在已經(jīng)進(jìn)入 Level 4 版本了。在 Level 4 版本中,添加了多個(gè)偽類選擇器,比如 :is() 、:where() 、:not() 和 :has() 等,而其中 :has() 選擇器也是我們期待已久的一個(gè)選擇器。@SaraSoueidan 在 Twitter 上引用 @Jen Simmons 的話說:
:has()選擇器本質(zhì)上就是CSS中期待已久的父選擇器!

CSS 的 :has() 偽類選擇器和 :not() 有點(diǎn)相似,也被稱為結(jié)構(gòu)性偽類選擇器,在 CSS 的函數(shù)中也稱之為 動態(tài)偽類函數(shù)。它允許你更精細(xì)地匹配元素:
:has()偽類代表一個(gè)元素,如果作為參數(shù)傳遞的任何選擇器至少與一個(gè)元素相匹配!
簡單地說,元素只有在傳遞到 :has() 中的選擇器至少匹配一個(gè)元素時(shí)才會被選中。這樣理解起來似乎有點(diǎn)暈,我們來看個(gè)簡單地示例:
figure?img?{?
????aspect-ratio:?21?/?9;?
????border:?5px?solid?#3f51b5;?
}
figure:has(figcaption)?img?{?
????border:?5px?solid?#9c27b0;?
}
上面示例中的 figure img 選擇器大家應(yīng)該都明白,表示選中 元素中的所有 元素;而 figure:has(figcaption) img 選擇器表示的是選中 包含了 元素的 元素中的所有 元素。注意,這里:has() 中傳了個(gè) figcaption 選擇器作為其參數(shù)。
????""?src=""?/>
????
????""?src=""?/>
在支持的瀏覽器中你將看到的效果如下:
注意,Safari TP 137 是目前唯一一個(gè)默認(rèn)支持
:has()選擇器的瀏覽器。
雖然說 :has() 被稱為 CSS 的父選擇器,但它的作用遠(yuǎn)不止于此。我們可以使用 :has() 和 :not() 等選擇器相互結(jié)合,實(shí)現(xiàn)一些更復(fù)雜的效果。
就上面示例而言,當(dāng)你在 輸入的值是否有效時(shí),表單不同狀態(tài)下有不同的 UI 效果:

是不是很有意思。如果對 CSS 的 :has() 選擇器感興趣的話,還可以閱讀《CSS 選擇器:is() 和 :where() 與 :has() 有什么功能》一文。
更多關(guān)于選擇器的內(nèi)容:
- 初探CSS 選擇器Level 4
- 再聊CSS的屬性選擇器
- CSS偽選擇器:
:emptyvs:blank - CSS3 選擇器:偽類選擇器
- CSS3 選擇器:屬性選擇器
- CSS3 選擇器:基本選擇器
@layer 控制 CSS 的級聯(lián)層

CSS的級聯(lián)順序一直以來令眾多開發(fā)者(特別是不熟悉CSS的開發(fā)者)感到困惑和頭痛。CSS 新的 @ 規(guī)則 @layer 將可以讓 CSS 的級聯(lián)順序按照你的意圖來進(jìn)行控制。簡單地說,@layer 可以通過分層的方式,讓你適當(dāng)控制同源規(guī)則的級聯(lián)排序。
比如下面這個(gè)示例:
/*?預(yù)設(shè)級聯(lián)層的順序,并且相鄰級聯(lián)層之間有逗號分隔?*/?
@layer?setting,?tool,?generic,?element,?object,?component,?utilities;
@layer?setting?{?
????/*?附加到級聯(lián)層?setting?中的?CSS?*/?
}?
@layer?tool?{?
????/*?附加到級聯(lián)層?tool?中的?CSS?*/?
}?
@layer?generic?{?
????/*?附加到級聯(lián)層?generic?中的?CSS?*/?
}?
@layer?element?{?
????/*?附加到級聯(lián)層?element?中的?CSS?*/?
}?
@layer?object?{?
????/*?附加到級聯(lián)層?object?中的?CSS?*/?
}?
@layer?component?{?
????/*?附加到級聯(lián)層?component?中的?CSS?*/?
}?
@layer?utilities?{?
????/*?附加到級聯(lián)層?utilities?中的?CSS?*/?
}

上面只是演示了 @layer 規(guī)則的一個(gè)基本使用,而與 @layer 相關(guān)的知識和細(xì)節(jié)很多,這里就不深入展開了。要是你對該特性感興趣的話,可以閱讀《初探 CSS 的級聯(lián)層(@layer)》一文。到目前為止,你們可以在 Chromium 99、Firefox 97 和 Safari TP 133 中查閱。注意,Safari 是最早支持該特性的瀏覽器。
有關(guān)于 CSS 中層疊更多的話題還可以閱讀:
- 圖解CSS:CSS層疊和繼承
- 聊聊CSS中的層疊相關(guān)概念
- 管理CSS層疊
- Web布局:CSS定位和層疊控制
顏色函數(shù)

在 CSS Color Module Level 5 中新增了兩個(gè)處理顏色的新函數(shù),即 color-mix() 和 color-contrast() ,除此之外,還擴(kuò)展了以前的顏色函數(shù)(比如 rgb() 、hsl() 、hwb() 、lab() 和 lch() 等)功能,可以在一個(gè)顏色的基礎(chǔ)上改變某一個(gè)或某幾個(gè)參數(shù)的值,從而得到一個(gè)新的顏色。比如上圖部的 hsl() 函數(shù),我們可以基于 --theme-primary 顏色(假設(shè)它的值為 hsl(274, 61%, 50%))改變其飽和度(從 50% 調(diào)整到 30% )從而得到一個(gè)新的顏色 hsl(274, 61%, 30%) 。這個(gè)特性,可以讓我們在很容易的在 CSS 控制品牌色的色盤:
說個(gè)題外話,我最近的主要工作內(nèi)容之一是將 Design Token 運(yùn)用于前端生產(chǎn)的工程鏈路中,并且根據(jù)組件可變參數(shù)來自動生成不同風(fēng)格的 UI 組件。那么,在未來的某一天,我就可以使用這種特性來為品牌色構(gòu)建色盤。
新增的 color-mix() 和 color-contrast() 函數(shù)相對來說要更復(fù)雜一些。其中 color-mix() 函數(shù)有點(diǎn)類似于設(shè)計(jì)師調(diào)色一樣:允許你在一個(gè)給定的顏色空間中混合兩種顏色。
比如:
:root?{
????--theme-color:?#ff0000;
}
.text-primary-dark?{
????color:?color-mix(var(--theme-primary),?black?10%);
}
.text-primary-darker?{
????color:?color-mix(var(--theme-primary),?black?20%);
}
color-contrast() 函數(shù)比較有意思,特別是在用于構(gòu)建可訪問性 Web 的時(shí)候特別有用。因?yàn)樗梢詭椭覀兲岣?Web 可訪問性方面的能力(更好的控制文本色和背景色的對比度)。其主要作用是獲取一個(gè)顏色值,并將其與其他顏色的列表進(jìn)行比較,從列表中選擇對比度最高的一個(gè)。
比如color-contrast(white vs red, white, green) ,分別會拿red 、white 和 green 與 white 進(jìn)行對比,其中 green 和 white 對比度最高,最終會取 green 顏色:
你也還可以像這樣使用:color-contrast(wheat vs tan, sienna, #d2691e to AA-large) 。它會將 wheat 與 tan 、sienna 和 #d2691e 進(jìn)行對比,最終 sienna 顏色獲勝,因?yàn)樗c wheat 顏色的對比度為 4.273 ,超過了 AA-large 的閾值。
Safari TP 124 已將
hwb()、lch()、lab()、color-mix()和color-contrast()置為默認(rèn)功能!
額外提一下,其中 hwb() 、lch() 和 lab() 所表達(dá)的顏色空間和 rgb() 還是有差異的,它們能將顏色表達(dá)的更細(xì)膩。就拿 hwb() 函數(shù)來說:
基于同一色相 0deg 描述的顏色:
有關(guān)于 CSS 顏色更多介紹,可以閱讀:
- 圖解CSS: CSS 顏色
- A11Y 101:顏色對比度和Web可訪問性
- 使用
color-mod()函數(shù)修改顏色
視窗單位

”視窗單位“對于大家來說應(yīng)該不會感到陌生了,特別是針對移動端開發(fā)的同學(xué)來說。因?yàn)橐苿佣爽F(xiàn)在主流的適配方案之一就是采用視窗單位來處理的。但很多同學(xué)所知道的視窗單位應(yīng)該只是 vw 、vh 、vmin 和 vmax :
視窗單位給移動端開發(fā)的適配是帶來了極大的優(yōu)勢,但我想你在使用視窗單位的時(shí)候,應(yīng)該也碰到了iOS上 Safari 的兼容性問題。因?yàn)椋趇OS上的 Safari 有一個(gè)長期存在的,極其惱人的Bug,它不能與 vh 單位很好的配合。如果你將一個(gè)容器的高度設(shè)置為 100vh 時(shí),會導(dǎo)致這個(gè)元素有點(diǎn)太高(會出現(xiàn)滾動條)。造成這種現(xiàn)象的主要原因是移動端上的 Safari 在計(jì)算 100vh 時(shí)忽略了它的部分用戶界面。

如果你對 iOS 的 Safari上 100vh 的相關(guān)問題以及解決方案感興趣的話,還可以移步閱讀:
- The trick to viewport units on mobile
- Does Safari 15 finally fix viewport height?
- CSS fix for 100vh in mobile Webkit
- A Bashfuul Button Worth $8 Million
- 100vh in Safari on iOS
如果你不想花過多時(shí)間搞清楚這個(gè)問題的話,只是想快速解決這個(gè)問題,那可以將下面這段代碼放到你的代碼片段中:
body?{
????height:?100vh;
}
@supports?(-webkit-touch-callout:?none)?{
????body?{
????????height:?-webkit-fill-available;
????}
}
雖然上面的代碼可以解決 100vh 在 iOS Safari 引起的問題,但終究也只能說是一種 Hack 手段(事實(shí)上,CSS 中有很多黑魔法,這里不是主要聊這個(gè)的,顠過)。慶幸的是,CSS Values and Units Module Level 4 新增了幾個(gè)與視窗有關(guān)系的新單位:
svh/svw:小視窗高度(height)、寬度(width)的1%lvh/lvw:大視窗高度(height)、寬度(width)的1%dvh/dwv:動態(tài)視窗高度(height)、寬度(width)的1%
也有相應(yīng)的單位用于 CSS 的邏輯屬性中,比如 svi/svb 。有關(guān)于 這幾個(gè)新增的視窗單位更詳細(xì)的介紹,可以閱讀 @Bramus 的 《The large, Small, and Dynamic Viewports》一文和@Arek Nawo 的 《Investigating the new CSS viewport relative units》一文。既然聊起了 CSS 的單位,那就再多花點(diǎn)篇幅和大家再多聊幾個(gè)新增的 CSS 單位,也是蠻有意思的。先說 CSS Values and Units Module Level 4 新增的 lh 和 rlh 吧。

簡單地回憶一下 CSS 中另一對單位:em 和 rem 。稍微了解 CSS 的同學(xué)都知道:- em 是相對于元素自已的 font-size 值計(jì)算(除元素自身的 font-size 取值為em時(shí),元素自身的 font-size 值單位為 em時(shí),其相對于其父元素的font-size值計(jì)算) - rem 是相對于HTML文檔的根元素的 font-size 值計(jì)算,文檔的根元素一般是指 元素
這兩個(gè)新增的 lh 和 rlh 與 em 和 rem 非常的相似,只不過他們相對的是 line-height 的值計(jì)算:- lh 相對于元素自己的 line-height 計(jì)算 - rlh 相對于文檔根元素( )的 line-height 計(jì)算
你肯定會問,這樣的單位有何用處呢?我想大家在還原 UI 設(shè)計(jì)稿的時(shí)候,肯定碰到了因?yàn)樽煮w不同以及 line-height 值不同,讓元素在視覺上看上去總是對不齊。那么,有了 lh 和 rlh 之后,事情會變得好一點(diǎn)。比如下圖這樣的場景:
以前上圖這樣的標(biāo)記,常把寬高設(shè)置為 1em ,那么現(xiàn)在可以設(shè)置 1lh :
::marker?{
????width:?1lh;
????height:?1lh;
}
到目前為止,僅 Safari TP 105 聲稱支持這兩個(gè)相對單位 lh 和 rlh 。前面提到 CSS 容器查詢特性一直以來是 Web 設(shè)計(jì)師和開發(fā)者一直期待的特性,并且在 2021 年得到快速發(fā)展。同時(shí),和 CSS 容器查詢特性一起出現(xiàn)的 ”*容器查詢單位“ 也是很有意義和作用的。只不過,CSS 容器查詢單位與 CSS 容器查詢模塊放在一起,并未和其他的 CSS 單位納入一起。CSS 容器查詢單位和視窗單位有點(diǎn)類似,不同的是 視窗單位相對于瀏覽器視窗尺寸計(jì)算,而容器查詢單位相對于查詢?nèi)萜饔?jì)算。使用容器查詢長度單位的樣式表可以更容易將一個(gè)組件從一個(gè)查詢?nèi)萜髦幸频搅硪粋€(gè)查詢?nèi)萜鳌SS容器查詢的單位主要有:
cqw:等于查詢?nèi)萜鲗挾龋?code style="font-size:14px;font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(106,115,125);background-color:rgb(218,238,255);">width)的1%cqh:等于查詢?nèi)萜鞲叨龋?code style="font-size:14px;font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(106,115,125);background-color:rgb(218,238,255);">height)的1%cqi:等于查詢?nèi)萜鲀?nèi)聯(lián)尺寸(inline-size)的1%cqb:等于查詢?nèi)萜鲏K尺寸(block-size)的1%cqmin是cqi或cqb中較小的那個(gè)(也可以是cqw或cqh中較小的那個(gè))cqmax是cqi或cqb中較大的那個(gè)(也可以是cqw或cqh中較大的那個(gè))
早其容器查詢的單位定義的是
c*(比如,cw、ch、cmin和cmax)之類的,但其中有些單位會和ch單位產(chǎn)生沖突,因此,最終確定的容器查詢單位是以cq*開始的。也就是上面所列的幾個(gè)!
正如 @Miriam Suzanne(最初提出建議的人,也是規(guī)范的編輯)所分享的,這些 CSS 單位是Chromium中實(shí)驗(yàn)性容器查詢支持的一部分。
更為有趣的是,@Ahmad Shadeed 在他的文章《CSS Container Query Units》一文中提出 qw 、qh 、qmin 和 qmax 以及他們對應(yīng)的邏輯屬性的單位qi 、qb 。

@Ahmad Shadeed 使用這些新的CSS單位運(yùn)用在 font-size 上。可以用于容器查詢的一坨 CSS 代碼,在clamp() 比較函數(shù)中使用cqw 單位來取代。

過度滾動行為:overscroll-behavior
早在2018年和大家聊改變滾動體驗(yàn)的時(shí)候就介紹過 overscroll-behavior 屬性,我們可以通過該屬性覆蓋 overscroll 容器(指的是內(nèi)容寬或高大于容器的寬或高,出現(xiàn)滾動條)時(shí)的默認(rèn)行為。拿一個(gè)具體的實(shí)例來說,比如我們在構(gòu)建彈框的時(shí)候,彈框內(nèi)容過高也會出現(xiàn)滾動條,這個(gè)時(shí)候就會有兩個(gè)滾動條出現(xiàn),一個(gè)是彈框的,一個(gè)是body 的,其默認(rèn)行為會像下面錄屏的效果:
彈框無法滾動時(shí),其底部的內(nèi)容可以繼續(xù)滾動。說實(shí)話,這樣的默認(rèn)滾動行為給用戶的體驗(yàn)是極差的。更多的時(shí)候,我們希望彈框無法滾動時(shí),其底部的滾動條也不能滾動。如下所示:
要實(shí)現(xiàn)上面視頻的效果,我們就需要使用 overscroll-behavior 屬性,并且將其值設(shè)置為 contain :
.modal?{
????overscroll-behavior-y:?contain;
????overflow-y:?auto;
}
這個(gè)特性早在 Firefox 36 和 Chrome 63 就開始得到支持了,只不過Safari還未得到支持,不過 Safari 也在迎頭趕上。
有關(guān)于
overscroll-behavior的相關(guān)介紹,可以閱讀 @Ahmad Shadeed 的《Prevent Scroll Chaining With Overscroll Behavior》一文。
在 CSS 中改善滾動體驗(yàn),除了overscroll-behavior 屬性之外,還有其他的一些屬性,比如滾動捕捉 scroll-snap (Scroll Snap模塊中的屬性)、pull-to-refresh 等。CSS 除了要以控制滾動行為之外,也可以控制滾動條的樣式。在今年以前,CSS 控制滾動條樣式是使用瀏覽器的一些私有屬性來搞定:
就在 2021 年 12 月 09日,W3C 發(fā)布了的 CSS Scrollbars Styling Module Level 1 規(guī)范,該規(guī)范提供了 scrollbar-color 和 scrollbar-width 兩個(gè)屬性,用來給滾動條設(shè)置樣式。以后,我們要以使用它們來輕易完成滾動條樣式的定制:
.section?{????scrollbar-color:?#6969dd?#e0e0e0;????scrollbar-width:?thin;}

我想大家都知道,使用 CSS 來美化滾動條樣式主要原因之一是因?yàn)闈L動條在不同的系統(tǒng)平臺上顯示有差異,外觀不統(tǒng)一。除此之外,還有另一個(gè)問題。在 Web 上顯示滾動條有一個(gè)副作用,那就是 內(nèi)容的布局可能會根據(jù)滾動條的類型而改變。如果我們想防止由滾動條引起的一些不必要的布局變化,希望有相應(yīng)的 CSS 屬性來處理。以前沒有,但現(xiàn)在有了。CSS Overflow Module Level 4 新增了一個(gè) scrollbar-gutter 屬性,有了這個(gè)屬性,開發(fā)者就可以更好的控制滾動條,或者說解決因滾動條類型不同引起布局的差異變化。下圖中展示了 scrollbar-gutter 的取值不同時(shí)的效果:

如果你對美化滾動條以及 scrollbar-gutter相關(guān)的知識感興趣的話,可以閱讀:
- Custom Scrollbars In CSS
- Prevent unwanted Layout Shifts caused by Scrollbars with the scrollbar-gutter CSS property
CSS網(wǎng)格的 subgrid

就 Web 布局 而言,雖然 Flexbox 很優(yōu)秀了,但在二維布局中 Flexbox 還是有很大的局限性。在整個(gè) Web 布局的技術(shù)體系中,只有 CSS Grid 才是唯一的二維布局。CSS Grd 布局在這幾年中一直在不斷的向前推進(jìn),已經(jīng)得到了主流瀏覽器的支持。CSS Grid 能這么快向前推進(jìn),除了要感謝瀏覽器廠商的開發(fā)者團(tuán)隊(duì)之外,我個(gè)人認(rèn)為還必須要感謝 @Jen Simmons 和 @Rachel Andrew。
@Jen Simmons 和 @Rachel Andrew 除了是 CSS Grid 規(guī)范的締造者,還是 CSS Grid 布道者,她一直在社區(qū)努力推進(jìn) Grid 向前發(fā)展。
CSS Grid 已經(jīng)有很多年了,該模塊中的很多特性在主流瀏覽器中都得到了支持。在 2021 年,我自已陸續(xù)花了近半年的時(shí)間,對 CSS Grid 技術(shù)進(jìn)行了系統(tǒng)的學(xué)習(xí),并且整理了二十多篇有關(guān)于 CSS Grid 方面的系列教程,在這個(gè)系列中除了 CSS Grid 的理論知識之外,還有一些實(shí)戰(zhàn)案例。要是你對這方面感興趣的話,可以從《2022年不能再錯過 CSS 網(wǎng)格布局了》一文中索引。這里著重把 CSS 網(wǎng)格中的子網(wǎng)格 subgrid 單獨(dú)拿出來是原因的。子網(wǎng)格從定義到今天,經(jīng)歷了很多個(gè)版本的演變,而且在 CSS 社區(qū)也引起來很大的爭議。在 CSS Grid 出現(xiàn)之后,就有人提出:
在 CSS 網(wǎng)格布局系統(tǒng)中應(yīng)該要有一個(gè)子網(wǎng)格,即
subgrid
為此,最早定義的 subgrid 像 grid 和 inline-grid 一樣,它只是 display 屬性的一個(gè)值:
.subgrid?{
????display:?subgrid;
}
不過沒過多年,subgrid 就從 display 屬性中移除了。使用嵌套網(wǎng)格來模擬子網(wǎng)格:.grid { display: grid; grid-template-columns: repeat(4, 1fr); }
.grid__item?{????display:?grid;????grid-template-columns:?repeat(4,?1fr);}
簡單地說,在需要嵌套網(wǎng)格的網(wǎng)格項(xiàng)目上再次使用 display: grid 以及 grid 相關(guān)的屬性重新定義一個(gè)網(wǎng)格。只不過,這種方式也問題存在:很難將嵌套網(wǎng)格項(xiàng)目與父網(wǎng)格對齊。換句話說,父網(wǎng)格和嵌套網(wǎng)格是兩個(gè)獨(dú)立的網(wǎng)格,他們有著自己獨(dú)立的網(wǎng)格參數(shù)。為了讓子網(wǎng)格能繼續(xù)父網(wǎng)格的相關(guān)參數(shù),才又將 subgrid 再次引入到 CSS Grid 系統(tǒng)中,只不過,subgrid 不再是 display 的值,而是網(wǎng)格屬性 grid-template-columns 或 grid-template-rows 屬性的值。
.grid__container?{?????display:?grid;?????grid-template-columns:?1fr?2fr?3fr?2fr?1fr;?????grid-template-rows:?1fr?2fr?2fr?1fr;?gap:?1rem;?}?.grid__container--subgrid?{?????grid-column:?2?/?5;?????grid-row:?2?/?4;?}?.grid__container--subgrid?{?????display:?inherit;?????grid-template-columns:?subgrid;?????grid-template-rows:?subgrid;?}

正如上圖所示,這就是subgrid的作用:通過設(shè)置grid-template-columns或grid-template-rows為subgrid,它將與父網(wǎng)格對齊。真正的子網(wǎng)格可以使用父網(wǎng)格的相關(guān)參數(shù)。簡單地說,使用該特性,可以輕易實(shí)現(xiàn)像下圖這樣的卡片布局:
還有一段時(shí)間,也有另一種建議,那就是使用 display: contents 來替代 subgrid 。而到今天為止,在網(wǎng)格布局系統(tǒng)中,嵌套網(wǎng)格、子網(wǎng)格和 display: contents 模擬的子網(wǎng)格都同時(shí)存在。他們都有著自己的特性。這里就不花過多時(shí)間闡述了。subgrid已成為 CSS Grid 模塊中不可或缺的一個(gè)特性,直到今天為止(2012年的最后一天),也僅 Firefox 瀏覽器支持。不過,Chrome 已進(jìn)入 WIP 階段,我想 2022 年上半年,你就能在 Chrome 瀏覽器體驗(yàn) subgrid 的效果。
既然提到 CSS Grid,那就順嘴說一下 CSS 的 gap 屬性吧。該屬性不只是 Grid 布局獨(dú)有的,在 CSS Flexbox 、Grid 和多列布局中都有 gap 屬性。在布局中,在某些場景中,給相鄰元素之間設(shè)置間距要比 margin 容易地多。
從 @Jen Simmons 發(fā)的推特消息中可以獲知,Safari 14.1 開始也支持 Flexbox 中的 gap 屬性。我自測了一下,Grid中的 gap 也得到支持了。也不是說,現(xiàn)在主流瀏覽器都已支持 gap 屬性了:
accent-color
Web 中有很多控件的 UI 效果是跟隨系統(tǒng)走的。比如表單中的一些控件,比如常用的輸入框()、單選按鈕,復(fù)選框,進(jìn)度條等。
以往,為了在 UI 的風(fēng)格上能滿足設(shè)計(jì)師的需求,即 所以平臺上使用風(fēng)格一致的UI效果。為此,Web 開發(fā)者需要增加額外的開發(fā)工作量,采用自定義表單控件的方式來讓 UI 網(wǎng)格統(tǒng)一。為了讓開發(fā)者能更好的滿足設(shè)計(jì)師的需求,并且快速讓各種平臺統(tǒng)一 UI 網(wǎng)格, CSS Basic User Interface Module Level 4 新增了 accent-color 屬性,可以很輕易的控制 Web 控件 (Widget Accent) UI:
:root?{?????accent-color:?deeppink;?}?@media?(prefers-color-scheme:?dark)?{?????:root?{?????????accent-color:?hsl(328?100%?65%);?????}}

既然提到 Web 表單中的控件,那就給大家提兩個(gè)有關(guān)于 `` 元素的屬性。因?yàn)檫@兩個(gè)屬性能給你的用戶帶來更好的體驗(yàn),特別是在操作表單的時(shí)候。除了給 元素的 type 指定不同值時(shí),可以提供不同鍵盤類型之外,還可以使用 inputmode 屬性:
inputmode 可以喚起不同類型的軟鍵盤,另一個(gè)改善用戶體驗(yàn)的是給 元素的 enterkeyhint 屬性設(shè)置不同的值,可以改變軟鍵中的 Enter 鍵的類型的操作行為:

上面提到的,不管是 CSS 還是 HTML 的屬性,都是用來改變用戶體驗(yàn)的。再提一個(gè)和 HTML相關(guān)的屬性。
自Safari 15 開始,我們在 HTML 的 標(biāo)簽為 theme-color 設(shè)置顏色,讓瀏覽器自身的 UI 顏色有讓開發(fā)者來控制:
特別聲明,這里的
theme-color不是 CSS 屬性,他是 HTML 的元素的name的一個(gè)值,結(jié)合content和media能輕易控制系統(tǒng)級的顏色。
似乎跑題了!我們要聊的是 2022 年的 CSS !嗯!那我們繼續(xù)回到 CSS 的世界中來。
媒體查詢

CSS 媒體查詢 @media 已不是什么新特性了(除了新增的一些用戶偏好的條件設(shè)置)。但今天要提出的是他的語法規(guī)則的寫法。先上一張圖吧:

以往在 @media 或者在 @container 規(guī)則中寫判斷條件時(shí)使用 min-width 和 max-width 較多,不知道大家是否和我一樣有這樣的感覺,使用 min-width 和 max-width 很多時(shí)候傻傻分不清楚他們的范圍。為此,我總是喜歡使用下圖來做判斷:
自 CSS Media Queries Level 4 開始,我們可以使用較為熟悉的數(shù)學(xué)表達(dá)式了,在媒體條件中使用 > 、>= 、< 或 <= 等數(shù)學(xué)表達(dá)式:
上圖中使用 @media 語法表達(dá)的話,像下面這樣:
/*?Old?Way?*/
@media?(max-width:?768px)?{
????…
}
@media?(min-width:?375px)?{
????…
}
@media?(min-width:?375px)?and?(max-width:?768px)?{
????...
}
/*?New?Way?*/
@media?(width?<=?768px)?{
????…
}
@media?(width?>=?375px)?{
????…
}
@media?(375px?<=?width?<=?768px)?{
????...
}
同樣的,數(shù)學(xué)比較運(yùn)算符表達(dá)式也同樣可以運(yùn)用于 @container 容器查詢的條件判斷中。
如果你對媒體查詢方面的知識感興趣的話,還可以閱讀:
- 圖解CSS: CSS媒體查詢
- CSS媒體查詢新特性
- 系統(tǒng)偏好設(shè)置的那些事兒
F-mods

F-mods 是 Font Metrics Override Descriptors(字體度量覆蓋描述符)的簡稱。它對應(yīng)著 CSS Fonts Module Level 4 規(guī)范中的 @font-face 部分的第十一小節(jié),即 默認(rèn)的字體度量覆蓋。簡單地說,在 @font-face 規(guī)則中新增了 ascent-override、descent-override、line-gap-override 和 advance-override 等屬性:
@font-face?{?????font-family:?'Arial'?src:?local('Arial');?????--unitsPerEm:?1000;?????--lineGap:?10;?????--descender:?-237;?????--ascender:?1041;?????--advanceWidthMax:?815;?????ascent-override:?calc(var(--ascender)?/?var(--unitsPerEm)?*?100%);?????descent-override:?calc(var(--descender)?/?var(--unitsPerEm)?*?100%);?????line-gap-override:?calc(var(--lineGap)?/?var(--unitsPerEm)?*?100%);?????advance-override:?calc(var(--advanceWidthMax)?/?var(--unitsPerEm));?}
其中 advance-override 還未進(jìn)入 W3C 規(guī)范,目前還僅處于提案中;而 ascent-override、descent-override 和 line-gap-override 屬性目前已在 Chromium 87+ 和 Firefox 89+ 中實(shí)現(xiàn)!
這四個(gè)描述符的組合可以讓我們告訴瀏覽器在下載 Web Fonts 之前字符占用多少空間,來覆蓋回退字體(系統(tǒng)字體)的布局,使其與 Web Fonts 相匹配。簡單地說:這四個(gè)描述符可以讓你的系統(tǒng)字體更接近 Web Fonts!其中 ascent-override、descent-override 和 line-gap-override 描述符使我們 能夠完全消除垂直布局的偏移,因?yàn)檫@三個(gè)描述符都會影響行高。在 CSS Fonts Module Level 5 規(guī)范中又為 @font-face 規(guī)則添加了幾個(gè)新屬性。比如,用來覆蓋字體上標(biāo)(sup)和下標(biāo)(sub)的 superscript-position-override、subscript-position-override、superscript-size-override 和 subscript-size-override 描述符。雖然這幾個(gè)屬性還沒有得到任何瀏覽器的支持,但對于 Web 開發(fā)者而言,這是希望。
除此之外,還新增了 size-adjust 描述符,它允許我們調(diào)整字形的比例系數(shù)(百分比)。該描述符取代了前面提到的 advance-override描述符。正如 @Addy Osmani在他自己推特上,是這樣描述 size-adjust:
size-adjust已經(jīng)得到了 Chromium 92+ 和 Firefox 89+ 的支持。
說到 @font-face 那就有必要提到大家也一直期待的另一個(gè) CSS 特性,那就是 leading-trim:
leading-trim 其主要作用就是用來改變文本布局。
在鉛印刷術(shù)中,為了讓鉛字塊(排成行)之間有一定的間距,排字工人會在行與行之間墊一些鉛條,讓閱讀變得更舒服一些。在那個(gè)時(shí)代,鍋條一般都放置在鉛塊下方。同樣的,在Web排版上也有鉛條的身影,只不過他分面上下兩個(gè)部分。在CSS中引入該特性,它的工作原理就像一個(gè)文本框剪切刀。去掉文本框上下之間多余的空間(這個(gè)空間其實(shí)就是鉛條高度的一半):
h1?{?????text-edge:?cap?alphabetic;?????leading-trim:?both;?}

示例中用到了text-edge 屬性,簡單地用下圖來描述其作用:
開發(fā) Web 時(shí),對于排版方面是較為復(fù)雜的,涉及到的CSS知識也較多,如果你感興趣的話,可以閱讀下面這些文章:
- Web Fonts 的優(yōu)化:Web Fonts vs. 系統(tǒng)字體
- Web Fonts 的優(yōu)化:FOUT, FOIT 和 FOFT
- Web Fonts 的優(yōu)化:Web Fonts 字體加載策略
- Web Fonts 的優(yōu)化:F-mods
- 深入了解CSS字體度量,行高和
vertical-align - 字體變體
font-variation-* - 圖解CSS: 變量字體
- CSS的
leading-trim給排版帶來的變化
下一代CSS Transform

這個(gè)和前面提到的 CSS 媒體查詢有點(diǎn)類似。不是 CSS 的新特性,在 CSS Transform Level 2 規(guī)范中把以前用到 transform 屬性的 rotate() 、scale() 、translate() 函數(shù)變成獨(dú)立的 CSS 屬性。而且它們都已經(jīng)成為主流瀏覽器的實(shí)驗(yàn)屬性,能在瀏覽器中體驗(yàn)他們。
element?{
????scale:?2;
????rotate:?30deg;
????translate:?-50%?-50%;
}
平移(translate)、旋轉(zhuǎn)(rotate)和縮放(scale)屬性允許開發(fā)者獨(dú)立地指定簡單的變換,其方式與典型的用戶界面使用方式一致,而不必記住變換中的順序,使transform()、rotate()和scale()的動作保持獨(dú)立并在屏幕坐標(biāo)中發(fā)揮作用。它們被應(yīng)用的順序是,首先是平移,然后是旋轉(zhuǎn),然后是縮放,而不是你定義它們的順序。有了獨(dú)立的變換屬性,這也意味著我們可以對它們分別進(jìn)行動畫和過渡。
@keyframes?individual?{
????50%?{
????????translate:?0?50%;
????}
????75%?{
????????scale:?1;
????}
}
element?{
????transition:??rotate?200ms?ease-in-out,?scale?500ms?linear;
}
element:hover?{
????scale:?2;
????rotate:?-3deg;
}
有關(guān)于這方面更詳細(xì)的介紹可以閱讀:
- 下一代CSS的Transform
- CSS3 3D Transform
- CSS3 2D Transform
實(shí)驗(yàn)性屬性
接下來提到的 CSS 特性只是部分瀏覽器的實(shí)驗(yàn)性功能,不會得到大多數(shù)瀏覽器的支持,或者可能只有在相應(yīng)的瀏覽器中開啟了實(shí)驗(yàn)性功能標(biāo)記才能看到效果。這些特性在 2022 年,甚至是再往后一兩年都有可能得不到所有主流瀏覽器的支持。除了不會得到瀏覽器支持,而且規(guī)范都有可能會變更。說不定還會從 CSS 中移除!
CSS 的嵌套

上圖看上去很熟,對吧!但它不是 SCSS 中的嵌套,是原生 CSS 中的嵌套。在 CSS 方面這算是一個(gè)突破性的補(bǔ)充,也算是繼續(xù) CSS 自定義屬性(CSS 變量)的又補(bǔ)充。以往這樣的規(guī)則,只能在 CSS 的處理器中運(yùn)行。在 CSS 的嵌套模塊中,我們可以使用 & 和 @nest 規(guī)則在一個(gè)樣式規(guī)則塊中嵌套另一個(gè)樣式規(guī)則塊:
table.colortable?{????&?td?{????????text-align:?center;????????&.c?{?text-transform:?uppercase?}????????&:first-child,?&:first-child?+?td?{?border:?1px?solid?black?}????}????&?th?{????????text-align:?center;????????background:?black;????????color:?white;????}????@nest?footer?&?{????????font-size:?0.8em;????}}
有關(guān)于 CSS 的原生嵌套更多的介紹,可以閱讀《圖解CSS:CSS的嵌套》一文。
CSS作用域:@scope

CSS Cascading and Inheritance Level 5 中引入了 @layer 規(guī)則,將在 Level 6 中會引入另一個(gè)規(guī)則 @scope 。這是一種將樣式范圍擴(kuò)大到DOM樹的一種用法。
/*?當(dāng).light-theme和.dark-theme被嵌套時(shí),你可能不會得到預(yù)期的結(jié)果?*/
.light-theme?a?{?
????color:?purple;?
}
.dark-theme?a?{?
????color:?plum;?
}
/*?通過范圍劃分,我們可以解決這個(gè)問題,因?yàn)閍元素的樣式將由其最近的范圍來確定?*/
@scope?(.light-scheme)?{
????a?{?
????????color:?darkmagenta;?
????}
}
@scope?(.dark-scheme)?{
????a?{?
????????color:?plum;?
????}
}
@when ... @else

@when ... @else 是 CSS Conditional Rules Module Level 5 新增的特性,他們可以分開來單獨(dú)使用,也可以組合在一起使用。
@when?media(width?>=?400px)?and?media(pointer:?fine)?and?supports(display:?flex)?{
????/*?A?*/
}?@else?supports(caret-color:?pink)?and?supports(background:?double-rainbow())?{
????/*?B?*/
}?@else?{
????/*?C?*/
}
@Stefan Judis 將這個(gè)CSS 特性(@when ... @else)有前面提到的 CSS特性,即 CSS 容器查詢 和 媒體查詢的數(shù)學(xué)運(yùn)算表達(dá)式組合在一起,重新設(shè)計(jì)了 @Ahmad Shadeed 的 《Conditional Border Radius In CSS》文章中提到的有條件設(shè)置圓角:

@Stefan Judis 重新設(shè)計(jì)的方案:

有關(guān)于有條件設(shè)置圓角半徑除了這里提到的方案,其實(shí)還有其他的方案,你要是想一探究竟的話,可以閱讀前幾天剛整理的《CSS 中的條件圓角技巧》一文。
滾動與動畫

這里所說的滾動與動畫指 Scroll-linked Animations 模塊中提供的 @scroll-timeline規(guī)則和 animation-timeline 屬性。你可以將 CSS 動畫與一個(gè)滾動容器的滾動偏移量關(guān)聯(lián)起來。當(dāng)你向上或向下滾動一個(gè)容器時(shí),鏈接的動畫將相應(yīng)的前進(jìn)或后退。
比如像下面效果:
使用 @scroll-timeline 規(guī)則和 animation-timeline 構(gòu)建類似上面的效果,要以按下面三步來走:
/*?(1)?Define?Keyframes?*/
@keyframes?adjust-progressbar?{
????from?{
????????transform:?scaleX(0);
????}
????to?{
????????transform:?scaleX(1);
????}
}
/*?(2)?Define?a?ScrollTimeline?*/
@scroll-timeline?scroll-in-document?{
????source:?auto;
????orientation:?block;
????scroll-offsets:?0,?100%;
}
/*?(3)?Attach?the?Animation?+?set?the?ScrollTimeline?as?the?driver?for?the?Animation?*/
#progressbar?{
????animation:?1s?linear?forwards?adjust-progressbar;
????animation-timeline:?scroll-in-document;
}
有關(guān)于這方面更詳細(xì)的介紹,可以閱讀 @Bramus 提供的系列教程:
- Part 1: Introduction + Basic Scroll-Linked Animations
- Part 2: Scroll-Linked Animations with Element-based offsets
- Part 3: Practical Use-Cases
- Part 4: Scroll-Linked Animations With the Web Animations API (WAAPI)
CSS Houdini 變量:@property

@property 是用來注冊一個(gè)變量的,該變量是一個(gè) CSS Houdini 中的變量,但它的使用和 CSS 中的自定義屬性(CSS變量)是一樣的,不同的是注冊方式:
//?Chrome?78+
//?需要在?JavaScript腳本中注冊
CSS.registerProperty({
????'name':?'--custom-property-name',
????'syntax':?'' ,
????'initialValue':?'black',
????'inherits':?false
})
//?Chrome?85+
//?在CSS文件中注冊
@property?--custom-property-name?{
????'syntax':?'' ,
????'initialValue':?'black',
????'inherits':?false
}
他的最大特色之一就是可以指定已注冊的 CSS 變量的類型、初始值,是否可繼承:
雖然它的使用方式和 CSS 的自定義屬性相似,但它要更強(qiáng)大,特別是在動效方面的使用,能增強(qiáng) CSS 的動效能力,甚至實(shí)現(xiàn)一些以前 CSS 無法實(shí)現(xiàn)的動效。比如
@property?--milliseconds?{
????syntax:?'' ;
????initial-value:?0;
????inherits:?false;
}
.counter?{
????counter-reset:?ms?var(--milliseconds);
????animation:?count?1s?steps(100)?infinite;
}
@keyframes?count?{?
????to?{
????????--milliseconds:?100;
????}
}
把它和 CSS Houdini 的 Paint API 結(jié)合起來,可做的事情更多:
更多這方向的效果可以在 houdini.how 網(wǎng)站上查閱:

CSS Houdini 中的 @property 和 Paint API 是對現(xiàn)在 CSS 能力的擴(kuò)展,如果你對這方面感興趣的話,可以閱讀:
- CSS Houdini自定義屬性
@property給動效帶來的擴(kuò)展 - CSS Houdini:
@property注冊自定義屬性 - CSS Houdini:深入理解CSS自定義屬性
- CSS Paint API給CSS的擴(kuò)展帶來了曙光
- CSS Paint API
瀑布流布局

瀑布流是 Web 中經(jīng)典布局之一。到目前為止依舊是 JavaScript 實(shí)現(xiàn)的瀑布流布局為主要技術(shù)方案,雖然使用 CSS 技術(shù)在一定條件之下可以完成瀑布流布局,但其局限性也較大。在 CSS Grid 最新模塊中提供了原生的 CSS 瀑布流布局方案:
.masonry?{?
????display:?grid;?gap:?20px;?
????grid:?masonry?/?repeat(auto-fill,?minmax(250px,?1fr));?
}

但一直以來他還只是 Firefox 中的一個(gè)實(shí)驗(yàn)屬性,還沒有看到其他瀏覽器有支持,但我期望在 2022 年的某一天能在主流瀏覽器上都能看到 CSS Grid 實(shí)現(xiàn)瀑布流的布局的效果。
小結(jié)
上面列出的一些 CSS 新特性(也有新語法),具體有哪些新特性能在 2022 年中出現(xiàn)在瀏覽器中,還不得而知。上面的提到的一些特性其實(shí)已經(jīng)在一個(gè)或多個(gè)瀏覽器中能體驗(yàn)了。感興趣的可以自己嘗試一下。另外要特別提出的是,上面列的 CSS 屬性清單來自于社區(qū)有同行業(yè)專家以及我自己的一些積累和見解,如果有不對之處,歡迎一起探討。如果所列清單有遺漏,也歡迎大家分享出來。最后,希望上面的內(nèi)容能幫助大家了解 CSS 的一些新東西,打開一些未知領(lǐng)域!謝謝!(^_^)
