CSS 关于样式穿透

html-css016

CSS 关于样式穿透,第1张

前两天在项目中遇到一个问题,需要手动去修改引入的第三方组件的CSS样式,我第一想法就是直接在组件上新增一个自定义的class去覆盖原有的样式,结果当然是行不通的(不然我现在也不会在这里写这篇)。 于是我查了一下,是因为我在vue组件里面将设置成了局部样式,局部样式只在当前组件生效,对引入的其他组件是无法起作用的。然后我试了一下,把 scoped 去掉就行了。 或者在组件里面写多一份全局样式 但是如果不在style里面写 scoped ,直接写成全局样式,最后可能会面临多个组件之间样式污染的问题。如何使得局部样式可以覆盖到引入的第三方组件呢,我想到以前涉及过的一个名词 样式穿透 ,立刻实践了一下,果然就成了。样式穿透 需要定义一个外层的style,通过 >>>可以使得socped属性下的的样式穿透到全局, 外层 >>>第三方组件 或者 外层 /deep/ 第三方组件 。 >>>是 /deep/ 的别名,但是在sass之类的样式预处理器之中无法正确解析。

SCSS让CSS变的更像编程语言。于是,很自然的改变了CSS的传统组织方式。

关于BEM争议最大的就是其命名风格,这样:

<ul class="block-name">

<li class="block-name--element-name">…</li>

<li class="block-name--element-name">…</li>

</ul>

block + element + modifier,鼓励一级一级的写的非常具体,很长。

问题:

1. 这么长,影响书写效率。肯定会影响但这不是个很大的问题(自动提示会缓解一些)

2. html和css的size肯定会大一些。size大的顾虑是影响传输,在gzip面前可以忽略

3. 用户体验不佳。很违背习惯,但任何个人喜好和习惯作借囗都不职业

风格不重要。使用者更关心其好处:

1. SCSS嵌套过多。超过3层就很难阅读了。

2. 嵌套多,选择器的层级就会多,性能不知不觉变差

3. 复用。这么长的名,想冲突都难

还有一个代码设计上的原则,不暴露抽象类。举例:

以前:

<ul class="list list-member">

<li>xxx</li>

</ul>

.list是抽象的列表类。层叠的.list-member类,定义少量样类就可以实现一个成员列表的样式。

但是在其余编程语言里抽象类是不会被暴露出来的。借鉴BEM会是这样:

<ul class="member-list">

<li class="member-list__item">xxx</li>

</ul>

不在html里层叠抽象类,而是在SCSS里继承:

%list { ... }

.member-list {

@extend %list

}

.member-list__item {

// 不同的样式规则

}

这样更符合编程的特点。重要的是在维护上。假如变样了需要继承另一个抽象类,不需要改html,只要改css。这样SoC更彻底。

风格无非是某种形式,可以约束人做到一致。背后的设计思想才值得应用。如果用BEM的风格,但没做到抽象类的封装,没做到选择器的扁平,那就是失败的应用。