ID 和类是“钩子”!
我们需要方法来描述 HTML/XHTML 文档中的内容。像 <h1>
、<p>
和 <ul>
这样的基本元素通常可以完成任务,但我们基本标签集不能涵盖所有可能的页面元素类型或布局选择。为此,我们需要 ID 和类。例如 <ul id="nav">
,这将使我们有机会专门针对此无序列表,以便我们可以将其独特地操作到页面上的其他无序列表。或者,我们的页面上可能有一节没有相关标签来表示它,例如页脚,我们可能会这样做:<div id="footer">
。或者,也许我们在侧边栏中有一些框,用于以某种方式将那里的内容隔开:<div class="sidebar-box">
。

这些 ID 和类是我们需要构建到标记中的“钩子”,以便我们可以访问它们。CSS 显然需要这些,以便我们可以构建选择器并进行样式设计,但其他 Web 语言(如 JavaScript)也依赖于它们。但是,它们之间有什么区别呢?
ID 是唯一的
- 每个元素只能有一个 ID
- 每个页面只能有一个元素具有该 ID
当我第一次学习这些东西时,我一遍又一遍地听到你应该只使用一次 ID,但你可以多次使用类。它基本上从一只耳朵进,另一只耳朵出,因为它对我来说更像是好的“经验法则”,而不是非常重要的东西。如果您纯粹是 HTML/CSS 人员,这种态度可能会持续存在,因为对您来说,它们实际上看起来并没有什么不同。
这里有一个:如果您在多个元素上使用相同的 ID,您的代码将无法通过验证。验证对我们所有人来说都应该很重要,因此,这本身就是一大因素。随着我们的继续,我们将讨论更多关于唯一性的原因。
类不唯一
- 您可以在多个元素上使用相同的类。
- 您可以在同一个元素上使用多个类。
需要应用于页面上多个对象的任何样式信息都应该使用类来完成。例如,一个页面有多个“小部件”。
<div class="widget"></div>
<div class="widget"></div>
<div class="widget"></div>
您现在可以使用类名“widget”作为您的钩子,将相同的样式集应用于它们中的每一个。但是,如果您需要其中一个比另一个更大,但仍然共享所有其他属性怎么办?类可以为您解决这个问题,因为您可以在其中应用多个类。
<div class="widget"></div>
<div class="widget big"></div>
<div class="widget"></div>
无需在此处创建全新的类名,只需在类属性中应用新的类即可。这些类是空格分隔的,大多数浏览器支持任意数量的类(实际上,它更像是数千个,但远远超过您需要的数量)。
任何 ID 或类都没有浏览器默认值
默认情况下,向元素添加类名或 ID 不会对该元素产生任何影响。
这正是我作为初学者被绊倒的地方。您在一个网站上工作,并发现应用特定类名可以解决您遇到的问题。然后,您跳到另一个具有相同问题的网站,并尝试使用相同的类名来修复它,以为该类名本身具有一些神奇的属性,但结果却发现它不起作用。
类和 ID 本身不包含任何样式信息。它们需要 CSS 来定位它们并应用样式。
条形码和序列号

