CSS倒反天罡居然支持if()函数了

这篇文章发布于 2025年07月25日,星期五,17:52,归类于 CSS相关。 阅读 271 次, 今日 69 次 2 条评论

 

CSS if()函数占位图封面图

一、CSS真逻辑函数

CSS之前也支持类逻辑函数,例如数学函数中的min()max(),本质上也是有逻辑的,例如:max(300px, 100vw),表示:

  • 如果100vw的计算宽度大于300px,则最终尺寸300px
  • 否则是100vw的宽度。

现在,CSS支持 if() 函数了,这个是真正意义上的逻辑函数了。

目前,if() 支持三种不同类型的查询:

  • style():样式查询
  • media():媒体查询
  • supports():支持查询

其中,media()supports()查询平时我们使用的机会不多,原因很简单,因为有兼容性更好的传统实现方法。例如,下面的CSS代码片段作用是一样的:

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

@media (any-pointer: fine) {
  button {
    width: 30px;
  }
}

但是后者的兼容性更好,可读性也更好,在目前这个阶段,肯定是优先使用后面的方法。

supports()查询也是类似的:

select {
  opacity: if (
    supports(appearance: base-select): 1; else: 0;
  );
}

等同于:

@supports not (appearance: base-select) {
  select {
    opacity: 0;
  }
}

注意,关键字 else 是在 if() 函数里面的。

但是 style() 样式查询目前仅在if()函数中才有,因此,这个函数才是我们需要重点学习的。

二、style()与CSS变量匹配

style() 样式查询只能查询CSS变量,普通CSS属性是不支持的。

我们来看一个案例,了解下是如何使用的,想了下,昨天用到的一个CSS Sprites定位非常使用此效果。

下图所示的就是素材:

Sprites原图

在过去,我们可能需要对4个元素使用不同的选择器进行处理,现在,可以一把hold住了。

相关代码如下所示:

<label class="label" style="--type: 1">阅篇专家</label>
<label class="label" style="--type: 2">万字周报大师</label>
<label class="label" style="--type: 3">互动急先锋</label>
<label class="label" style="--type: 4">佳作分享达人</label>

此时,只需要一段CSS规则就可以实现所有图标的样式效果了:

.label {
  display: inline-block;
  font-size: 0;
  width: if(
    style(--type: 1): 80px;
    style(--type: 3): 96px;
    else: 112px;
  );
  height: 26px;
  background: url(sprite.png) no-repeat 0 0 / 116px auto;
  background-position-y: if(
    style(--type: 2): -34px;
    style(--type: 3): -68px;
    style(--type: 4): -102px;
    else: 0px;
  );
}

渲染效果如下图所示:

实际渲染结果截图

是不是比过去的代码更加简约了。

三、最大的阻碍兼容性

if()函数虽然很屌很帅气,但是兼容性还不行,目前仅Chrome 137+浏览器支持。

if()函数的兼容性

另外,if()函数式支持嵌套的:

color: if(
  style(--scheme: ice):
    if(
      media(prefers-color-scheme: dark): #caf0f8;
      else: #03045e;
    );
  style(--scheme: fire):
    if(
      media(prefers-color-scheme: dark): #ffc971;
      else: #621708;
    );
  else: black
);

其他就没什么了,静待浏览器全面支持吧。

感谢阅读,欢迎转发!

😉😊😇
🥰😍😘

(本篇完)

分享到:


发表评论(目前2 条评论)

  1. zhangxinxu说道:

    期待浏览器支持的那一天,兼评论功能测试