我们知道CSS样式并不是只有一种的,因此,我们在使用CSS时难免会遇见CSS样式冲突的问题。当然,方法并不是只有一种,我们也要根据CSS样式冲突的原因进行分析,然后选出适当的解决方案。
通过使用组合器(Combinator)将选择器的描述写得更加精确(参考CSS选择器 - MDN),例如对于下述代码片段,如果想给.cellphones中的.apple增加样式,只使用.apple,势必会对.fruit中的.apple也造成影响。
<div class="cellphones">
<div class="apple"></div>
</div>
<div class="fruit">
<div class="apple"></div>
</div>
可以使用后代组合器(Descendant Combinator)或子代组合器(Child Combinator)这种更为精确的描述。描述得越精确,优先级越高,优先级更高的描述会覆盖优先级较低的描述。
/* 后代组合器:所有后代节点 */
.cellphones .apple {
border: 1px solid black;
}
/* 更加精确的后代组合器 */
body .cellphones .apple {
border: 1px solid blue;
}
/* 子代组合器:直接子节点 */
.cellphones > .apple {
border: 1px solid red;
}
如果给.apple按顺序加上上述全部样式,最终,边框将呈现蓝色。
本质上是上一种情况的特例。例如对于.apple,添加如下样式:
.cellphones > .apple.apple {
border: 1px solid purple;
}
.cellphones > .apple {
border: 1px solid red;
}
最终,边框将呈现紫色。
对于相同类型选择器指定的样式,在CSS文件中的顺序靠后的样式会覆盖之前的样式。 例如对于下述代码中的div元素,浏览器渲染的结果会是红色的:
<div class="redBorder" class="blackBorder"></div>
.blackBorder {
border: 1px solid black;
}
.redBorder {
border: 1px solid red;
}
需要注意的是,尽管在HTML文件中.blackBorder出现在.redBorder后,但优先级的判断是根据他们在CSS文件中的顺序。也就是说,CSS文件中更为靠后的.redBorder才会被采用。
还有一种简单粗暴但是并不建议的办法,就是在需要使用的样式后加上关键字!important可以将样式优先级提到极高。例如:
<div class="redBorder" class="greenBorder"></div>
.greenBorder {
border: 1px solid green !important;
}
.redBorder {
border: 1px solid red;
}
对于上述代码,边框将显示为绿色。
问题是死的,人却是活的,我们要根据实际情况选择最适合的方法来解决CSS样式冲突的问题,这样能够培养我们的思考能力和辨别问题的能力,才能完美地面对前端开发中遇到的各种问题。
代码小兵49806-11 15:28
代码小兵49806-11 15:51
代码小兵49806-11 16:22
代码小兵51603-29 17:28
暴风城-小飞04-06 20:49