奇怪的css选择器组合

时间:2013-02-18 14:31:16

标签: css css-selectors css-specificity

这是我的代码:

HTML

<div id="corner">
    <div id="cornerbox"></div>
</div>

CSS

#corner {
    background-color: red;
    width: 200px; height: 200px;
}
#corner #cornerbox {
    background-color:black;
    width: 100px; height: 100px;
    opacity: 0.4;
}
#corner:hover  #cornerbox, #corner #cornerbox.show{
    opacity: 1;
}

JavaScript

$(document).keypress(function(e) {
        //console.log("keypress event from document: ",e.which);
        if (e.which == 63) {    // question mark (?) key
            $("#cornerbox").toggleClass("show");
        }
});

JSFiddle Code is here

因此,当#corner:hover时,CSS会使“#cornerbox”改变不透明度,只要按下问号(?)键,JavaScript就会切换“#cornerbox”类的“show”。

我注意到如果我将上面的CSS更改为如下所示:

#corner {
    ...
}
#corner #cornerbox {
    ...
}
#corner:hover #cornerbox, #cornerbox.show {
    ...
}

按下(?)键时不改变不透明度,但“#cornerbox”接收类“show”。

所有其他可能性都有效。

这很有效。

#corner {
    ...
}
#cornerbox {
    ...
}
#corner:hover #cornerbox, #corner #cornerbox.show {
    ...
}

这很有效。

#corner {
    ...
}
#cornerbox {
    ...
}
#corner:hover #cornerbox, #cornerbox.show {
    ...
}

为什么?

提前谢谢!

田濑

1 个答案:

答案 0 :(得分:6)

这是因为选择器#cornerbox.show的{​​{3}}小于#corner #cornerbox,这意味着它无法覆盖它。

如果通过添加id选择器来增加#cornerbox.show的特异性,或者通过删除id选择器来减少#corner #cornerbox的特异性,则新状态允许第二个选择器覆盖。