这两个 CSS 选择器有什么区别?
#someId
a#someId
它似乎像.
选择器一样工作。第一个选择器的意思是“选择具有 ID 的元素someID
”。第二个是什么意思?我是否认为这意味着“选择a
具有 ID 的元素someID
”?鉴于页面上只能有一个具有给定 ID 的元素,那么指定标签的目的是什么?第二个选择器是否具有更高的特异性?
是的,第二个选择器具有更高的特异性。
#someId
只是一个 ID,无论它是什么元素,都会选择具有该 ID 的任何元素。 a#someId
既是元素又是 ID,使其更加具体,因为它只会选择a
具有该 ID 的锚元素。
计算特异性和比较不同选择器的特异性有一个常见的技巧,那就是计算 ID、类和 X、X、X 等元素。最具体的选择器是最左边数字最高的选择器(如果是平局,则移至下一个数字)。
#someId
只是一个 ID,所以它是 1,0,0。
a#someId
是一个 ID 和一个元素,所以它是 1,0,1,因此更具体。
ID 总是比类更具体,类总是比元素更具体。为了计算特异性,伪元素算作元素,伪类算作类。从技术上讲,256 个元素 = 1 个类和 256 个类 = 1 个 ID,但是如果您在选择器字符串中发生了这么多事情,那么您需要担心更大的问题。
唯一比 ID 更具体的东西(除了包含多个 ID 的选择器字符串)是通过元素上的属性!important
声明的样式或内联样式。style
有关 CSS 特异性的更多信息:
It means,
select an
a
element having an idsomeId
Yes, it's more specific.
#someId
选择具有id
“someId”的元素
a#someId
id
选择带有“someId”的锚元素
第一个是更好的方法,假设您id
按照建议使用 unique s,并且它执行得更快(CSS 从右到左解析)
这不是一个关于在id
包含 s 时是否足够具体的问题,在这种情况下,id
应该只使用选择器。但是,如果存在类名或嵌套,则更高级别的选择有助于更准确地定位特定元素。然而,不要忘记矫枉过正和矫枉过正一样糟糕——这都是关于平衡的。
第二种形式a#someId 太过分了,因为理论上文档中不应该有两个具有相同 id 的元素。
我可以考虑使用它的一个原因是,如果页面中有一个元素改变了类型,但通过一些 Javascript 操作保持了相同的 id,并且你想要一些用于该特定 ID 的 CSS。
例如使用一些 jQuery:
<style>
p#someId { ....}
a#someId { ....}
</style>
<script>
$('#someID').replaceWith( '<a id="someId">Now a link</a>');
</script>
....
<p id='someId'>Not a link</p>