CSS选择器组合疑问:子选择器与分组选择器混用规则解析
CSS多选择器组合的核心规则解析
你对逗号分隔的选择器组理解有误——逗号在CSS里是用来分隔独立选择器的,不是用来把前面的上下文关联到后面的选择器上。
你的代码问题拆解
你写的div>div,p,实际上是两个完全独立的选择器:
div>div:匹配所有作为div直接子元素的div(这部分你预期对了)p:匹配页面中所有p元素,不管它在不在div里
这就是为什么页面里所有p(包括最底部那个独立的p)都应用了第三个规则的样式,而且因为这个规则写在单独的p{}后面,优先级相同的情况下后面的样式会覆盖前面的,所以p的背景色从橙色变成了蓝色。
正确实现需求的写法
如果你想匹配的是「div的直接子元素div」和「div的直接子元素p」,需要把上下文div>分别加到两个选择器上:
div>div, div>p { border:solid black 7px; background-color: blue; }
或者用CSS的:is()伪类简化写法(现代浏览器都支持):
div>:is(div,p) { border:solid black 7px; background-color: blue; }
这样修改后,只有div内部的直接子元素p会被选中,页面底部的独立p还是会用原来的橙色背景。
核心规则总结
- 逗号分隔的是独立选择器列表,每个选择器都是单独生效的,互相没有上下文关联
- 如果多个选择器共享同一个上下文(比如都在
div>下),要么重复写上下文,要么用:is()/:where()这类伪类来简化 - 同优先级的CSS规则,后定义的会覆盖先定义的
内容的提问来源于stack exchange,提问作者21CenturyBoy
相关产品推荐
相关产品推荐