也许这里的一个很好的类比是条形码和序列号。拿商店里的 iPod 来说。包装上会有一个条形码。这告诉商店产品是什么,因此当它被扫描时,系统就会确切地知道产品是什么以及它的价格。它甚至可能能够知道它的颜色或在商店中的存放位置。所有相同类型的 iPod 在它们上都具有完全相同的条形码。
iPod 上还会有一个序列号,它与世界上任何其他 iPod(或任何其他设备)绝对唯一。序列号不知道价格。它可以,但是对于商店来说,这并不是存储和使用该数据的有效方式。使用条形码要容易得多,例如,如果价格发生变化,您只需更改该条形码的价格,而无需更改系统中的每个单独序列号。
这非常类似于 ID 和类。可重用的信息应该保存在类中,而完全唯一的信息应该保存在 ID 中。
ID 具有特殊的浏览器功能
类在浏览器中没有任何特殊能力,但 ID 确实有一个非常重要的技巧。这就是 URL 中的“哈希值”。如果您有一个像 http://yourdomain.com#comments 这样的 URL,浏览器将尝试找到 ID 为“comments”的元素,并将自动滚动页面以显示该元素。这里需要特别注意的是,浏览器将滚动任何它需要滚动的元素以显示该元素,因此,如果您做了像在常规主体中使用可滚动 DIV 区域这样的特殊操作,该 div 也会被滚动。
这正是 ID 必须绝对唯一的重要原因。这样您的浏览器就知道在哪里滚动!
元素可以同时具有两者
没有什么可以阻止您在一个元素上同时拥有 ID 和类。实际上,这通常是一个非常好的主意。以 WordPress 评论列表项的默认标记为例
<li id="comment-27299" class="item">
它应用了一个类,您可能希望将其用于对页面上的所有评论进行样式化,但它也具有唯一的 ID 值(由 WordPress 动态生成,非常不错)。此 ID 值用于直接链接。现在我可以轻松地直接链接到特定页面上的特定评论。
CSS 不在乎
关于 CSS,您使用 ID 可以做到的,使用类也可以做到,反之亦然。我记得当我第一次学习 CSS 并遇到了问题时,有时我会尝试通过切换这些值来进行故障排除。不,CSS 不在乎。
JavaScript 在乎
JavaScript 人员可能已经更了解类和 ID 之间的区别。JavaScript 依赖于页面上只有一个元素具有任何特定的 id
,否则常用的 getElementById
函数将不可靠。对于熟悉 jQuery 的人来说,您知道向页面元素添加和删除类是多么容易。它是 jQuery 的一个原生内置函数。请注意,ID 没有这样的函数。JavaScript 的责任不在于操作这些值,它会造成比它值得的更多问题。
如果您不需要它们,请不要使用它们
如您所见,类和 ID 非常重要,我们每天都依赖它们来完成我们需要的样式化和页面操作。但是,您应该谨慎且语义化地使用它们。
这意味着避免以下情况
<a href="https://css-tricks.org.cn" class="link">CSS-Tricks.com</a>
我们已经知道这个元素是一个链接,它是一个锚元素!这里没有必要使用类,因为我们可以通过它的标签来应用样式。
也要避免这种情况
<div id="right-col">
ID 在这里得到了适当的运用,因为页面可能只有一个右栏,但名称不合适。尝试描述元素的上下文,而不是它在哪里或是什么样子。这里将 ID 设置为“sidebar”会更合适。
微格式只是特定的类名
觉得微格式很难理解?其实不然!它们只是利用标准化类名来表示所包含信息的常规标记。查看标准 vCard
<div class="vcard">
<a class="fn org url" href="http://www.commerce.net/">CommerceNet</a>
<div class="adr">
<span class="type">Work</span>:
<div class="street-address">169 University Avenue</div>
<span class="locality">Palo Alto</span>,
<abbr class="region" title="California">CA</abbr>
<span class="postal-code">94301</span>
<div class="country-name">USA</div>
</div>
<div class="tel">
<span class="type">Work</span> +1-650-289-4040
</div>
<div class="tel">
<span class="type">Fax</span> +1-650-289-4041
</div>
<div>Email:
<span class="email">[email protected]</span>
</div>
</div>
好文章!
哇,我不知道锚点链接 ID。我想你每天都能学到新东西 :]
谢谢。
不错的文章。对我来说没什么新鲜事,但我喜欢你解释一切并使其变得简单的方式 :D
当我第一次学习 CSS 时,这对我来说很难理解。条形码与序列号的例子很有帮助!谢谢!
GetElementById = getElementById.. 而且它不是 Javascript,而是 DOM ;p
好文章 :P
哈哈!我也刚注意到你的 RSS 阅读器消息数量在页面刷新时会发生变化!这很酷 - 你是怎么做到的?
很棒的文章。
我对微格式有一个模糊的了解,但不知道它们只是特定的类名 - 谢谢!
好文章,Chris!
很棒的文章。完美的入门和复习。谢谢。
好文章。即使对于我们经验丰富的开发人员来说,一些基本的提醒也会让人耳目一新。它也让我感到欣慰,因为我知道我可以偶尔写一些关于简单事物的博客。
关于在同一个标签中使用 ID 和 CLASS 的一个小点:我发现这是一种非常有用的技术,当你想在所有情况下(通过 ID)对元素应用默认样式,但在不同页面(通过类值)动态更改其颜色或背景图片时。但是,我发现这种方法似乎会导致 IE6 中出现问题,所以我倾向于避免使用它。其他人遇到过这个问题吗?我确信在 Sitepoint 的 CSS 参考 中有记录,但我只是想提一下。
很棒的文章。我记得当我刚开始的时候,我用 id 来做所有事情,因为我痴迷于用最少的字符来做所有事情。
优秀文章!我认为你解释的方式将帮助初学者理解 id 和类之间的区别。
实用的文章。谢谢,Chris!
和往常一样,很棒的文章,Chris!
关于微格式:我希望有一种方法可以共享电子邮件信息,而不必让自己暴露给垃圾邮件发送者。微格式非常适合共享其他个人/商业信息,但像这样公开你的电子邮件地址,只会招致无休止的 V1agra 优惠。我用过的一个解决方法 - 不确定它有多有效 - 是使用我网站联系表格的 URL。不像电子邮件那么直接,但也许比什么都没有好..
CSS 确实很在意这一点,因为 ID 比类具有更高的特异性。在任何给定的样式表集中,这显然需要考虑哪些 CSS 规则会相互覆盖。我知道这不是你在 CSS 部分中暗示的内容,但无论如何都值得一提。
条形码和序列号的类比很好。Ed Eliot(第 15 条评论)提出了一个很好的观点。
非常感谢你,Chris,另一个解释得很清楚且易于理解的主题!
请继续提供这些“基础知识”,它们对我们初学者来说非常有用。
Nic
很棒的文章,Chris。
现在是时候问一个新手的大问题了;
什么是 vcard?
你应该做一个调查,看看人们花了多长时间才弄明白你可以有多个类......我花了好几年。我去过的网站都没有提到过这一点,而且我在查看其他网站的代码时也没有真正注意到这一点。也许这只是我自学 HTML 和 CSS 的方式。
我想附和 Ed 的观点(在上面的第 15 条评论中),即 CSS 确实很在意 ID 和类之间的区别,因为 ID 总是比类具有更高的特异性。
这意味着,如果你有独立的基于 ID 和类的样式声明,它们都为同一个 HTML 元素声明了相同的属性,那么来自 ID 选择器的值将是将要应用的值。
特异性冲突可能是年轻 CSS 玩家最大的陷阱之一,所以在这个领域里小心使用语言是值得的。
又一次很棒的帖子......非常感谢你免费向我们提供这些很棒的资源。你真棒。我迫不及待地想看到 WordPress 系列的下一篇文章,因为我正在重新设计我的作品集网站,并由 WordPress 提供支持。
谢谢
Tom
不,“secondaryContent” 会更合适,因为 sidebar 仍然是一个表现描述。在 HTML 的上下文中,它不是一个侧边栏,它很可能在 mainContent 之后出现。当然,它可能在 HTML 中的位置不同,而不是次要的,但关键是要使 ID 和类对上下文有描述性。
Ping back http://designz-web.blogspot.com/
阅读关于条形码和序列号的内容很有趣 =)
我个人更喜欢在我的 CSS 中使用类,将 ID 留给 JavaScript。
感谢你写了这篇文章,很有趣。
非常感谢你写这篇文章。我作为 CSS 初学者,发现它非常有用!
很有趣......当我刚开始学习 CSS 的时候,我也对 ID 和类之间的区别感到困惑。实际上,我找不到任何关于它的信息,因为它被认为是如此基础的东西,以至于没有人真正解释它!我可以找到很多教程和示例代码,但它们总是只使用 ID 或类,从不解释为什么要使用它们!所以,我实际上花了好长时间才自己弄明白。
我一直感到困惑的一点是 - ID 和类之间确实没有样式上的区别。唯一的区别在于它们的使用方式,而不是浏览器如何显示它们。当我意识到这一点后,其他所有事情都变得容易多了。
我真的希望有人在几年前写过这样一篇文章!那会让我少受很多挫折 :-P
很棒的文章,感谢你提供有用的信息。
很棒的文章,我在这方面很长时间都模棱两可,谢谢你的发布!既然有人滚动到这里,让我们利用这些 ID 吧!
https://css-tricks.org.cn/the-difference-between-id-and-class#blog
我喜欢你分享学习时的心路历程,就像你把类名比喻成魔法一样……这确实能让新手感到安心!
我同意 Dan 的观点,我花了数年时间才弄明白可以在一个元素上添加两个类。这是一个非常有用的功能!我似乎也是最近才了解到页面上只应该有一个元素拥有某个特定 ID。不过,如果有多个元素使用相同的 ID,页面应该也能正常渲染吧?也许我很幸运,从未重复使用过 ID 元素。
此外,我之前从未听说过用元素名称来描述其内容。我一直以为只是为了方便你记忆而随便取的名字。
我从未听说过 CSS 会比类有更高的权重或更强的特异性,正如评论中所说。我不太理解他们的意思,所以我做了一个快速测试。如果一个拥有 ID 和指定颜色的 div 也拥有一个指定颜色的类,那么类的颜色对 div 内部的文本没有任何影响。
感谢你提到了这一点!非常有用的信息,因为我一直以为 CSS 层级纯粹是基于顺序的。
你遗漏了一点,一个元素只能有一个 ID,但可以有多个类。 这完全有效,并且会继承所有 3 个命名类的 CSS 规则(IE6 除外,但说真的,IE6 有什么东西能正常工作吗?)。
Gordon,请查看标题为“ID 是唯一的”和“类不是唯一的”的部分,我想这些事实再清楚不过了。;
感谢你分享这篇文章,它很有趣且有详细的说明。
我知道提升我的 CSS 和 HTML 知识水平并不容易,但你正在成功地做到这一点!!
继续努力,谢谢你!
来自法国的 Jean
Chris,
你是最棒的。感谢你的文章,我学到了很多。我也曾经一段时间把类当作 ID 来使用,以为这样会有区别。
实际上,CSS 会区分你使用的是 ID 还是类。在样式表级联中,ID 的权重高于类。这意味着如果类和 ID 同时尝试更改相同的属性,ID 将(应该)始终胜出。
假设有以下 CSS 代码:
#mysample{
color : red;
}
.mysample2{
color: black;
font-weight:bold;
}
如果类和 ID 同时应用于同一个元素,则颜色将为红色。由于 ID 没有指定字体粗体,因此只有类的字体粗体属性会应用到元素上。
快速问题,以下语句有什么区别?
@Mark: 区别不大,只是以 div 开头的那个语句特异性多了一点。有时,它也能帮助你更好地组织代码。
这不仅仅是多了一点。区别在于,第一个可以在 HTML 代码中的任何位置应用。而第二个只能应用于 div 元素。
没错。
ID’s are above the CLASSES
谢谢
很棒的信息,伙计……谢谢!!我是一个新手,对 CSS 有些困惑,现在已经解开了……你的帖子真的帮了我很大的忙…
好文章。谢谢,Chris!
我刚开始作为 UI 设计师的职业生涯,以前都是按照代码流来编写代码。但读完你的文章后,我终于真正理解了类和 ID 之间的区别。带 #id 的 URL 对我来说是全新的。希望我能用上它。非常感谢。
致敬
Ramanan Kalirajan
谢谢!!!我需要这个 :D
写得很好,解释得也很清楚。谢谢你——消除了围绕这些事物的许多困惑:)
-gowtham
谢谢!!你的帖子帮助我消除了关于 ID 和类之间区别的困惑。
多年来,我一直设计页面,在同一个页面上反复使用相同的 div/ID。据我所知,从未遇到过问题。我从未链接到过 div,除此之外,在同一个页面上多次使用相同 ID 显然是可行的。不过,我会改变这种做法。我一直以为必须在 div 中使用 ID,在 span 中使用类。这是我在多年以前读过的那本唯一一本“如何操作”的书中所阐述的。看起来更像是这样:必须在 div 中使用 ID,但可以在 div 或 span 中使用类。实际上,我搜索了这个页面,因为我怀疑自己需要更多地了解它们之间的区别。
我真的很喜欢使用 # 在地址栏中滚动页面部分。非常有趣。谢谢。
**如何在 CSS 文件中识别类标签?**
两年前,我在一次技术面试中被问到这个问题,但我没有完全答出来:)
谢谢。看到其他人也曾苦苦挣扎于 CSS,让我倍感鼓舞。我差点放弃了,因为我以为自己太慢了。现在,我想要继续学习。
去掉所有单引号。正确的拼写是 ID。单引号意味着它拥有某种东西,在任何情况下都不用于表示复数。
实际上,CSS 会区分它们。默认情况下,ID 的 CSS 属性会覆盖类属性,而忽略 CSS 流。当然,这只是证实了你的观点:只使用类进行样式设置,否则你的 CSS 会变成一堆 !important 声明。
解释得非常棒!
感谢你的解释。我目前正在学习网页设计课程,在示例中,讲师使用的是 id 而不是 class,但我在自己的网站上已经使用 class 属性来定义 div 了。很高兴知道它们之间并没有太大的区别,所以我不用把所有的 class 都改成 id。那样的话,要修改很多代码。再次感谢你的解释。我非常感谢。
很好的例子,但有一点需要注意:ID 是唯一的,意味着 ID 始终与那些只能在 div 中使用一次的元素相关联,比如
而类包含多个 div……就像 Java 中的类一样。
我使用的是 Foundation 5 框架,我发现有时 Foundation 会忽略我在类中添加的自定义格式(使用我自己的类名,没有与 Foundation 的名称重叠),但奇怪的是,如果我添加一个 ID,它就会服从。我有多个按钮使用相同的 ID,似乎可以使按钮文本在手机上变粗。不过,我猜多个元素使用相同的 ID 是不被允许的,将来我可能会因此挨骂。
总之,ID 似乎是定制框架的一种变通方法,这种框架对自己的样式选择很固执。
解释和类比都很好。感谢你的分享。
那为什么要使用 ID 呢?我的意思是,我们可以在 HTML 中直接为某个元素设置字体样式等属性……那么,为什么要使用 CSS 呢?CSS 在 ID 中有什么优势吗?
Chris,这篇文章很棒。谢谢。
您的代码格式看起来很优雅,您使用的是一些 WordPress 插件还是自定义编码?
CSS 很在意!(id 的优先级高于类。)
完全没明白。完全不懂。
仅供参考
在“条形码和序列号”部分的第三段中,“可重复使用”拼错了。
此外,在“类不唯一”的第二段中,您连续两次键入了“其他”。
但总的来说文章写得很好!
谢谢,已经修复了错误。