CSS选择器"(A或B)和C"?

Jos*_*osh 157 html css css-selectors

这应该很简单,但我找不到它的搜索条件.
假设我有这个:

<div class="a c">Foo</div>
<div class="b c">Bar</div>
Run Code Online (Sandbox Code Playgroud)

在CSS中,我如何创建一个匹配"(.a或.b)和.c"匹配的选择器?

我知道我可以这样做:

.a.c,.b.c {
  /* CSS stuff */
}
Run Code Online (Sandbox Code Playgroud)

但是,假设我将不得不经常使用各种逻辑组合来做这种逻辑,那么是否有更好的语法?

Mat*_*all 129

有更好的语法吗?

没有.cIN' or运营商(,)不允许分组.它本质上是选择器中最低优先级的逻辑运算符,因此必须使用.a.c,.b.c.

  • 目前情况已不再如此。请参阅其他答案。 (3认同)

Met*_*der 22

还没有,但是有一个实验:matches()选择器可以做到这一点:

:matches(.a .b) .c {
  /* stuff goes here */
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里这里找到更多信息.目前,大多数浏览器都支持它的初始版本:any(),它的工作方式相同,但将被替换为:matches().在使用它之前我们只需要再等一会儿(我肯定会).

  • 指责 IE 没有实现他们根本没有想到的东西,并且一开始就没有出现在任何草案中,这是没有道理的。`:-moz-any()` 和 `:-webkit-any()` 早在 Mozilla 建议将其用于 Selectors 4 之前就出现了(导致其当前的化身为 `:matches()`)。 (2认同)
  • 无论草案已经发布多长时间,期望任何供应商从不稳定草案中实现功能同样是不合理的(这是为了说明 Selectors 4 在其 FPWD 三年多后仍然不稳定并且基本上未实现的事实) . (2认同)
  • 不再实验了。自 2021 年 2 月 (MDN) 以来,`:is()` 现在已在所有主要浏览器中实现 - 尽管将其用于网络应用程序(没有后备)可能还为时过早。 (2认同)

Šim*_*das 12

如果你有这个:

<div class="a x">Foo</div>
<div class="b x">Bar</div>
<div class="c x">Baz</div>
Run Code Online (Sandbox Code Playgroud)

而你只想选择有.x和(.a.b)你可以写的元素:

.x:not(.c) { ... }
Run Code Online (Sandbox Code Playgroud)

但只有当你有三个"子类"并且你想要选择其中两个时,这才是方便的.

只选择一个子类(例如.a):.a.x

选择两个子类(例如.a.b):.x:not(.c)

选择所有三个子类: .x

  • "a或b或c或d"形式的任何逻辑子句与"not(not(a)and not(b)and not(c)and not(d)"相同`so'或'实际上只是便利功能.从理论上讲,应该可以在_all_情况下没有它.在OP的情况下`(.a或.b)和.c` - >`:not(:not(.a):not(.b)).c` (5认同)
  • 截至今天上午五点,是的!我有js吐出一阶逻辑,在叶子上有选择器,给出结果如`:not(:not([data-status ="ACT"]):not([data-status ="ISS"]) :不使用(数据状态= "COR"]))[数据月= "08"]`.代码不够干净,不能公开阅读,但是,我会发布它.我在chrome,safari和低端Android手机上测试过. (4认同)
  • @MaxMurphy 你测试过吗? (2认同)
  • @MaxMurphy 你说得很好,但我认为你引用了一个相当折磨人的“便利功能”定义。数字计算机可以做的任何事情都可以分解为与非门,但我不会将软件工程的其余部分称为“一堆便利功能”。当结构可以组合时,程度的差异很快就会变成事实上的种类差异。 (2认同)

Yaa*_*ler 11

对于那些阅读本文 >= 2021 的人:

我发现使用:is()选择器成功:

*:is(.a, .b).c{...}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我想知道“:is()”选择器是否在 9 年前我问这个问题时就已经存在了? (3认同)
  • @Josh `is()` 替换了 Metalcoder 2014 年答案中的 `:matches()`。有关更多信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/CSS/:is 。 (3认同)
  • 我对此表示怀疑!@Josh --&gt; 我留下了这个答案,因为当我搜索如何在 css 选择器中组合类时,这篇文章是 Google 上的#1 结果。对于目前正在观看的人来说,这是一个有用的答案——尽管之前的答案可能更多地显示了技术发展的产物。 (2认同)

Spu*_*ley 5

不。标准 CSS 不提供您正在寻找的那种东西。

但是,您可能需要查看LESSSASS

这是两个旨在通过引入附加功能(包括变量、嵌套规则和其他增强功能)来扩展默认 CSS 语法的项目。

它们允许您编写更多结构化的 CSS 代码,并且它们中的任何一个几乎肯定会解决您的特定用例。

当然,没有一个浏览器支持它们的扩展语法(特别是因为这两个项目都有不同的语法和功能),但它们所做的是提供一个“编译器”,将你的 LESS 或 SASS 代码转换为标准 CSS,然后你可以部署在您的网站上。