困扰问题
CSS全局作用域问题
CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。相信写css的人都会遇到样式冲突(污染)的问题。
- class命名写长一点吧,降低冲突的几率
- 加个父元素的选择器,限制范围
- 重新命名个class吧,比较保险
规范化
BEM,OOCSS,SMACSS
BEM:block-element-modify, 解决css命名重复
OOCSS: 类, 解决css 重用
但存在以下问题:
- JS CSS之间依然没有打通变量,css没有局部作用域
- 复杂的命名
CSS in JS
- 样式代码也会出现大量重复。
- 不能利用成熟的 CSS 预处理器(或后处理器)
使用JS 来管理样式模块
使用JS编译原生的CSS文件,使其具备模块化的能力
CSS Modules 能最大化地结合现有 CSS 生态(预处理器/后处理器等)和 JS 模块化能力1
// webpack.config.js
css?modules&localIdentName=[name]__[local]-[hash:base64:5]
/* components/Button.css */
.normal { /* normal 相关的所有样式 */ }
// components/Button.js
import styles from './Button.css';
buttonElem.outerHTML = `<button class=${styles.normal}>Submit</button>`
<button class="button--normal-abc53">Submit</button>
CSS Modules 实现了以下几点:
- 所有样式都是局部作用域 的,解决了全局污染问题
- class 名生成规则配置灵活,可以此来压缩 class 名
- 更好的压缩
- 只需引用组件的 JS 就能搞定组件所有的 JS 和 CSS
存在问题:
- 无法使用伪类,媒体查询等