CSS实践:增加CSS选择器优先级、全局调整盒模型
增加CSS选择器优先级
在平常开发中,会有不少几率遇到需要增加CSS
选择器优先级的场景。如何实现才会更好,比如说需要增强下面这个CSS
选择器优先级:
.bar { background: #DDD; }
复制代码
我相信不少人会选择增加嵌套的方法:
.foo .bar { background: #DDD; }
复制代码
或者选择增加一个标签选择器:
div.bar{ background: #DDD; }
复制代码
这些都不是最好的方法,因为上述方法会增加了耦合导致可维护性的降低,如果后续父节点类名更改了,或者换成不同的标签,都会影响到样式效果。
最佳方法
- 重复选择器自身
.bar.bar { background: #DDD; }
复制代码
- 借助存在的属性选择器
.bar[class] { background: #DDD; }
#bar[id] { background: #DDD; }
复制代码
这样即提高了优先级,又不会增加耦合度。
全局调整盒模型
box-sizing
的默认值是content-box
,这意味着指定的宽高都只会设置内容盒子的大小。如果设置了内边距或者边框都会使该元素宽高大于指定的宽高值。最笨的办法就是减少width
或height
的值,这不是一个理想的办法,因为这是通过改值试出来的,而且往往难以解释这个值生成的原因。
设置box-sizing
值为border-box
,这样height
和width
属性会设置为内容、内边距以及边框的大小总和,这就解决了上述问题。
.main{
box-sizing: border-box
}
复制代码
这样main
元素就更好符合预期了,但其他元素还会遇到相同的事情。所以将其设置为全局
*,
::before,
::after{
box-sizing: box;
}
复制代码
这样就能给页面上所有元素与伪元素都设置border-box
了。
但这样还是有些问题,现在很多业务都会使用带样式的第三方组件,就可能会因此破坏其中一些组件的布局,尤其是当第三方组件在开发css
的过程中没有考虑到使用者会修改盒模型。
利用继承就能解决上述问题了:
:root{
box-sizing: border-box;
}
*,
::before,
::after{
box-sizing: inherit;
}
复制代码
盒模型通常不会被继承,但使用inherit
关键字会强制继承。可以在必要时选中第三方组件的顶级容器,将其恢复为content-box
。这样组件的内部元素就会继承该盒模型:
.third-component{
box-sizing: content-box;
}
作者:zhangwinwin
THE END