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


176

这应该很简单,但是我很难找到它的搜索词。
假设我有这个:

<div class="a c">Foo</div>
<div class="b c">Bar</div>

在CSS中,如何创建与“(.a或.b)和.c”匹配的选择器?

我知道我可以这样做:

.a.c,.b.c {
  /* CSS stuff */
}

但是,假设我将不得不大量使用各种逻辑组合来执行这种逻辑,是否有更好的语法?


如果必须支持Internet Explorer 6,请小心,因为它只会忽略CSS选择器中的多个类名。
fforw 2011年

24
幸运的是,对于这个项目,我可以告诉IE6用户自己升级。
乔什

12
为了清楚起见,我尝试始终在逗号后加换行符,至少要加一个空格。
ANeves 2011年

2
@ANeves +1换行。我认为这是最好的方法,尤其是在使用源代码控制时。
Curt

Answers:


149

有更好的语法吗?

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


25

还没有,但是有一个实验性的:matches()伪类函数可以做到这一点:

:matches(.a .b) .c {
  /* stuff goes here */
}

您可以在此处此处找到更多信息。当前,大多数浏览器都支持其初始版本:any(),该初始版本的工作方式相同,但将由代替:matches()。我们只需要再等一会儿,然后再在任何地方使用它(我肯定会)。


责怪IE不能实现他们根本没有想到过的东西,并且从一开始就没有草案,这是不合理的。:-moz-any()并且:-webkit-any()在Mozilla为Selectors 4推荐它之前就出现了(导致目前的化身为:matches())。
BoltClock

1
期望任何供应商都能从不稳定的草稿中实现功能,这是不合理的,无论草稿提供了多长时间(这都是考虑到选择器4在其FPWD三年后仍然不稳定且在很大程度上未实现的事实) 。
BoltClock

@BoltClock,他们将IE6责备了整整十年之久,因为这些事情在2001年不存在。人们只想责怪某人。
GetFree 2015年

关于实验性实验的一句话是,除非正式实施,否则您不想开始依赖它们。尽管这似乎是一个不错的解决方案,但是它消失的可能性使我个人无法在自己的项目中实现它。即使跟踪一个实验性的伪类也不会让我感到安全。它很可能会在项目中的多个地方使用,以防万一,如果您在多个地方使用它,则需要以某种方式对其进行跟踪。您肯定可以保留后备功能,但仍然
无法解决问题

我是唯一一个Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.出错的人吗?🤔
托马斯

12

如果您有这个:

<div class="a x">Foo</div>
<div class="b x">Bar</div>
<div class="c x">Baz</div>

而且,您只想选择具有.x和(.a.b)的元素,可以这样写:

.x:not(.c) { ... }

但这仅在您有三个“子类”并且要选择其中两个时才方便。

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

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

选择所有三个子类: .x


6
形式的任何逻辑子句都与之a or b or c or d相同,not(not(a) and not(b) and not(c) and not(d))因此“或”实际上只是一个便捷函数。从理论上讲,在所有情况下都可以没有它。在OP的情况下(.a or .b) and .c->:not(:not(.a):not(.b)).c
Max Murphy

2
@MaxMurphy您测试过吗?
森那维达斯

4
截至今天早上五点!我有js会吐出一阶逻辑,并在叶子上带有选择器,从而给出诸如的结果:not(:not([data-status="ACT"]):not([data-status="ISS"]):not([data-status="COR"]))[data-month="08"]。该代码不够干净,无法公开阅读,否则,我将其发布。我在Chrome,Safari和低端Android手机上进行了测试。
Max Murphy

2
@MaxMurphy您的观点很不错,但是我认为您已经引用了“便利功能”一个相当折磨的定义。数字计算机可以做的任何事情都可以分解为NAND门,但是我不会将其余的软件工程称为“一堆便利功能”。当构造可以组合时,程度的差异很快就会成为事实上的种类差异。
莎拉·G

1
@MaxMurphy我很难弄清楚你只是在开玩笑。:( 该否定CSS伪类,:未(X),是一种功能性符号采取简单选择 X作为参数它未由参数表示的元素相匹配X。必须不包含另一个否定选择(从Mozilla的文档,重点煤矿)
törzsmókus

5

否。标准CSS不能提供您想要的东西。

但是,您可能需要研究LESSSASS

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

它们使您可以编写更加结构化的CSS代码,并且几乎可以肯定两者都可以解决您的特定用例。

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


到那时,我不妨只使用PHP打印“ Content-type:text / css”
Josh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.