<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大漠老師:2022 年的 CSS,到底有哪些特性

          共 14445字,需瀏覽 29分鐘

           ·

          2022-03-24 11:15

          關(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 清單:a9646f2d2619eaae883a0f0e373f68fd.webp

          有關(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ì):

          6baf0a4a6ea9ddad2c03edab1fd61af7.webp

          在第一份報(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)識和見解。

          654428fa21de8b8ab0250b6e8336c5f1.webp

          我需要額外提出的是,接下來內(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 容器查詢

          0a7ec2febccba7e8a448990de509523c.webp

          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了:b222abfa9394b5e45b1eb5034f69c01e.webp

          上圖演示了,基于視窗的設(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ì)必不可少的特性之一。

          7fecb9af455d38ea089d974b693ad10c.webp

          有了 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:ecfe041859aeec6599b9c7d4671ad3c0.webp

          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中期待已久的父選擇器!

          b04ad750f79d45f61f35b74a9427b44a.webp

          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=""?/>

          在支持的瀏覽器中你將看到的效果如下:1861fc64bdb36a1184852f824bfe4548.webp

          注意,Safari TP 137 是目前唯一一個(gè)默認(rèn)支持 :has() 選擇器的瀏覽器。

          雖然說 :has() 被稱為 CSS 的父選擇器,但它的作用遠(yuǎn)不止于此。我們可以使用 :has():not() 等選擇器相互結(jié)合,實(shí)現(xiàn)一些更復(fù)雜的效果。490739d24aff38e6045b66932ce479e7.webp

          就上面示例而言,當(dāng)你在 輸入的值是否有效時(shí),表單不同狀態(tài)下有不同的 UI 效果:

          44f2e05dbb5cbcefa16bd8a0efb3b223.webp

          是不是很有意思。如果對 CSS 的 :has() 選擇器感興趣的話,還可以閱讀《CSS 選擇器:is():where():has() 有什么功能》一文。

          更多關(guān)于選擇器的內(nèi)容:

          • 初探CSS 選擇器Level 4
          • 再聊CSS的屬性選擇器
          • CSS偽選擇器::empty vs :blank
          • CSS3 選擇器:偽類選擇器
          • CSS3 選擇器:屬性選擇器
          • CSS3 選擇器:基本選擇器

          @layer 控制 CSS 的級聯(lián)層

          8ce492d77beda41d46d157b5464cb17d.webp

          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?*/?
          }
          44d3a4e694a27a4e853d53318bf6b542.webp

          上面只是演示了 @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ù)

          a0e2470cecf6e191045d5caade0ead33.webp

          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 控制品牌色的色盤:ca44f9ac45dad619f1e3c494139f28a3.webp

          說個(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è)給定的顏色空間中混合兩種顏色00a79d446959b4ad7729419f44ebe173.webp

          比如:

          :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è)。ad35c9b8075ff66463b45b251db2ee38.webp

          比如color-contrast(white vs red, white, green) ,分別會拿redwhitegreenwhite 進(jìn)行對比,其中 greenwhite 對比度最高,最終會取 green 顏色:67feb1ff9c4c9c4ea5ae872ea2386c5b.webp

          你也還可以像這樣使用:color-contrast(wheat vs tan, sienna, #d2691e to AA-large) 。它會將 wheattansienna#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ù)來說:bb8e889a5426dcaf78dafa639fe866a4.webp

          基于同一色相 0deg 描述的顏色:f20546dd9942a9751e2df01d4e2396f8.webp

          有關(guān)于 CSS 顏色更多介紹,可以閱讀:

          • 圖解CSS: CSS 顏色
          • A11Y 101:顏色對比度和Web可訪問性
          • 使用 color-mod() 函數(shù)修改顏色

          視窗單位

          32b1bf62b4d3f6976576beee63cc5740.webp

          ”視窗單位“對于大家來說應(yīng)該不會感到陌生了,特別是針對移動端開發(fā)的同學(xué)來說。因?yàn)橐苿佣爽F(xiàn)在主流的適配方案之一就是采用視窗單位來處理的。但很多同學(xué)所知道的視窗單位應(yīng)該只是 vwvhvminvmax498e5b4bb073df895dc733bf8a312f01.webp

          視窗單位給移動端開發(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í)忽略了它的部分用戶界面。

          1c9c855e772d9a9c4d6382679f5401a9.webp

          如果你對 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)系的新單位:35367b3176aebd9a01f568da515c4067.webp

          • 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 新增的 lhrlh 吧。

          049ec4b9f2ba664191de5a2fceed44d7.webp

          簡單地回憶一下 CSS 中另一對單位:emrem 。稍微了解 CSS 的同學(xué)都知道:- em 是相對于元素自已的 font-size 值計(jì)算(除元素自身的 font-size 取值為em時(shí),元素自身的 font-size 值單位為 em時(shí),其相對于其父元素的font-size值計(jì)算) - rem 是相對于HTML文檔的根元素的 font-size 值計(jì)算,文檔的根元素一般是指 元素

          這兩個(gè)新增的 lhrlhemrem 非常的相似,只不過他們相對的是 line-height 的值計(jì)算:- lh 相對于元素自己的 line-height 計(jì)算 - rlh 相對于文檔根元素( )的 line-height 計(jì)算

          你肯定會問,這樣的單位有何用處呢?我想大家在還原 UI 設(shè)計(jì)稿的時(shí)候,肯定碰到了因?yàn)樽煮w不同以及 line-height 值不同,讓元素在視覺上看上去總是對不齊。那么,有了 lhrlh 之后,事情會變得好一點(diǎn)。比如下圖這樣的場景:a62579ee99bf241d29c66b423eaf6600.webp

          以前上圖這樣的標(biāo)記,常把寬高設(shè)置為 1em ,那么現(xiàn)在可以設(shè)置 1lh

          ::marker?{
          ????width:?1lh;
          ????height:?1lh;
          }

          到目前為止,僅 Safari TP 105 聲稱支持這兩個(gè)相對單位 lhrlh 。前面提到 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%
          • cqmincqicqb 中較小的那個(gè)(也可以是 cqwcqh 中較小的那個(gè))
          • cqmaxcqicqb 中較大的那個(gè)(也可以是 cqwcqh 中較大的那個(gè))

          早其容器查詢的單位定義的是 c*(比如,cwchcmincmax )之類的,但其中有些單位會和 ch 單位產(chǎn)生沖突,因此,最終確定的容器查詢單位是以 cq* 開始的。也就是上面所列的幾個(gè)!

          正如 @Miriam Suzanne(最初提出建議的人,也是規(guī)范的編輯)所分享的,這些 CSS 單位是Chromium中實(shí)驗(yàn)性容器查詢支持的一部分。c5d163e45214786f1f06c6c469620481.webp

          更為有趣的是,@Ahmad Shadeed 在他的文章《CSS Container Query Units》一文中提出 qwqhqminqmax 以及他們對應(yīng)的邏輯屬性的單位qiqb

          efce5ebcc3a2f788a285fef0edb935fb.webp

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

          5b4a4380b596705a0b863eddfbbbc412.webp

          過度滾動行為: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 控制滾動條樣式是使用瀏覽器的一些私有屬性來搞定:abc24bf31f0d808220bfea518908704c.webp

          就在 2021 年 12 月 09日,W3C 發(fā)布了的 CSS Scrollbars Styling Module Level 1 規(guī)范,該規(guī)范提供了 scrollbar-colorscrollbar-width 兩個(gè)屬性,用來給滾動條設(shè)置樣式。以后,我們要以使用它們來輕易完成滾動條樣式的定制:

          .section?{????scrollbar-color:?#6969dd?#e0e0e0;????scrollbar-width:?thin;}
          1993fc76dce3079886c0e23dce1a61b7.webp

          我想大家都知道,使用 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í)的效果:

          4027261b108a6722a76556d9816ee985.webp

          如果你對美化滾動條以及 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

          fb1b722e44671b7969217fb75167fa87.webp

          就 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

          為此,最早定義的 subgridgridinline-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-columnsgrid-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;?}
          bd5865a8d416ed675d8f4b547e8cd2bc.webp

          正如上圖所示,這就是subgrid的作用:通過設(shè)置grid-template-columnsgrid-template-rowssubgrid,它將與父網(wǎng)格對齊。真正的子網(wǎng)格可以使用父網(wǎng)格的相關(guān)參數(shù)。簡單地說,使用該特性,可以輕易實(shí)現(xiàn)像下圖這樣的卡片布局:1dc24be7076fe5a17aba22e326612426.webp

          還有一段時(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 容易地多。8aa3c9a3d50754e0bde3ba0173db86f8.webp

          從 @Jen Simmons 發(fā)的推特消息中可以獲知,Safari 14.1 開始也支持 Flexbox 中的 gap 屬性。我自測了一下,Grid中的 gap 也得到支持了。也不是說,現(xiàn)在主流瀏覽器都已支持 gap 屬性了:c221b122f4060bb0191ca27774f62f9a.webp

          accent-color

          Web 中有很多控件的 UI 效果是跟隨系統(tǒng)走的。比如表單中的一些控件,比如常用的輸入框()、單選按鈕,復(fù)選框,進(jìn)度條等。63388e1c760001a052f88af30675b57d.webp

          以往,為了在 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%);?????}}
          9caf7ab45c6c5372f7e65fdd963555a5.webp

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

          inputmode 可以喚起不同類型的軟鍵盤,另一個(gè)改善用戶體驗(yàn)的是給 元素的 enterkeyhint 屬性設(shè)置不同的值,可以改變軟鍵中的 Enter 鍵的類型的操作行為:

          69c1b3c13c8d1e7a3235fc9a196cec59.webp

          上面提到的,不管是 CSS 還是 HTML 的屬性,都是用來改變用戶體驗(yàn)的。再提一個(gè)和 HTML相關(guān)的屬性。

          自Safari 15 開始,我們在 HTML 的 標(biāo)簽為 theme-color 設(shè)置顏色,讓瀏覽器自身的 UI 顏色有讓開發(fā)者來控制:8798ef1af01a9e5df184fdd45f060cde.webp

          特別聲明,這里的 theme-color 不是 CSS 屬性,他是 HTML 的 元素的 name 的一個(gè)值,結(jié)合 contentmedia 能輕易控制系統(tǒng)級的顏色。

          似乎跑題了!我們要聊的是 2022 年的 CSS !嗯!那我們繼續(xù)回到 CSS 的世界中來。

          媒體查詢

          f7cd03908b2e68989be6b045225dbdc1.webp

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

          72136d8a900815ea076d183238a723d2.webp

          以往在 @media 或者在 @container 規(guī)則中寫判斷條件時(shí)使用 min-widthmax-width 較多,不知道大家是否和我一樣有這樣的感覺,使用 min-widthmax-width 很多時(shí)候傻傻分不清楚他們的范圍。為此,我總是喜歡使用下圖來做判斷:c5a0f8e64de6c8b54a579c5810835886.webp

          自 CSS Media Queries Level 4 開始,我們可以使用較為熟悉的數(shù)學(xué)表達(dá)式了,在媒體條件中使用 >>=<<= 等數(shù)學(xué)表達(dá)式:742509994e959f5f41049d7b098447da.webp

          上圖中使用 @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

          6212c39274568edcf2b13375770039c7.webp

          F-mods 是 Font Metrics Override Descriptors(字體度量覆蓋描述符)的簡稱。它對應(yīng)著 CSS Fonts Module Level 4 規(guī)范中的 @font-face 部分的第十一小節(jié),即 默認(rèn)的字體度量覆蓋。簡單地說,在 @font-face 規(guī)則中新增了 ascent-overridedescent-overrideline-gap-overrideadvance-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-overridedescent-overrideline-gap-override 屬性目前已在 Chromium 87+ 和 Firefox 89+ 中實(shí)現(xiàn)!

          這四個(gè)描述符的組合可以讓我們告訴瀏覽器在下載 Web Fonts 之前字符占用多少空間,來覆蓋回退字體(系統(tǒng)字體)的布局,使其與 Web Fonts 相匹配。簡單地說:這四個(gè)描述符可以讓你的系統(tǒng)字體更接近 Web Fonts!其中 ascent-overridedescent-overrideline-gap-override 描述符使我們 能夠完全消除垂直布局的偏移,因?yàn)檫@三個(gè)描述符都會影響行高。在 CSS Fonts Module Level 5 規(guī)范中又為 @font-face 規(guī)則添加了幾個(gè)新屬性。比如,用來覆蓋字體上標(biāo)(sup)和下標(biāo)(sub)的 superscript-position-overridesubscript-position-overridesuperscript-size-overridesubscript-size-override 描述符。雖然這幾個(gè)屬性還沒有得到任何瀏覽器的支持,但對于 Web 開發(fā)者而言,這是希望。

          除此之外,還新增了 size-adjust 描述符,它允許我們調(diào)整字形的比例系數(shù)(百分比)。該描述符取代了前面提到的 advance-override描述符。正如 @Addy Osmani在他自己推特上,是這樣描述 size-adjust4c6348444e65357b7402d0a935121f40.webp

          size-adjust 已經(jīng)得到了 Chromium 92+ 和 Firefox 89+ 的支持。

          說到 @font-face 那就有必要提到大家也一直期待的另一個(gè) CSS 特性,那就是 leading-trim1ba301a5c96d74d0c2dcfee77a80130f.webp

          leading-trim 其主要作用就是用來改變文本布局。

          在鉛印刷術(shù)中,為了讓鉛字塊(排成行)之間有一定的間距,排字工人會在行與行之間墊一些鉛條,讓閱讀變得更舒服一些。在那個(gè)時(shí)代,鍋條一般都放置在鉛塊下方。同樣的,在Web排版上也有鉛條的身影,只不過他分面上下兩個(gè)部分。在CSS中引入該特性,它的工作原理就像一個(gè)文本框剪切刀。去掉文本框上下之間多余的空間(這個(gè)空間其實(shí)就是鉛條高度的一半):bfc7f9c388edab2cda1db0805a4f9474.webp

          h1?{?????text-edge:?cap?alphabetic;?????leading-trim:?both;?}
          6b2bda33c7f151d6629a5716fb637c84.webp

          示例中用到了text-edge 屬性,簡單地用下圖來描述其作用:77e6d5e425564e69e1a64448d07738f3.webp

          開發(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

          6ef67e96d95c8b8fe164afe841a96aaf.webp

          這個(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 的嵌套

          e1fb3be2f362a02a98911993ba1abf40.webp

          上圖看上去很熟,對吧!但它不是 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

          b98221940cb2235595058c07677fda79.webp

          CSS Cascading and Inheritance Level 5 中引入了 @layer 規(guī)則,將在 Level 6 中會引入另一個(gè)規(guī)則 @scope 。這是一種將樣式范圍擴(kuò)大到DOM樹的一種用法。


          "dark-theme">
          ????"#">plum
          ????"light-theme">
          ????????"#">also?plum???
          ????



          /*?當(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

          fb07525a3ed1fbf91fce7729a6b7e7a4.webp

          @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è)置圓角:

          1c4d5194a786680b54e180e768b8c052.webp

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

          e0b1d736daddc1067c1371d3035c7009.webp

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

          滾動與動畫

          b568538a44512b141ccfea9a72cd2f54.webp

          這里所說的滾動與動畫指 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

          39c525967a94a2c594ffc7d2f96be09d.webp

          @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 變量的類型、初始值,是否可繼承:b2d63ff1f4ad3b2a044555589b23e424.webp

          雖然它的使用方式和 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é)合起來,可做的事情更多:4030b41e75330e51922f849ecdae58cf.webp

          更多這方向的效果可以在 houdini.how 網(wǎng)站上查閱:

          1a0a636f75ded2709075e78f9f683916.webp

          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

          瀑布流布局

          ceecfbd2e01bba32d857648767195067.webp

          瀑布流是 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));?
          }
          fc1520ac8d5314b8b32c731f21031f31.webp

          但一直以來他還只是 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)域!謝謝!(^_^)

          瀏覽 99
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  家庭乱伦毛片 | 在线欧美一区 | 伊人大鸡吧网 | 国内成人做爱视频播放 | 在线观看的成人黄色视频 |