如何在CSS选择器中组合类和ID?


221

如果我有以下div:

<div class="sectionA" id="content">
    Lorem Ipsum...
</div>

有没有一种方法可以定义表达“与id='content'AND 的div”这一想法的样式class='myClass'

还是您只是简单地走了一条路或另一条路

<div class="content-sectionA">
    Lorem Ipsum...
</div>

要么

<div id="content-sectionA">
    Lorem Ipsum...
</div>

2
如果您要按ID选择,则也无需按类选择,因为ID是唯一的,所以只有一个元素会匹配。因此,通过将类添加到同一选择器只是额外的输入
TStamper 2009年

20
@TStamper:不一定。您只是在考虑静态文档。例如,您img#Inbox的页面上可能有一个通常设置为50%不透明度的图标。但是,当用户收到一条消息时,您希望将其设置为100%不透明度,而后端则通过active向该元素添加类来表明这一点。在这种情况下,拥有一个将ID和类名结合在一起的选择器确实很有意义。
冒犯君主

@TStamper:而且,难道没有比单独的id版本更具体的id + class组合选择器赋予它更大的权重/优先级吗?AFAIK,应该。(IOW,id + class组合选择器的规则将覆盖id组合选择器的规则。(这是我/现在才需要找到此线程的原因。)
govinda

所以,我也有类似的情况。例如,我有许多具有描述但也希望对单个产品进行特定控制的产品,因此,我可以这样做: code<p id = Product_1 class = Product> Product 1 </ p> <p id = Product_2 class = Product> Product 2 </ p> code 这样既可以对所有产品进行总体样式设计,又可以对特定产品进行单独样式设计?
塔默·贾迪

Answers:


327

在样式表中:

div#content.myClass

编辑:这些可能也有帮助:

div#content.myClass.aSecondClass.aThirdClass /* Won't work in IE6, but valid */
div.firstClass.secondClass /* ditto */

并且,根据您的示例:

div#content.sectionA

四年后进行编辑:由于它已经过时了,人们一直在寻找它:不要在选择器中使用tagNames。#content.myClassdiv#content.myClasstagName添加不需要的筛选步骤要快。仅在必须的地方在选择器中使用tagNames!


31
指定ID属于div仅会损害渲染性能(尽管几乎可以忽略不计),而对其没有任何好处,因为ID已经是唯一的。我改用#content.myClass使其干净。
mystrdat 2012年

3
div.class#id尽管不建议使用,但应该等效;首先使用选择器的更多独特部分。
SF。

1
非常感谢您的努力,即使几年后:)。仍在帮助像我这样的人。刚刚用于我的项目。确定支持。
C4d

76

#header .callout和之间存在差异#header.callout

这是以下内容的“普通英语” #header .callout
选择所有具有类名称callout的元素,这些元素是ID为的元素的后代header

并且#header.callout表示:
选择ID为header且类名称为的元素callout

您可以在此处阅读更多CSS技巧


我用空格犯了这个错误:#id .class vs#id.class
ERJAN

5

在一个元素上组合id和class并没有错,但是对于一条规则,您不必同时通过ID进行识别。如果您确实要这样做,可以执行以下操作:

#content.sectionA{some rules}

您不需要div其他人建议的ID前面。

通常,应使用ID设置特定于该元素的CSS规则,并且这些规则将比仅该类具有更大的权重。该类指定的规则将是属性,这些属性适用于您不想在任何时候需要在多个位置更改的多个项目。

归结为:

 .sectionA{some general rules here}
 #content{specific rules, and overrides for things in .sectionA}

合理?


4

通常,您不需要分类由id指定的元素,因为id始终是唯一的,但是如果您确实需要,则可以使用以下方法:

div#content.sectionA {
    /* ... */
}

1

可以在CSS中结合使用ID和Class,但是ID的目的是唯一的,因此将类添加到CSS选择器将使它过分合格。


那是个很好的观点。我在想,如果您有一组非常通用的类(设置诸如float,height / width之类的东西,也许诸如font之类的东西),并且您想在此唯一异常中覆盖其中的某些内容?
2009年

5
除非您将同一样式表用于不同的页面。:-)
Patrick McElhaney,2009年

5
另一个示例:使用Javascript动态添加类时(#optionalFields.enabled)
Patrick McElhaney,2009年

即使您在不同页面上使用相同的样式表,也最好将一个类放在正文上或为ID设置一个样式,然后为具有适当覆盖样式的类分别定义类。
Eric Wendelin

是的,我认为这样做很普遍。例如li#SomeTab.state-selected
Yablargo


0

ID应该在整个文档范围内都是唯一的,因此您不必同时基于两者进行选择。您可以通过以下方式为元素分配多个类:class="class1 class2"


1
班级可以改变。例如,您可以使div#id.active和div#id.inactive。
Daniel Moura

公平地考虑,我已经使用了此功能,但是我误解了所需的行为。
本·休斯

0

我想你们都错了。ID与类不是特定性的问题;它们在逻辑上有完全不同的用途。

应使用ID来识别页面的特定部分:页眉,导航栏,主要文章,作者署名和页脚。

应该使用类将样式应用于页面。假设您有一家普通杂志网站。该网站上的每个页面都将具有相同的元素-页眉,导航,主要文章,侧边栏和页脚。但是您的杂志有不同的版块-经济,体育和娱乐。您希望这三个部分具有不同的外观-保守的经济学和方形的,运动性的,娱乐性的年轻。

您为此使用类。您不需要制作多个ID,例如#economics-article和#sports-article和#entertainment-article。那没有道理。而是,您将定义三个类,。经济学,体育和。娱乐,然后为每个类定义#nav,#article和#footer ID。


实际上,您提到的大多数元素都可以使用语义HTML标记代替ID。页眉,页脚,导航,节等标签存在是有原因的。
Walter Schwarz 2014年

但是实际上,您应该只对唯一的单例元素使用ID。但是即使这样,如果您需要通过JavaScript访问该元素,它也才真正有用,因为使用ID会使您的CSS过于具体,以后很难与其他CSS和/或HTML合并。还有一种观点认为,ID的速度要比类的速度快,但是差异实际上可以忽略不计。
Walter Schwarz 2014年

-1
.sectionA[id='content'] { color : red; }

虽然doctype为html 4.01时无法使用...

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.