Skip to content

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

点击上方 程序员成长指北,关注公众号

回复 1,加入高级 Node 交流群

多年来,我们一直依赖各种变通方式:用 JavaScript 切换 class、用 CSS 预处理器写 mixin,或者写满屏的媒体查询。if() 函数终结了这些做法,它把条件逻辑直接带进了 CSS —— 优雅、高性能且完全声明式。

如何工作:

property: if(
  condition-1: value-1;
  condition-2: value-2;
  condition-3: value-3;
  else: default-value
);

该函数会按顺序检查条件,应用第一个匹配的值。如果没有匹配项,则使用 else 的值——完全符合编程语言的直觉,只是现在是在纯 CSS 中实现。

if() 函数的三大能力

1. Style Queries

通过 style(),你可以根据 CSS 自定义属性变化做出响应:

.card {
  --status: attr(data-status type(<custom-ident>));

  border-color: if(
    style(--status: pending): royalblue;
    style(--status: complete): seagreen;
    style(--status: error): crimson;
    else: gray
  );
}

一个 HTML 中的 data-status 属性现在就能控制整套样式 —— 不再需要 utility class!

2. Media Queries

忘掉那些层层嵌套的媒体查询吧。通过 media(),你可以在行内定义响应式值:

h1 {
  font-size: if(
    media(width >= 1200px): 3rem;
    media(width >= 768px): 2.5rem;
    media(width >= 480px): 2rem;
    else: 1.75rem
  );
}

3. Feature Detection

告别随机 fallback 和 “希望它能正常工作” 的时代 😬。有了 supports(),你可以在属性内直接检查浏览器特性:

.element {
  border-color: if(
    supports(color: lch(0 0 0)): lch(50% 100 150);
    supports(color: lab(0 0 0)): lab(50 100 -50);
    else: rgb(200, 100, 50)
  );
}

真实应用场景

三行实现暗色模式

body {
  --theme: "dark"; /* 可通过 JavaScript 或用户偏好切换 */

  background: if(
    style(--theme: "dark"): #1a1a1a;
    else: white
  );

  color: if(
    style(--theme: "dark"): #e4e4e4;
    else: #333
  );
}

设计系统中的状态组件

.alert {
  --type: attr(data-type type(<custom-ident>));

  background: if(
    style(--type: success): #d4edda;
    style(--type: warning): #fff3cd;
    style(--type: danger): #f8d7da;
    style(--type: info): #d1ecf1;
    else: #f8f9fa
  );

  border-left: 4px solid if(
    style(--type: success): #28a745;
    style(--type: warning): #ffc107;
    style(--type: danger): #dc3545;
    style(--type: info): #17a2b8;
    else: #6c757d
  );
}

无需媒体查询混乱的容器布局

.container {
  width: if(
    media(width >= 1400px): 1320px;
    media(width >= 1200px): 1140px;
    media(width >= 992px): 960px;
    media(width >= 768px): 720px;
    media(width >= 576px): 540px;
    else: 100%
  );

  padding-inline: if(
    media(width >= 768px): 2rem;
    else: 1rem
  );
}

与现代 CSS 特性的组合 🤔

.element {
  /* 与新的 light-dark() 配合使用 */
  color: if(
    style(--high-contrast: true): black;
    else: light-dark(#333, #e4e4e4)
  );

  /* 与 CSS Custom Functions (@function) 配合使用 */
  padding: if(
    style(--spacing: loose): --spacing-function(2);
    style(--spacing: tight): --spacing-function(0.5);
    else: --spacing-function(1)
  );
}

浏览器支持情况

截至 2025 年 8 月:

  • ✅ Chrome/Edge:137+

  • ✅ Chrome Android:139+

  • ❌ Firefox:开发中

  • ❌ Safari:已在规划

  • ❌ Opera:暂不支持

在支持仍在扩张的情况下,你可以使用如下模式:

.button {
  /* 所有浏览器的 fallback */
  padding: 1rem 2rem;
  background: #007bff;

  /* 现代浏览器会自动覆盖 */
  padding: if(
    style(--size: small): 0.5rem 1rem;
    style(--size: large): 1.5rem 3rem;
    else: 1rem 2rem
  );

  background: if(
    style(--variant: primary): #007bff;
    style(--variant: success): #28a745;
    style(--variant: danger): #dc3545;
    else: #6c757d
  );
}

未来展望

CSS Working Group 已在研究下一步扩展:

  • 范围判断:if(style(--value > 100): ...)

  • 逻辑操作符:if(style(--a: true) and style(--b: false): ...)

  • 更深度的容器查询整合:更强的上下文感知能力

原文地址:https://medium.com/@karstenbiedermann/the-css-if-function-has-arrived-152115ab2115

原文作者: Karsten Biedermann

Node 社群

我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加考拉【ikoala520】 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波👍