博客 / 詳情

返回

2025年CSS新特性大盤點

大家好,我是 Immerse,一名獨立開發者、內容創作者、AGI 實踐者。

關注公眾號:沉浸式趣談,獲取最新文章(更多內容只在公眾號更新)

個人網站:https://yaolifeng.com 也同步更新。

轉載請在文章開頭註明出處和版權信息。

我會在這裏分享關於編程獨立開發AI乾貨開源個人思考等內容。

如果本文對您有所幫助,歡迎動動小手指一鍵三連(點贊評論轉發),給我一些支持和鼓勵,謝謝!


2025年了,CSS又進化了

去年寫過一篇 CSS 新特性盤點,本來以為今年不會有太大變化。結果一看,新東西比去年還多。

這次整理了幾個我覺得特別實用的功能,瀏覽器支持也都不錯,可以用起來了。

終於可以動畫到 auto 了

之前我們做高度展開動畫,基本都是靠 max-height 硬撐。

比如從 0 展開到實際高度,只能寫個超大的值,體驗很差。

現在可以直接動畫到 auto 了:

html {
  interpolate-size: allow-keywords;
}

加上這一行,所有 height: 0 到 height: auto 的過渡都能生效。

或者你也可以用 calc-size() 函數,不需要全局設置:

.content {
  height: 3lh;
  overflow: hidden;
  transition: height 0.2s;

  &.expanded {
    height: calc-size(auto, size);
  }
}

這個功能總算來了。

而且不只是 height,任何接受尺寸的屬性都能用,不只是 auto,min-content 這些關鍵字也行。

目前 Chrome 已經支持,其他瀏覽器應該也快了。

Popover 和 Invoker

Popover 是個 HTML 屬性,給任意元素加上就有開關功能。

配合 Invoker 用起來更爽,不用寫 JavaScript 就能控制彈窗。

<button commandfor="menu" command="toggle">
  打開菜單
</button>

<div id="menu" popover>
  菜單內容
</div>

這樣就夠了,按鈕點擊自動控制彈窗顯示隱藏。

瀏覽器會自動處理無障礙訪問、鍵盤操作、焦點管理這些細節。

而且還能配合 Anchor Positioning 用,讓彈窗自動定位到觸發元素旁邊。

Popover 已經全瀏覽器支持,Invoker 目前只有 Chrome,不過有 polyfill 可以用。

CSS 裏可以寫函數了

CSS 有 calc()、clamp() 這些內置函數,現在我們可以自己寫了:

@function --titleBuilder(--name) {
  result: var(--name) " is cool.";
}

然後就能在任何地方調用:

.title::after {
  content: --titleBuilder("CSS");
}

這個功能讓 CSS 更像編程語言了。

把複雜邏輯封裝到函數裏,代碼更清爽,也更好維護。

不過目前只有 Chrome 支持,可以先用着,不支持的瀏覽器會回退到默認值。

if() 函數也來了

CSS 本來就有很多條件邏輯,比如選擇器匹配、媒體查詢。

但這次的 if() 函數是第一個專門做條件分支的:

.grid {
  display: grid;
  grid-template-columns:
    if(
      media(max-width > 300px): repeat(2, 1fr);
      media(max-width > 600px): repeat(3, 1fr);
      media(max-width > 900px): repeat(auto-fit, minmax(250px, 1fr));
      else: 1fr;
    );
}

看起來像不像 switch 語句?第一個匹配的條件會生效。

條件可以是 media()、supports()、style() 這幾種。

把所有邏輯都寫在一個屬性裏,代碼可讀性好很多。

目前 Chrome 獨佔,其他瀏覽器還在路上。

表單輸入框自動調整大小

field-sizing 這個屬性專門解決表單輸入框的問題。

textarea {
  field-sizing: content;
}

加上這一行,textarea 會自動根據內容調整高度。

用户輸入多少內容,輸入框就有多高,不用手動拖拽了。

在手機上體驗特別好,拖拽調整大小本來就很難操作。

這個功能之前都是用 JavaScript 實現,現在 CSS 原生支持了。

Chrome 和 Safari 都能用,Firefox 估計也快了。

select 下拉框終於能自定義樣式了

select 元素的外觀一直很難自定義,打開後顯示的選項更是完全沒法控制。

現在可以完全自定義了,只要先開啓:

select,
::picker(select) {
  appearance: base-select;
}

然後想怎麼改就怎麼改,選項的樣式、佈局、動畫都能控制。

目前 Chrome 獨佔,不過不支持的瀏覽器會回退到原生樣式,完全不影響使用。

text-wrap 讓排版更好看

text-wrap: balance 可以讓每行文字長度儘量接近:

h1 {
  text-wrap: balance;
}

