无论如何使用CSS选择仅第一个后代。例如,无论如何都要从.container元素开始并设置< li class =“example”>的样式。带有蓝色边框,但不是< p class =“example”>在它里面?
我知道在CSS中有很多替代方法。但有没有办法用下面的确切代码来做到这一点?含义仅使用选择器类.container和.example,将类.container保留在下面的HTML中的确切位置,并使用下面的确切HTML标记。
<style>
.container .example{
border: 1px solid blue;
}
</style>
<div>
<div class="container">
<ul>
<li class="example"><p class="example"></p></li>
<li class="example"><p class="example"></p></li>
</ul>
</div>
</div>
答案 0 :(得分:14)
你的意思是“直接儿童选择器”吗?
.container > ul > li
..这是你的蓝色边框:
.container > ul > li {
border: solid 1px #00f;
}
..只使用类,你可以通过以下方式实现:
.container > * > .example{
border: solid 1px #00f;
}
css2方式(我认为仍然更强大)是向.example
添加边框并从.example .example
中删除:
.example{
border: solid 1px #00f;
}
.example .example{
border: none;
}
在CSS3中,你可以这样做:
:not(.example) > .example{
border: solid 1px #00f;
}
请注意,不会阻止.example > div > .example
获得蓝色边框。
但它保证不会.example
是另一个.example
的直接孩子会得到那种风格。
.container :not(.example) > .example
怎么办?
我不能用“干净”的CSS(即单一规则;没有重置等)来做得更好。
not()
选择器的含义是“匹配任何与选择器不匹配的项目”,而不是“禁止此选择器匹配规则中的某处”..
答案 1 :(得分:2)
怎么样:
li.example:first-child {border: 1px solid blue;}
答案 2 :(得分:2)
第一个直接的孩子:
.container ul > :first-child{
border: 1px solid blue;
}
http://codepen.io/sprynm/pen/PpKBRe
由于<ul>
和目标之间存在节点,.container
会增加一些复杂性。
答案 3 :(得分:0)
如果您使用的是精确标记,为什么仅限于选择器中的.container
和.example
类?
.container ul > li.example
会选择你想要的,虽然它不符合你的类限制。
(>
是子选择器)
另一个符合您所有限制的替代方案是:
.container .example {
border: 1px solid blue;
}
.container .example .example {
border: none;
}
它的局限在于它显然不会只选择第一个后代;它只是覆盖了所有非第一后代的风格。
答案 4 :(得分:0)
最简单的方法是:
.container ul li{
border: 1px solid blue;
}