最近 CSS 发展势头强劲。再一次,我听说了一些从未见过的全新事物,而且又是通过 Miriam 知道的:CSS 条件语句。
🎉 CSSWG 刚刚决定将 @tabatkins 的 when/else 提案纳入下一级 CSS 条件语句。以下是提案:https://#/IXEOK7xKcL
— Mia, on Bass (@TerribleMia) 2021 年 9 月 15 日
媒体查询中已经存在 逻辑。实际上,媒体查询本身就是逻辑。
@media (min-width: 600px) {
/* WHEN this media query is true, do these styles. */
}
如果您希望拥有与上述条件互斥的样式,则需要编写两个媒体查询
@media (min-width: 600px) {
/* ... */
}
@media (max-width: 599px) {
/* ... */
}
这有点... 繁琐。在新提案中,语法更加简洁
@when media(min-width: 600px) {
/* ... */
}
@else {
/* ... */
}
看起来您可以通过 and
来设置多个条件,使用多个 @else
语句创建瀑布式逻辑堆栈,并且不仅可以使用 @media
,还可以使用 @supports
。
@when media(width >= 400px) and media(pointer: fine) and supports(display: flex) {
/* A */
} @else supports(caret-color: pink) and supports(background: double-rainbow()) {
/* B */
} @else {
/* C */
}
在我看来,这非常合乎逻辑,也很实用!
我看到了 关于命名的小争论。@if
也可以是一个逻辑名称。但 Sass 使用了 @if
,如果开发人员不得不将其所有 Sass 逻辑重构为新语法,或者最终以其他方式进行重构,那将会非常令人厌烦。CSS 应该向任何预处理器让步吗?当然不是,但 Sass 已经存在很长时间了,而且非常流行,并且有一个非常好的替代方案,所以为什么要造成这种麻烦呢?在那条线程中,不只是关于 Sass 的问题 — 一些人认为 @when
反而是一个更好的名称。
这是一种糟糕的代码,它不等效于显示的
@when
。请记住,CSS 像素不是整数,因此设备宽度绝对可以在 599px 和 600px 之间(例如,如果设备像素比为 2,则宽度为 1199 设备像素的窗口将为 599.5 CSS 像素宽)。相反,您应该编写很可惜否定需要指定媒体,因为
not all and
是一个奇怪的写法,而一个理智的人可能会预期它仅仅是not
,但这是必需的。... 这就是我认为将
@when
加入 CSS 可能会有用,因为太多人犯了这种否定错误。谢谢!
我们还可以做类似的事情
顺便介绍一个
element()
东西,并使用元素属性的计算值来切换条件的打开或关闭。您是否找到了解决此问题的方案?如果您可以找到适用于 HTML 邮件的解决方案,我愿意支付 200 美元。
不同意最后一段。应该是
@if
,重构 Sass 非常简单,而且暂时令人讨厌,但@when
将与其他所有语言不同,因此您需要记住一些特定内容,而且会永远令人讨厌。否则,这是一个很酷的补充!确实不同,但 CSS 与其他语言不同。我认为这很合适。
让我感兴趣的是,围绕 @if 和 @when 展开了如此激烈的辩论,但似乎没有人提到 Sass 也使用 @else。
我猜 @else 不会有问题,因为如果不在 @if 之后使用 @else,Sass 不会编译它。尽管它可能会在编译期间抛出语法错误。
请注意,
calc
在 Less 中也是一个类似的问题。我的意思是您必须使用字符串转义~"calc(100% - 20px)"
所以我想您也可以解决
@if
问题... 但就我个人而言,我并不介意@when
这个名字。xsl 中也有 when,因此 css 不会是第一个使用该名称的。说实话,由于 CSS 是声明式而不是命令式,因此这样做是有意义的。使用“when”可以将此概念与流程控制区分开来。
该词的时效性使其成为一个好选择,不要只在满足此条件时执行以下操作,而是在满足该条件的任何时候都执行。
哇,声明式而不是命令式,这是最好的论点,太棒了!
很有趣。我想我们不久之后就会开始对 CSS 文件进行单元测试了?;)