【你不知道的 CSS】你写的 CSS 太过冗余,以至于我对它下手了
创始人
2025-05-30 16:30:49
0

:is()

你是否曾经写过下方这样冗余的CSS选择器:

.active a,
.active button,
.active label {color: steelblue;
}

其实上面这段代码可以这样写:

.active :is(a, button, label) {color: steelblue;
}

看~是不是简洁了很多!

是的,你可以使用 :is() 对选择器的任何部分进行分组,例如,你可以对如下代码:

.section h2,
.aside h2,
.nav h2 {color: steelblue;
}

进行转换:

:is(.section, .aside, .nav) h2 {color: steelblue;
}

但是 :is() 不仅对父选择器和子选择器有用,它也可以选择多个相邻的选择器,比如:

button:is(:focus, :hover, :active) {color: steelblue;
}button:is(.active, .pressed) {color: lightsteelblue;
}

上述代码等价于:

button:focus, button:hover, button:active {color: steelblue;
}button.active, button.pressed {color: lightsteelblue;
}

:where()

:where() 是一个与 :is() 非常相似的伪类,也值得注意。它们看起来非常相似:

:where(.section, .aside, .nav) h2 {color: steelblue;
}

但区别在于 :where 的权重为 0,而:is() 总是会采用列表中最特高的选择器的权重。例如,你知道下面的 CSS 代码中的按钮是什么颜色吗?

:is(html) button {color: red;
}:where(html) button {color: blue;
}

在上面的例子中,虽然以 :where() 开头的块在以 :is() 开头的块下面,但 :is() 块具有更高的权重

:has()

一个相关但非常不同的伪类是:has():has() 允许选择包含匹配选择器(或选择器集)的子元素的父元素

:has() 的一个示例是不显示下划线的情况下包含图像或视频的链接:

a { text-decoration: underline }/* 链接有下划线,除非它们包含图像或视频 */
a:has(img, video) {text-decoration: none;
}

现在,如果默认情况下我们的 a 标记有下划线文本,但其中有图像或视频,则任何匹配的锚元素的下划线将被删除。

你也可以结合 :is() 使用:


:is(a, button):has(img, video) {text-decoration: none;
}

我们还需要预处理器吗?

现在你可能会说“SCSS可以做到这一点!,你甚至可能更喜欢它的语法:

.active {button, label, a {color: steelblue;}
}

说的没错,这很优雅。但是,CSS 似乎现在已经都能获取到我们曾经需要SCSS(或其他预处理器)才能获得的特性。

CSS 变量也是 CSS 本身的另一个不可思议的补充,它回避了一个问题:就是什么时候或者多久你真的需要预处理程序:

.active :is(a, button, label) {--color: steelblue;color: var(--steelblue);
}

这并不是说预处理器没有它们的用例和优点。

但我认为在某个时间点上,它们确实是处理任何重要CSS的强制要求,而现在情况不再如此了。

最后一个惊喜

我想说的是,CSS的未来仍然是光明的。CSS 工作组正积极致力于直接向CSS中添加嵌套选择器。他们正在积极地在3种可能的语法之间进行选择:

/* 1 */
article {font-family: avenir;& aside {font-size: 1rem;}
}/* 2 */
article {font-family: avenir;
} {aside {font-size: 1rem;}
}/* 3 */
@nest article {& {font-family: avenir;}aside {font-size: 1rem;}
}

你最喜欢哪一个?

其实第 1 种已经被官方采纳!所以我们可能很快就会看到一个非常像 scss 的嵌套语法。

浏览器支持

目前所有主流浏览器都支持 :is():where() 伪类:

在这里插入图片描述
但是,需要注意,我们在这里提到的 :has() 伪类没有相同级别的支持,所以使用 :has() 时要小心:

在这里插入图片描述

相关内容

热门资讯

三门计入高考总分学考科目可文理...  最新或2023(历届)起,全国将全面推进考试招生改革,高考录取总成绩未来将由3门必考科目(语文、数...
北京最新或2023(历届)高考...  4日,《国务院关于深化考试招生制度改革的实施意见》出台后,北京市教委对北京晨报记者表示,将按照教育...
山东最新或2023(历届)高考... 国务院关于深化考试招生制度改革的实施意见,提出了高考不分文理科、只考语数外三科等一系列重大变化,引发...
教育部涉高考6门科目可文理混搭...  9月5日,教育部相关负责人通过教育部官微在线回答提问。教育部表示,包括音体美在内的所有科目都要参加...
Opengl ES之矩阵变换(... 前言 说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到...
企业云应用程序登录安全 云应用程序的不断普及吸引了黑客的关注,他们现在将目光转向云端的数据。黑客们可以通过钓鱼...
9.docker入门到精通—D... Docker启动时会在主机上自动创建一个docker0网桥,即一个Linux网桥。容器...
高考改革不分文理科解读 高考总...  作为中央部署全面深化改革的重大举措之一,国家关于考试招生制度改革的实施意见4日正式发布,这也是恢复...
最新或2023(历届)高考改革...  9月4日上午十点,国务院新闻办召开新闻发布会,教育部副部长杜玉波、刘利民及部长助理林蕙青介绍《关于...
最新或2023(历届)高考不分...      最新或2023(历届)高考不分文理科高考会怎么考? 高考将不分文理科,考生总成绩由统一高考...
最新或2023(历届)高考变革... 据中国之声《新闻纵横》报道,本周,《国务院关于深化考试招生制度改革的实施意见》正式发布。这也意味着,...
北京大学4076人报到 农村籍...  6日上午,4076名北京大学最新或2023(历届)级本科新生聚首燕园,农村籍和少数民族学生的比例为...
最新或2023(历届)发布的高...  作为中央部署全面深化改革的重大举措之一,国家关于考试招生制度改革的实施意见4日正式发布,这也是恢复...
最新或2023(历届)高考新政...   考试之变  1 省内统一组织 学业水平考试  高中学业水平考试是检验学生学习程度、避免严重偏科的...
思维导图模板怎么制作?提供几种... 思维导图是一种非常有用的图形化思维工具。它可以帮助我们更好地组织、整理和表达头脑中的想法。在学习中&...
最新高考改革新政:不分文理科目...  “最新或2023(历届)启动考试招生制度改革试点,最新或2023(历届)全面推进。”国务院《关于深...
最新或2023(历届)起自主招...   9月4日上午十点,国务院新闻办召开新闻发布会,教育部副部长杜玉波、刘利民及部长助理林蕙青介绍《关...
Golang实现0-1背包问题... Golang实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界) 算法实现说明 动态规划算法...
最新或2023(历届)高考改革...   9月4日上午十点,国务院新闻办召开新闻发布会,正式公布我国考试招生制度改革方案。对于本次改革方案...
关于 连接mysql报错“ss... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...