我读了一篇带有一些css文件的文章
#mainNav #toTop a {
float: right;
margin: 0 8px 0 0;
font-size: 40px;
}
有人可以解释为什么他们#
在一个 css id 类型中有两个东西吗?我该如何使用它?
先感谢您
我不知道您所说的“CSS id 类型”是什么意思。所以我只是一般地解释一下 CSS,我们会看看这个代码段的作用是否变得清晰。
在 CSS 中,您有选择器和属性块。您的问题是关于选择器的:
#mainNav #toTop a
选择器用于定位(以及在某些其他平台上查询)HTML(有时是 XML)元素。此特定规则使用三个简单的选择器——两个 id 选择器和一个标签名称选择器——与两个后代组合器放在一起。
这意味着选择器将定位(并且伴随它的规则块将影响)任何锚元素(<a>
),该元素是任何元素的后代,而该元素id=toTop
又是任何元素的后代id=mainNav
。
由于 id 元素应该是唯一的,因此将其中两个元素放在一个选择器中似乎很愚蠢。如果你愿意,你可以这样做,有时你需要这样做:我们还没有谈到选择器的特异性。
特异性定义了哪些规则优先于其他规则。例如,如果两个元素似乎都针对同一个元素:
form .label { color: blue; }
#contact-us .label { color: green; }
/* what color is the label? */
...那么哪个规则优先?为了弄清楚这一点,我们计算了特异性。我不会解释数学。
因此,假设您的项目中有一个无法更改的 CSS 样式表 - 它来自 3rd 方供应商之类的,它看起来像这样:
#toTop a { /*...*/ }
如果您需要更改受该规则影响的元素的样式,您会怎么做?
您可以(并且可能会)定义一个更具体的新规则。一种方法是在规则中添加另一个 id 选择器:
#mainNav #toTop a { /*...*/ }
但实际上,您可以轻松添加任何其他选择器:
div#toTop a { /*...*/ }
实际上,是否有必要取决于您要执行的操作、与之交互的其他规则以及您正在处理的 HTML 类型。
这里还有一点需要考虑:CSS 样式表是用来重复使用的。如果该元素在文档中的不同位置应该表现不同怎么办?如果id="toTop"
有时id="mainNav"
在某些页面的元素内部,而在其他页面的不同位置(比如说在id="footer"
元素中)怎么办?如果它根据客户端 JavaScript 移动会怎样?然后你可能想像这样定义 CSS:
#mainNav #toTop a { /*...*/ }
#footer #toTop a { /*...*/ }
... 最终,为什么开发人员会选择这样做实际上取决于他们正在使用的 CSS、JavaScript 和 HTML。这绝对是不寻常的,但这不是不必要的,也不是不好的做法。
ID 必须始终是唯一的。但是,使用多个 id 来使样式更具体是有效的。
在您的示例中,您正在 #mainNav 中查找 ID 为 #toTop 的元素。
这是一个完全有效的 CSS 规则。这是非常具体的。这种使用的动机可能与页面布局的设计方式和/或 JavaScript 处理程序如何与 DOM 交互有关。
这是一个糟糕的 CSS 示例。您示例中的选择器层次结构是多余且不必要的。它说选择a
作为 ID 为的元素的后代的所有元素,该元素是 ID 为toTop
的元素的后代mainNav
。所以它假设一个基本的结构是这样的:
<div id="mainNav">
<div id="toTop">
<a href="#">link</a>
</div>
</div>
但是,由于ID 必须是唯一的,因此针对相同的元素只需要这样做:
#toTop a
#mainNav #toTop a
使用Descendant Combinator指定 id 元素a
的后代元素 id元素的toTop
后代元素mainNav
。
正如其他答案所说,这条规则似乎过于具体,因为ID
s 必须是唯一的,然后#toTop a
应该可以解决问题。
选择声明此规则的真正原因是:
假设在一个网站中你有一个或多个共享CSS(阅读:你没有为每个页面使用不同的 CSS),这条规则意味着:
- 在
a
是 的后代#toTop
但#toTop
也是#mainNav
元素的后代的页面中,则应用此规则;- 在
a
是 的后代#toTop
但#toTop
不是#mainNav
元素的后代的页面中,则不要应用此规则;
因为#toTop
可能是一个可重用的元素,可以在不同的地方(当然是每页一个)声明,例如在#mainNav
页面内部和#sideNav
另一个页面内部,具有所需的潜在不同行为和外观感觉。