2013-05-08 59 views
4

我的问题应该是相当困难的。出于某种原因,我今天无法将头围住它。CSS优先级和针对特定元素

我正在做一个菜单的结构,像这样

<div class="wrapper"> 
    <ul> 
     <li class="menu-item"><a href="#">Menu Item</a> 
      <div class="inner"> 
       <a href="#">Login</a> 
      </div> 
     </li> 
    </ul> 
</div> 

我尝试使用下面的CSS选择器为目标的登录链接:

.inner a{} 

的选择工作,但是以下选择器正在接受css的主持,并且重写上述选择器:

li.menu-item a{} 

我完全困惑。为什么第二个选择器会在第一个选择时使用样式偏好?你们如何推荐我瞄准上述“a”元素?

+3

哪个选择器最后? – j08691 2013-05-08 16:15:23

+0

@ j08691没关系,具有两个类型选择器和一个类选择器的规则无论顺序如何都会跳过一个具有一个和一个类选择器的规则。阅读[CSS特性](http://www.w3.org/TR/selectors/#specificity)。 – robertc 2013-05-08 16:19:18

+1

@robertc - 谢谢,但我知道所有关于CSS的特殊性。我只是在问一个问题。 – j08691 2013-05-08 16:20:17

回答

10

为什么会第二选择需要的风格偏好?

因为第二个选择器比第一个更多specific。第一个包含一个一个类型选择器,而第二具有一个类和类型的选择器。

要计算的特殊性,认为一个选择四个数字的consiting,都开始(0,0,0,0)

另外:

+0

感谢您的详细信息。关于CSS的信息我显然需要存储。 – 2013-05-08 16:33:08

1

这是因为li.menu a包含三个部分来标识元素:父元素(li),父类(menu-item)和元素(a)。你想要的选择器只有两个,所以你可以修改它为:

li.inner a{} 

它应该工作。

编辑:

我知道我回答了这个前:在第一Why does my HTML not use the last style defined in the CSS?

+0

感谢您的提示。以下选择器正在为我工​​作,div.inner a {} – 2013-05-08 16:22:05

2

CSS选择附加有一 “重量” 系统,

  • 元素,伪元素:d = 1 - (0,0,0,1)
  • 类,伪类,属性:c = 1 - (0,0,1,0)
  • Id:b = 1 - (0,1,0,0)
  • 内联样式:a = 1-(1,0,0, 0)

so y我们的第一个选择器的得分为(0,0,1,1) ,而第二个选择器的得分为(0,0,1,2),因此优先级高于

0

CSS优先级由具有最高特异性的DOM对象。

那么什么是特异性?

Element Selector -- 1 
Class Selector -- 10 
ID Selector -- 100 
Inline Selector -- 1000 

在您的例子: .inner一个是11分

a(1) + .inner(10) = 11 

li.menu项目一个是12分

li(1) + .menu-item(10) + a(1) = 12 

所以这就是为什么第二个会是怎样的所示。要使正确的样式显示,只需使其更具体,例如使用 .menu-item .inner a

这里有一篇很好的文章。 http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html

0

您可以将CSS仅适用于每一个元素中的锚,是这样的:

li.menu-item > a{} 
.inner > a 

这样做,这样,规则“li.menu项目是”不会在干涉其他主播。