你能发现这两个选择器之间的区别吗?
#header.callout { }
#header .callout { }
它们看起来几乎相同,但上面那个在#header
和.callout
之间没有空格,而下面那个有。这个小小的差异会对它的作用产生巨大的影响。对于你们中的一些人来说,上面那个选择器可能看起来像个错误,但它实际上是一个非常有用的选择器。让我们看看它们的区别、上面那个选择器的含义,以及探索更多这种样式选择器。
以下是#header .callout
的“通俗解释”
选择ID为header的元素的所有后代中,类名为callout的元素。
以下是#header.callout
的“通俗解释”
选择ID为header且类名为callout的元素。
也许这张图会让它更清楚

类和ID的组合
这里重点是,可以通过将这些选择器串联在一起(不带空格),来定位具有class
和ID
组合的元素。
ID 和类选择器
如上所述,您可以定位具有ID
和class
组合的元素。
<h1 id="one" class="two">This Should Be Red</h1>
#one.two { color: red; }
双类选择器
定位具有多个class
的元素。下面显示了两个class
,但不限于两个。
<h1 class="three four">Double Class</h1>
.three.four { color: red; }
多个类
我们不限于此,我们可以根据需要将任意多个class
和ID
组合到一个选择器中。
.snippet#header.code.red { color: red; }
但请记住,这样可能会有点过头。
详细了解 如何在 DigitalOcean 中使用 ID、类和属性选择器选择 HTML 元素。
示例
那么这一切到底有多有用呢?特别是对于ID
,它们本来就应该唯一,所以为什么要将它与class
结合起来呢?我承认ID
版本的用例比较少,但肯定有一些用途。其中之一就是轻松覆盖样式。
#header { color: red; }
#header.override { color: black; }
第二个目标是相同的元素,但覆盖了颜色,而不是使用
.override { color: black !important }
或者可能在选择器前面加上更具体的某些内容。
更有用的是多个class
,并以最近流行的“面向对象”CSS 样式使用它们。假设您在一个页面上有一堆div
,并且在它们上面使用了多个不同的描述性class
名称
<div class="red border box"></div>
<div class="blue border box"></div>
<div class="green border box"></div>
<div class="red box"></div>
<div class="blue box"></div>
<div class="green box"></div>
<div class="border box"></div>
它们都共享class
“box”,它可能设置宽度或背景纹理,所有这些元素共有的某些内容。然后其中一些具有颜色名称作为class
,这将用于控制框内使用的颜色。也许绿色表示框具有绿色的背景和浅绿色的文本。其中一些具有class
名称“border”,据推测这些将具有边框,而其余则没有。
所以让我们设置一下
.box { width: 100px; float: left; margin: 0 10px 10px 0; }
.red { color: red; background: pink; }
.blue { color: blue; background: light-blue; }
.green { color: green; background: light-green; }
.border { border: 5px solid black; }
不错,我们这里有一个很好的工具箱,我们可以创建新的框,并且有多种选择,我们可以选择颜色以及它是否具有边框,只需应用一些相当语义化的class
。拥有这个class
名称“toolbox”也使我们能够定位这些class
的唯一组合。例如,也许那个黑色边框在红色框上不起作用,让我们修复它
.red.border { border-color: #900; }

基于 此演示页面。
特异性
这里还需要注意的是,像这样的选择器的特异性值将与它们是单独的选择器时具有相同的权重。这就是赋予它们上面示例中覆盖能力的原因。
详细了解 在 DigitalOcean 中了解 CSS 中的特异性。
浏览器兼容性
所有当前的良好浏览器都支持此功能,以及 IE 回到版本 7。IE 6 比较奇怪。它根据列表中的最后一个选择器进行选择。因此“.red.border
”将根据“.border
”进行选择,这有点破坏了事情。但是,如果您支持 IE 6,那么您已经习惯了这种愚蠢的行为,并且可以通过条件样式来修复它。
感谢这份精彩的概述;)
不过您颠倒了初始描述,但随后的图形是正确的。
#header.callout
是同时具有 id=”header” 和 class=”callout” 的元素,而#header .callout
是 id=”header” 的元素的类名为“callout” 的子元素。只想指出这一点 :)
不过图片显示的是正确的。
很高兴我不是唯一一个感到困惑的人?
实际上,#header .callout 涉及类名为 callout 的元素,它是 id=header 的元素的后代(而不是子元素)。
对于子元素,它将是 #header > .callout。
对。“后代”是更准确的术语。
与 Chris 一样——您颠倒了描述。
哇!这太棒了。这是我第一次听说这种选择器的组合。它将非常有助于减少 div 中的 div。很棒的文章。谢谢。
这是一篇关于选择器及其之间差异的精彩综述。谢谢!
正如 Chris Pratt 所说,您混淆了类的通俗解释。
尽管如此,这是一篇不错的文章。谢谢。
我需要重新审视一下这些 id + class 规则。我在上一份工作中大量使用了这些规则,然后在 IE6 中无法按预期工作时全部删除了它们。我从未意识到 IE6 只是使用第一个选择器。既然我无论如何都在为 IE6 使用条件样式表,这似乎是一个可以重新使用的不错选择。
其他人是否也遇到过这种情况?每当我发现某些东西在所有浏览器中都无法正常工作时,我就会产生一种心理障碍,不允许我再使用这种技术,从未想过一个简单的解决方法。
根据《CSS 缺失手册》第二版
“当多个样式
应用于一个标签时,
Web 浏览器必须
确定哪个样式应该“胜出”
以防样式属性
冲突。在 CSS 中,样式的
重要性称为特异性
并由创建样式时使用的选择器类型确定。
每种选择器类型都有一个
不同的值,当多个
选择器类型出现在一个样式中时,
例如后代
选择器 #banner p,所有使用的选择器的值
都会加起来。”
示例
选择器 id 类 标签 总计
p 0 0 1 1
.byline 0 1 0 10
p.byline 0 1 1 11
#banner 1 0 0 100
#banner p 1 0 1 101
#banner .byline 1 1 0 110
a:link 0 1 1 11
p:first-line 0 0 2 2
h2 strong 0 0 2 2
#wrapper #content .byline a:hover 2 2 1 221
这会导致覆盖,而不是“在选择器前面加上更具体的元素”。
对吧?
感谢这篇文章。它给了我很多关于我正在开发的几个网站的绝妙想法,并且为我节省了很多 span 标签。
你说:“IE 6 非常奇怪。它根据列表中的第一个选择器进行选择。”
我相信应该是列表中的**最后一个**选择器,对吧?
根据我的经验,目前还没有…… .red.border 会选择 .red,而不是 .border
David 说得对。在 IE6 中,red.border 与 .border 相同,因此边框颜色将应用为 #900。这是一个IE6 渲染的屏幕截图。
应该是 .red.border 与 .border 相同
再补充一点,关于“在 IE6 中 .class1.class2 == .class2”,David 和 Ethan 是正确的。虽然我不确定它如何处理“#id.class”。
是的,看起来这是正确的,我误解了我正在查看的内容。
感谢这些信息!
很棒的网站!对我来说,教程很漂亮而且有用。因为我现在才看到这里,所以为自己感到抱歉!非常感谢!
非常棒的文章。迫不及待地想尝试一下 :)
这不是每天都会用到的东西,你是怎么发现的:D 这个很酷:#header.callout
感谢分享。
哇,我想知道你要往哪里发展。但是,考虑到 ID 在每个页面上只能使用一次,ID 不应该足以指定吗?
在大多数情况下是的,但我上面谈到了一个具体的例子。更详细地说:也许您在网站的每个页面上都有一个 h2#comments。在其中一个页面上,您想稍微更改一下样式。您可以添加一个类名,然后使用双选择器来覆盖它已有的任何现有值。这样您就不需要依赖 !important 规则或任何更具体的选择器了。
嘿,Chris,你写了“子元素”,但指的是“后代”。子元素使用“大于”符号选择,例如 E > F
谢谢,Chris!在同一个句子中出现 IE6 和愚蠢的行为。我喜欢你的表达方式。
很棒的内容,我学到了一些东西:)。谢谢。
只是一个想法,我相信一个更清晰(但不是真正)的例子是
HTML
CSS
只是一个想法,我相信一个更清晰(但不是真正)的例子是
HTML
第 4 章
冒险开始
那天……
CSS
p {color: black}
p.title {text-decoration:underline}
p.title#chapter4 {text-transform:uppercase; background-image: url(4.jpg)}
我这么说,因为 Demo 中的 .box 类实际上是 div 元素。依此类推。
但是,我不知道是应该怪这个例子,还是这里有什么问题。
对我来说很清楚,如果你为 html 元素创建一个不同的类,你将会有不同的 CSS 标记机会。
更进一步地说,我想说的是,你在这里提供了一个关于**如何不级联**的例子……?
只有在我们可以使用两个以上类的那一天……啊……
实际上,我们每天都在一些老式的动态下拉菜单中使用它。使用 div id 来设置容器的样式,使用多个类来设置 li 和菜单中的 a 标签的样式。因为有时我们需要在网站上两次使用相同的菜单系统,所以我们可以使用类为一个菜单设置样式,并使用 id 覆盖另一个菜单。
每个菜单都有一个不同的 id,但要使其正常工作,它们都需要相同的类。
在我的自由职业工作中,我一直在标题标签上使用这些东西。所以你会有 h1.red 或 h1.blue……之类的东西。还有其他情况,但这个马上就浮现在脑海中。
有用,一如既往。
很棒的解释!
哇,Chris,很棒的解释!
我以前不知道,现在知道了,我可以看到这有多有用。
谢谢。
我经常使用这样的多个选择器,尤其是在 jQuery 中。我向容器添加一个类,这样类似于
#some-container.added-class .child-selector
的内容确实很有帮助,并且比仅仅向所有内容添加类(并且更快)要容易得多。我敢肯定,在 HTML5 中,人们会经常这样做。例如
header.main { 主要标题的样式 }
因为你不会只想设置 header 元素本身的样式,因为它也用于其他目的。
不需要。更简洁(至少在我看来)的方法是使用子选择器,例如
body > header { 样式 }
对于其他标题,您可以使用类似的方法,或者简单地使用
div header { 样式 }
假设您使用一个样式 div 作为主容器。也可以是 article 或 section 或任何您喜欢的元素。
IE6 是唯一一个不原生支持 >(这是 CSS2)的浏览器,但无论如何您都需要 JS 来在 IE 中支持 HTML5。
今天早上阅读了这篇文章。我认为它很酷,但无法想象会使用它。
……当然,我刚刚用它来解决了一个选择器问题。
Chris,你有一种不可思议的方式,能够在恰当的时间发布文章!
感谢这些信息。我以前不知道 css 选择器还有这一点。
老 IE 总是引发问题,真是令人费解。
不错的文章……很棒的解释!
我之前听说过这项技术,并且很喜欢它,因为它大大减少了标记的数量。我尝试在我的几个网站上使用它,但由于 IE6 的问题而不得不放弃它。
你能举一些使用条件样式解决IE6问题的例子吗?
例如,如何在你的盒子示例中解决IE6问题,而无需添加额外的标记?
非常有用的提醒,谢谢。
感谢你的分享,Chris。
我读过的关于特异性最好的解释是CSS: 特异性战争,它使用星球大战的角色提供了一种非常有用的记忆特异性规则的方法…
这是一篇非常有帮助的文章,因为我确实意识到使用空格与不使用空格之间存在差异。
我之前也没有意识到可以在一组引号内声明多个类名。例如 class="class1 class2"
虽然不会使你的HTML更漂亮,但可以通过在标记中堆叠类来选择IE6中的最后一个#id.class
style
div#something { color: orange; }
div#something.foo { color: red; }
div#something.bar { color: blue; }
html
这将是红色。
这将是蓝色
这在Firefox中也会产生蓝色。
我也很好奇如何使用条件样式解决这个问题。我一时想不起来如何在IE6中使用条件语句来使用#id.class。或者从底部开始。
嗯,抱歉;完全的新手。我把它包在pre里,但没有正确显示。无论如何
div id="something" class="foo"
div id="something" class="foo bar"
第二个例子会产生蓝色。第一个是红色。当然,没有类将是橙色。
我看到的一个用途是与Drupal这样的CMS一起使用。Drupal根据页面内容将类名附加到具有id的元素。例如,如果侧边栏可见,则#wrapper div将获得一个“left-sidebar”类。在没有侧边栏的页面上,该类不存在。
我认为这是在这样的系统中根据页面内容设置元素样式的最佳方法。
我以为#header.callout是打错了!
感谢Chris – 今天学到了新东西!
完美!感谢Chris,我给你发了一封邮件,希望有更多像这样的高级选择,这正是我所想的。你比大多数人做得更好的地方在于,你记下了代码,以可视化的方式展示了代码,然后给我们提供了一些策略。再次感谢。
(我想在我的愿望清单中添加——将这些类型的概念应用到wordpress中。我在学习wp如何重新生成你放在循环周围的标签并使选择器正确方面遇到了一些问题。)
很棒的文章,感谢你的信息。
对于那些确实希望在IE6中实现此功能的人,我找到了这个解释如何实现的链接
http://bytesizecss.com/blog/post/the-idclass-selector-in-ie6
你将拥有一个带有id和类的容器div,然后是一个空白div(没有id或类),然后是你的内容。
你的CSS将是这个,以便IE6能够工作
#header.callout div {styles}
当我写那篇bytesizecss文章时,我并不希望人们认为只有没有id或类的'div'元素才是解决方案。
它可以是任何元素,并且可以具有类和/或id。你只需要添加一个子元素即可。例如,以下内容可以正常工作
你好
你好
你好
.button span {
color: #000;}
.button.highlight span {
color: #ccc;}
.button.lowlight span {
color: #f00;}
嗯,那是一个惨败。HTML应该是这样的
<a href="#" class="button"><span>Hello</span></a>
<a href="#" class="button highlight"><span>Hello</span></a>
<a href="#" class="button lowlight"><span>Hello</span></a>
这是学习的正确地方。
谢谢!
嘿,Chris
你能写一篇文章解释堆叠类是如何工作的吗?我找到了这篇文章,它谈到了这个话题,但没有解释它是如何使用的,也没有展示它是如何工作的例子。这是文章的链接以及他描述的内容的片段。
非常感谢,你的文章总是写得很好,也很容易理解。
链接
http://blog.jm3.net/2007/03/16/the-only-ten-things-to-know-about-css/
片段
堆叠你的类:没有人使用过这个技巧;你可以在一个标签上应用任意数量的css类,只需在名称之间加上空格,例如将同时应用类exciting和类warning。这节省了CSS中的大量重复。(我不知道为什么没有人使用这个技巧。它很棒。当你看到某人的样式表中有几十行类似于:.redtext { font-family: Arial, Helvetica, sans-serif; color: red; } .bluetext { font-family: Arial, Helvetica, sans-serif; color: blue; },这表明他们可能不知道这个技巧。
不错的文章,我认为组合类和id非常有用。
我证实了我的直觉。
经过长时间的思考,我得出了以下结论:这对业余爱好者来说,构建类之上的类(这只会让你想知道“我在这里想做什么?”)。
有一种更好、更干净的方法,只需要一个CSS声明。你想知道怎么做吗?
你能告诉我吗
为什么它不起作用
idname1{
font-size: 29px;
}
idname2{
font-size: 23px;
}
idname1, #idname2 p{
margin-left: 77px;
}
我正在尝试这样做,但它不起作用
对不起,但我真的希望你不要把事情颠倒过来。这让人感到非常困惑。你不能只坚持“先使用空格的那个,然后是不使用空格的那个”,而不是把所有东西都混在一起吗?它们已经非常相似了,把它们混在一起会让你的文章更难理解。
如何使用css选择器示例访问类内部的元素
一个带类的div
div class="something"
然后
类内部的img标签
我需要更改img标签,告诉我如何访问
太棒了!谢谢!这是一个我一直在遇到的有趣问题,但我还没有找到答案
所以,我有两个类,每个类都有一个额外的类和/或选择器。为了保持DRY,我将如何编写选择器以确保两者都被选中?
WET示例
所需的DRY示例:(?)
基本上我想要的是选择具有多个类的多个类,但上面没有列出。
有什么想法吗?
好东西。对我来说是一篇非常有帮助的文章。
极好。感谢您扩展了id和class组合的使用方法。