覆盖CSS和选择器的数量

覆盖CSS和选择器的数量,css,twitter-bootstrap,Css,Twitter Bootstrap,我正试着把我的头脑集中在CSS上。我一直认为包含CSS文件的顺序很重要(它的“级联”部分)。我正在使用Bootstrap3,并试图覆盖活动顶部导航链接的背景色 为了做到这一点,我必须使用的确切选择器是:(实际上是SCS,但这不重要) 然后scss lint对我大喊大叫,因为我的应用深度大于3。但如果我尝试这样做: .navbar-nav > .active > a { background: $sp-blue; color: #fff; } 然后它停止工作。这是我不明白的。

我正试着把我的头脑集中在CSS上。我一直认为包含CSS文件的顺序很重要(它的“级联”部分)。我正在使用Bootstrap3,并试图覆盖活动顶部导航链接的背景色

为了做到这一点,我必须使用的确切选择器是:(实际上是SCS,但这不重要)

然后
scss lint
对我大喊大叫,因为我的应用深度大于3。但如果我尝试这样做:

.navbar-nav > .active > a {
  background: $sp-blue;
  color: #fff;
}
然后它停止工作。这是我不明白的。为什么必须在选择器中包含
.navbar default
?如果
.navbar nav
在其中,我就不需要更多了。必须完全按照在上一个样式表中使用的方式复制选择器,这很烦人。现在,如果我使用
!重要信息
,然后它会起作用,但我们都知道这是一种不好的做法


有人能帮我理解CSS的这一方面吗?

这是因为
默认值。导航栏导航>.active>a
更具体

尽管样式表的排序与浏览器如何分析哪个css更相关有关,但css的特殊性也起到了一定作用

基本上,CSS选择器越具体,它与浏览器的相关性就越大。比如说,我们按如下方式订购您的css:

/*this will be followed*/
.navbar-default .navbar-nav > .active > a {
  background: #fff;
}

/*this will be ignored*/
.navbar-nav > .active > a {
  background: #000;
}
尽管第二个选择器的顺序是最后一个,但它不能覆盖前一个选择器,因为它的特异性较弱。只有当另一个css与前一个css具有相同或更大的特异性时,它才能重写另一个css。但是当然,
!重要信息
是该规则的例外

进一步阅读:


这是因为
.navbar default.navbar nav>.active>a
.navbar nav>.active>a
更具体

尽管样式表的排序与浏览器如何分析哪个css更相关有关,但css的特殊性也起到了一定作用

基本上,CSS选择器越具体,它与浏览器的相关性就越大。比如说,我们按如下方式订购您的css:

/*this will be followed*/
.navbar-default .navbar-nav > .active > a {
  background: #fff;
}

/*this will be ignored*/
.navbar-nav > .active > a {
  background: #000;
}
尽管第二个选择器的顺序是最后一个,但它不能覆盖前一个选择器,因为它的特异性较弱。只有当另一个css与前一个css具有相同或更大的特异性时,它才能重写另一个css。但是当然,
!重要信息
是该规则的例外

进一步阅读:


这是一个奇妙的问题!这表明你实际上是在通过css思考,而不是数百万不问问题只是“重要”的新手每当有问题的时候。但你完全正确。据说写得很好的CSS有以下限制:

不要使用“重要!” “重要!”打破CSS的级联特性,使您的设计面临可维护性和简单性方面的问题: 见:

出于与“重要”相同的原因,避免大量的“适用性深度”同样,这导致设计不易维护、简单或易于重新设计: 见:

不要修改框架代码当然,你不应该回去修改框架的CSS。如果将来需要更新此代码,或者某个自动化过程会覆盖它,该怎么办?你的代码中断了

一个解决方案(如果您相信上述内容的话)是使用CSS规则,并以更有效的方式针对您的元素。使用CSS专用性计算器,例如:

我们可以找到其他方法更好地针对您的元素。根据计算器,元素的特异性为0031。但是,只有一个id

#mynav {
   background: $sp-blue;
   color: #fff;
}
得分0100,将满足上述约束条件。一个问题是有些人还说

出于与上述类似的原因,请勿使用IDs: 见:

不过,我们也可以使用“内联样式”(从计算器中可以看到)

不要使用内联样式

那么,有没有其他方法1)增加特异性2)不增加深度,不使用3)IDs 4)“重要!”5) 内联样式,还是6)修改框架代码?通过将多个类分配给一个元素(或父元素),我们可以在不增加适用性深度的情况下增加特定性。当然,这也会起作用

.thislink1.thislink2.thislink3.thislink4 {
  background: $sp-blue;
  color: #fff;
}
现在,当然,你不必为你的锚点分配4个不同的类,只是为了足够具体或者让你的深度小于3。如果将类指定给父类

.navbar-nav.mynav > .active.myactivelink {
  background: $sp-blue;
  color: #fff;
}
该分数为0040(深度为2)。如果您确定css修改是最后加载的(因为以后加载的规则优先),那么您可能会进一步简化此过程

这个分数为0031(深度为3),就像你的引导CSS一样,但是如果它是在引导之后加载的,它将被应用


要点:CSS不是一种被专家用来量化圈复杂度和代码质量等指标的计算机语言,它是一种没有对客观指标进行严格研究的样式表语言。很容易就可以知道,你有许多没有经验的电枢和比确凿证据更糟糕的建议。我当然不是专家,所以将以上内容视为“选项”。要意识到,从别人所遭遇的陷阱中学习风格是很重要的。但是您的具体情况包括您的偏好和您所处的开发环境类型,以及学习所有这些建议所需的时间。

这是一个非常好的问题!这表明你实际上是在通过css思考,而不是数百万不问问题只是“重要”的新手每当有问题的时候。但你完全正确。据说写得很好的CSS有以下限制:

不要使用“重要!” “重要!”打破CSS的级联特性,使您的设计面临可维护性和简单性方面的问题: 见:

Av
.navbar-nav > .active > a.mylink {
  background: $sp-blue;
  color: #fff;
}