2022年的新CSS功能 — Smashing

banq發表於2022-03-04

2022 年對於 CSS 來說將是非常棒的一年,大量的新功能即將出現。有些已經開始登陸瀏覽器,有些可能會在 2022 年獲得廣泛的瀏覽器支援。
 

container查詢
要實現容器查詢,我們需要指定一個元素作為我們的容器,使用容器屬性(容器型別和容器名稱的簡寫)。
容器型別可以是寬度、高度、inline-size或block-size。inline-size和block-size是邏輯屬性,根據文件的書寫模式可能產生不同的結果。

假設有一容器:

main, aside {
    container: inline-size;
}


然後我們就可以以類似於媒體查詢的方式使用@container ,當容器寬於30rem時,我們使用flexbox切換到水平佈局。

@container (inline-size > 30em) {
    .card {
        display: flex;
    }
}


注意在括號內可以用不同的方式來表達這個規則(inline-size > 30em而不是min-width: 30em)。
這是媒體查詢第4級規範的一部分。

CSS Containment Level 3 規範目前處於工作草案中,這意味著語法可能隨時改變——事實上,自從去年發表了一些關於容器查詢的文章以來,它已經改變了。此處的示例與撰寫本文時建議的語法一致。
Chrome 聲稱支援標誌後面的容器查詢,但工作實現似乎與當前規範不一致。有一個 polyfill,但它不適用於最新的語法。所以簡短的回答是“不”,我肯定會敦促你在生產中使用它們之前等待一段時間。但是容器查詢背後有很多動力,所以我希望很快會有更多的普遍支援。
 

:has() 
為含有<h2>的<section>元素設計樣式:

section:has(h2) {
    background: lightgray;
}


要為<img>設計樣式,只有當它的父<section>也包含<h2>時:

section:has(h2) img {
    border: 5px solid lime;
}


尚無主流瀏覽器支援,但您可以在Safari Technology Preview中盡情發揮。在支援的瀏覽器中檢視這個演示。
 

@when/@else
CSS 中的條件規則,類似於其他程式語言中的 if/else 邏輯。例如,它可以使編寫複雜的媒體查詢更加合乎邏輯。
選擇@when而不是@if語句是避免與 Sass 衝突。

我們可以查詢多個媒體條件或支援的功能,例如使用者的視口是否超過某個寬度,以及他們的瀏覽器是否支援子網格。當使用@when/@else時,我們把查詢規則中的@去掉:

@when media(min-width: 30em) and supports(display: subgrid) {
    /* Styles for viewports over 30em, where the browser also supports subgrid */
} @else {
    /* Styles for browsers that do not meet the condition */
}
還沒有。這是非常早期的事情,而且仍在討論中。我不期望瀏覽器的支援在今年被廣泛推廣,但這絕對是一個值得關注的問題。
 

accent-color
想想核取方塊、單選按鈕、範圍輸入和進度條,所有瀏覽器都以略微不同的風格方式呈現它們,accent-color屬性可以快速輕鬆地將我們的品牌顏色推廣到某些表單輸入。accent-color使我們能夠保留瀏覽器的預設輸入,但應用顏色以適合我們的品牌。
使用方法很簡單,而且該屬性是繼承的,所以你可以在根層設定它,以便在所有地方應用它。

:root {
    accent-color: lime;
}

form {
    accent-color: lime;
}

input[type="checkbox"] {
    accent-color: hotpink;
}



是的!accent-color在 Chrome、Edge、Firefox 和 Safari 技術預覽版中受支援。不支援它的瀏覽器將簡單地獲得預設顏色,並且輸入將保持完全可用 - 非常適合漸進增強。
 

新的 CSS 顏色函式
您可能已經熟悉 Hex、RGB 和 HSL 顏色格式。CSS Color Module Levels 45包括一整套新的顏色函式,使我們能夠以前所未有的方式在 CSS 中指定和操作顏色。它們包括:

  • hwb():色相、白度、黑度。
  • lab():亮度以及決定色調的 a和b值。
  • lch():亮度、色度、色調。
  • color-mix():將兩種顏色混合在一起。
  • color-contrast():從顏色列表中,輸出與第一個引數相比對比度最高的顏色。
  • color():指定不同顏色空間中的顏色(例如display-p3)。

還有相對顏色語法,它可以讓我們獲取一種顏色並對其進行調整以製作另一種顏色。

hwb()、lab()和lch()的使用方式與我們所習慣的rgb()和hsl()函式的使用方式基本相同,都有一個可選的alpha引數:

.my-element {
  background-color: lch(80% 100 50); // opaque color
}

.my-element {
  background-color: lch(80% 100 50 / 0.5); // color with 50% transparency
}



Safari目前在瀏覽器支援方面處於領先地位,從15版開始就支援hwb()、lch()、lab()和color()。color-mix()和color-contrast()可以透過一個標誌啟用。火狐瀏覽器支援hwb(),也有對color-mix()和color-contrast()的標記支援。令人驚訝的例外是Chrome,它現在不支援任何這些。
 