用在標題上效果特別好,不會出現最後一行只有一個詞的情況。

還有個 text-wrap: pretty,專門優化正文排版:

p {
  text-wrap: pretty;
}

瀏覽器會自動調整斷行,避免孤詞,讓文字看起來更舒服。

balance 已經全瀏覽器支持,pretty 在 Chrome 和 Safari 能用。

這種優化對用户體驗很重要,而且完全不影響功能,可以直接加上。

linear() 實現複雜緩動效果

CSS 的 linear 關鍵字之前就是勻速動畫,很無聊。

但 linear() 函數可以實現超複雜的緩動,比如彈跳效果:

.bounce {
  animation-timing-function: linear(
    0, 0.004, 0.016, 0.035, 0.063, 0.098, 0.141 13.6%, 0.25, 0.391, 0.563, 0.765,
    1, 0.891 40.9%, 0.848, 0.813, 0.785, 0.766, 0.754, 0.75, 0.754, 0.766, 0.785,
    0.813, 0.848, 0.891 68.2%, 1 72.7%, 0.973, 0.953, 0.941, 0.938, 0.941, 0.953,
    0.973, 1, 0.988, 0.984, 0.988, 1
  );
}

這種效果用 cubic-bezier() 根本做不出來。

而且已經全瀏覽器支持了,可以放心用。

有在線工具可以生成這些值,不用自己手寫。

shape() 函數畫任意圖形

CSS 之前有 path() 函數,但語法很難寫,而且只能用像素。

shape() 是專門為 CSS 設計的,支持所有單位和自定義屬性:

.arrow {
  clip-path: shape(
    evenodd from 97.788201% 41.50201%,
    line by -30.839077% -41.50201%,
    curve by -10.419412% 0% with -2.841275% -3.823154% / -7.578137% -3.823154%,
    smooth by 0% 14.020119% with -2.841275% 10.196965%,
    close
  );
}

可以用在 clip-path 裁剪元素,也能用在 offset-path 做路徑動畫。

而且可以響應式調整,配合媒體查詢和容器查詢都沒問題。

Chrome 和 Safari 已經支持,Firefox 也在開發中。

attr() 變強了

之前 attr() 只能取字符串,現在可以指定類型了:

<div data-count="42" data-color="#ff0000">
div {
  --count: attr(data-count type(<number>));
  --color: attr(data-color type(<color>));
}

這樣可以直接把 HTML 屬性當數字或顏色用,方便多了。

目前 Chrome 獨佔,不過對於不支持的瀏覽器,可以設置回退值。

reading-flow 解決 Tab 順序問題

用 Grid 或 Flexbox 重新排列元素後,Tab 鍵的焦點順序會亂。

現在可以用 reading-flow 告訴瀏覽器按照視覺順序來:

.grid {
  reading-flow: grid-rows;
}

這樣焦點就會按照 Grid 的行順序移動,不會亂跳了。

Flexbox 用 flex-flow,其他佈局也有對應的值。

這個功能對無障礙訪問很重要,不過目前只有 Chrome 支持。

等其他瀏覽器跟進之前,最好不要大量重排佈局。

值得期待的功能

還有一些功能在開發中,但還沒正式發佈:

Masonry 佈局雖然各瀏覽器實現不同,但在穩步推進。

Safari 的 random() 函數可以生成隨機數,玩起來很有意思。

margin-trim 可以自動去掉容器邊緣元素的外邊距,Safari 獨佔中。

sibling-index() 和 sibling-count() 函數在 Chrome 能用,做交錯動畫很方便。

View Transitions 的 match-element 不用給每個元素起名字了,而且 Firefox 也在開發中。

還有很多其他功能在路上。

別忘了這些已經能用的

Container Queries 和 :has() 這些去年的新功能,現在已經全瀏覽器支持。

View Transitions、Anchor Positioning、Scroll-Driven Animations 也都在 Safari 上線了。

dvh 這些視口單位也成為標準了。

CSS 現在能做的事情越來越多,寫起來也越來越順手。

參考:https://frontendmasters.com/blog/what-you-need-to-know-about-...

其他好文推薦

2025 最新!獨立開發者窮鬼套餐

Windows 安裝 Claude Code 的新姿勢,保姆級教程

Claude Code 從入門到精通:最全配置指南和工具推薦

Claude Code 終極配置指南:一行命令搞定各種配置

一個配置文件搞定!Claude Code 多模型智能切換

這個 361k Star 的項目,一定要收藏!

搞定 XLSX 預覽?別瞎找了,這幾個庫(尤其最後一個)真香!

【完整彙總】近 5 年 JavaScript 新特性完整總覽

關於 Node,一定要學這個 10+萬 Star 項目!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.