2026年了,CSS 终于能写 if 了

说起来有点好笑。我们整天用 JavaScript 写 if (condition) { doSomething() },觉得理所当然,但回到 CSS 这边,一个"根据条件应用不同样式"的需求,折腾了十几年也没个正经解法。

早期靠"类名开关"------状态变了就增删 className,维护起来像打补丁。后来有了 CSS 变量,能稍微灵活一点,但真要判断个条件还是力不从心。于是一大批人转头投奔 Sass、Less,在预处理器里用 @if 过把瘾------但那是编译时的东西,运行时条件?不存在的。

2025 年 5 月,Chrome 137 稳定版发布,带上了 if() 函数。CSS 终于原生支持条件逻辑了。

基础语法

if() 函数的语法长这样:

css

css 复制代码
property: if(条件1: 值1; 条件2: 值2; else: 默认值);

目前支持三种条件类型:style()(基于 CSS 自定义属性判断)、media()(媒体查询)、supports()(特性检测)

看个最直观的例子。以前想根据某个状态变量切换背景色,得用类名配合样式覆盖。现在可以直接在属性里判断:

css

css 复制代码
.card {
  --status: attr(data-status type(<custom-ident>));
  background-color: if(
    style(--status: proposed): #e8f0fe;
    style(--status: assigned): #fef7e0;
    style(--status: complete): #e6f4ea;
    else: #f1f3f4
  );
}

配合 HTML 的 data-status="complete",背景色自动变化,不需要 JavaScript 插手。过去要在 CSS 里实现这种逻辑,要么预编译,要么写一堆冗余选择器,现在一句 if() 搞定。

内联媒体查询

另一个常见场景是响应式。以前写响应式,相关样式要散落在不同的 @media 代码块里,维护起来割裂感很强。if() 允许把媒体查询内联到属性声明中:

css

css 复制代码
button {
  aspect-ratio: 1;
  width: if(media(any-pointer: fine): 30px; else: 44px);
}

这段代码的意思是:在鼠标设备上按钮宽 30px,在触屏设备上(手指触摸目标需要更大尺寸)宽 44px。逻辑内聚,一眼就能看出这行样式在不同设备下的表现。

也可以把 if() 用在伪元素的内容上,根据浏览器特性支持显示不同提示:

css

less 复制代码
body::after {
  content: if(
    supports(color: oklch(0.7 0.185 232)): "你的浏览器支持 OKLCH";
    else: "你的浏览器不支持 OKLCH"
  );
}

真正的变革:运行时条件

预处理器里的 @if 和原生 if() 的核心区别在于:前者在编译时就固定了输出,后者在浏览器渲染时动态计算。

这意味着样式可以根据用户操作、设备状态、自定义属性的变化实时响应,且完全不需要 JavaScript 介入。这不仅仅是少写几行 JS 的事,它改变了 CSS 的思维模型------从"静态规则集"变成了"有逻辑表达能力"的样式语言。

社区对这个特性的反应挺有意思。有人在 InfoQ 的报道下吐槽语法"看起来像三目运算符裹了层糖衣"。也有人像 Theo Browne 说的那样,觉得"CSS 的未来从未如此光明"------尤其是在大型样式系统中,条件逻辑内聚在声明内部,比起传统方法里一个伪类放错位置就可能破坏 UI,风险低了不少

现实问题:浏览器兼容性

不过得泼盆冷水。

截至 2026 年 9 月,if() 函数基本只在 Chrome 137+ 可用,Firefox 和 Safari 的跟进还没明确时间表。这个局面和几年前 CSS 容器查询刚推出时很像------Chrome 先跑起来,其他浏览器慢慢追。

所以目前的生产项目,用之前得掂量一下用户画像。如果主要受众在用最新 Chrome(比如一些内部工具、技术演示类项目),可以大胆尝鲜。如果是面向大众的 C 端产品,稳妥起见还是加个 fallback:

css

css 复制代码
.card {
  background-color: #f1f3f4; /* 降级方案 */
  background-color: if(
    style(--status: complete): #e6f4ea;
    else: #f1f3f4
  );
}

不止 if(),CSS 逻辑能力在整体升级

if() 只是这一波 CSS "逻辑化"浪潮的一个缩影。@function 自定义函数允许定义可复用的计算逻辑,@starting-style 解决了元素首次渲染时过渡动画的"无中生有"问题@scope 让样式作用域有了原生控制手段

前端圈子这几年有个隐约的趋势:CSS 正在从"样式描述语言"往"更完整的样式逻辑语言"进化。预处理器曾经填补的空白,正在被原生能力一块块填回来。对开发者来说,这意味着更少的构建工具配置、更直接的调试体验,以及------某种意义上------CSS 终于被当作一门正经语言来设计了。

至于什么时候能在生产环境全面铺开?那得看 Safari 和 Firefox 的进度了。不过,先在个人项目或内部工具里玩起来,总归不亏。

相关推荐
Moriarty1236661 小时前
【前端技巧】实现卡片页面容器全屏
前端·css
大梦想家a3 小时前
基于 HTML+CSS 的个人生活主页设计与实现
css·html·生活
梦醒沉醉18 小时前
3、CSS入门——CSS选择器
css
Z兽兽1 天前
行内块元素在垂直方向上对齐问题
css·html·css3
小幸运2481 天前
Vue.js 在博客平台中为何采用响应式系统而非直接操作
css
dsyuan0011 天前
基于 Vue3 + ElementPlus 极简搭建仿钉钉流程设计器,简洁架构、极易扩展,纯div+css布局
css·架构·钉钉
bjzhang751 天前
使用HTML+CSS美化上传进度条展示
前端·css·html
YWL1 天前
CSS变量与预处理器
前端·css
吴长建先生重名了2 天前
用 MinIO 分布式存储模块一次讲清代码重构与整洁代码实
css