級聯層 
級聯層給了我們更多的權力來管理CSS的 "級聯 "部分。目前,有幾個因素決定了哪些樣式會被應用到你的CSS程式碼中,包括選擇器的特殊性和外觀順序。
級聯層允許我們有效地將我們的CSS分成幾塊(或 "層",如果你願意的話):
在順序較低的層中的程式碼將優先於較高層中的程式碼,即使較高層中的選擇器具有較高的特異性。
我喜歡把它看成是一種類似於級聯的z-index。如果你理解了z-index的工作原理,你可能會很快掌握級聯層的情況。

正如Bramus在他的教程中解釋的那樣,你可以建立與ITCSS方法一致的級聯層:

/* Create the layers, in the desired order */
@layer reset, base, theme;

/* Append the CSS to each of the layers */
@layer reset {
  /* Append to 'reset' layer */
}

@layer base {
  /* Append to 'base' layer */
  h1.title {
      font-size: 5rem;
  }
}

@layer theme {
  /* Append to 'theme' layer */
  h1 {
      font-size: 3rem;
  }
}


最新版本的火狐瀏覽器支援層疊式圖層,在Chrome和Edge中可以透過一個標誌啟用(Chrome將在99版中全面支援)。看起來所有的主要瀏覽器都在加入這一規範,所以預計很快會有更廣泛的支援。
 

Subgrid
幾年前,當CSS網格首次被討論時,許多開發者認為它可以使我們在一個單一的網格上佈置UI的每個部分,就像我們從設計師那裡得到的典型的12列布局一樣。在實踐中,這將涉及到完全扁平化你的標記,破壞語義--不建議這樣做!。
作為CSS Grid Layout Module 2規範的一部分,subgrid使一個元素能夠繼承其父元素的網格,無論是在行軸還是列軸上。
理論上,你可以一路巢狀網格,將每個元件都對準同一個網格。在現實中,我們可能不需要像我們想象的那樣經常這樣做,因為我們(希望)接受更靈活、更內在的網頁設計,優先考慮內容、使用者體驗和可訪問性,而不是僵硬地遵守網格。但是subgrid對於解決各種UI挑戰仍然是非常有用的。
 
使用Grid的常規屬性指定父元素的網格。在你想繼承父網格的巢狀項上的grid-template-columns或grid-template-rows屬性中使用關鍵字subgrid。

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(2, auto);
}

.grid > figure {
    display: grid;
    grid-template-rows: subgrid;
}

.grid figcaption {
    grid-row: 2;
}


值得注意的是,自2019年以來,subgrid已經在火狐瀏覽器中得到支援,然而近三年來,沒有其他瀏覽器跟進。有跡象表明,Chromium團隊終於開始實施它了,所以我們可能會幸運地看到它在今年登陸Chrome和Edge。 

滾動時間軸
你可能已經看到了很多很酷的網站,它們實現了花哨的滾動連結動畫。
 想象一下,如果我們能在CSS中實現所有這些功能呢?有了@scroll-timeline,我們就可以做到了:

  1. 一個關鍵幀keyframe的動畫。
  2. @scroll-timeline 。
  3. 我們要做動畫的元素上的animation-timeline屬性(或者在簡明的animation屬性中指定時間線)。



/* Set up keyframe animation */
@keyframes slide {
    to { transform: translateX(calc(100vw - 2rem)); }
}

/* Configure our scroll timeline. Here we're giving it the name `slide-timeline` */
@scroll-timeline slide-timeline {
  source: auto; /* the scrollable element that triggers the scroll-linked animation (the document by default) */
  orientation: vertical; /* the scroll orientation (vertical by default) */
  scroll-offsets: 0%, 100%; /* an array of progress intervals in which the timeline is active */
}

/* Specify the keyframe animation and the scroll timeline */
.animated-element {
  animation: 1s linear forwards slide slide-timeline;
}

我們也可以使用基於元素的偏移量的scroll-offsets屬性,在某一特定元素滾動進入檢視時觸發時間線。

 
@scroll-timeline slide-timeline {
    scroll-offsets: selector(element) end 0, selector(element) start 1;
}

如果你對@scroll-timeline感興趣,可以在Chrome瀏覽器中用一個標誌啟用它。該規範還處於編輯草案階段,所以在獲得推薦狀態之前,很有可能會發生變化。 

Nesting巢狀
如果你熟悉Sass,你會知道能夠巢狀選擇器的便利性--本質上,在父級規則中寫一個子規則。巢狀可以幫助我們保持程式碼的條理性--儘管如果過度使用,有時會成為一種障礙 現在看來,巢狀終於要進入本地CSS了。

在語法上,它與Sass相似,所以不應該感覺到太多的跳躍。這裡的巢狀規則針對的是一個類別為card的元素中的h2。
 

.card {
    color: red;

    & h2 {
        color: blue;
    }
}


不是原生的。目前還沒有瀏覽器支援它。
 

相關文章