惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
腾讯CDC
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
博客园_首页
B
Blog RSS Feed
D
Docker
M
MIT News - Artificial intelligence
爱范儿
爱范儿
I
InfoQ

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
CSS倒反天罡居然支持if()函数了 « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2025-07-25 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11788
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

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() 样式查询也有对应的查询,不过这个查询是也是新特性。例如:

canvas {
  background-image: if(
    style(--scheme: ice): linear-gradient(aliceblue, white, skyblue);
    style(--scheme: fire): linear-gradient(lightyellow, white, yellow);
    else: none;
  );
}

类似于:

@container style(--scheme: ice) {
  canvas {
    linear-gradient(skyblue, white, #caf0f8);
  }
}
@container style(--scheme: fire) {
  canvas {
    linear-gradient(lightyellow, white, yellow);
  }
}

注意,上面的措辞是“类似于”,并未完全相等,如果--scheme: ice是写在<canvas>元素上,两者并不相同,需要在容器元素上。

假设有HTML如下:

<canvas style="--scheme: ice"></canvas>
<canvas style="--scheme: fire"></canvas>

则实时渲染效果如下:

由于if()函数中的style()查询更加具有不可替代性,因此,这个函数接下来我会重点讲述。

二、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
);

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

感谢阅读,宋玉长老希望你转发这篇文章!

宋玉喝茶

😉😊😇
🥰😍😘

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=11788

(本篇完)