CSS的痛点
CSS 的规则是全局的,任何一个组件的样式规则,都对整个页面有效。相信写css的人都会遇到样式冲突(污染)的问题。
为了解决全局污染的问题,那就把class命名写长一点吧、加一层父级选择器、降低冲突的几率,那么CSS命名混乱了。
在引入一个组件时,如果class名称有冲突,则会影响原页面样式。
使用 CSS Modules
简介
CSS Modules不是将CSS改造的具有编程能力,而是加入了局部作用域、依赖管理,这恰恰解决了最大的痛点。可以有效避免全局污染和样式冲突,能最大化地结合现有 CSS 生态和 JS 模块化能力。
配置过程
安装 npm 包
bash1
npm install postcss-modules --save-dev
创建一个文件.postcssrc.js
javascript1
2
3module.exports = {
modules: true,
}组件中使用 css modules 的写法
/src/pages/PageA.jsx
javascript1
2
3
4
5
6
7
8
9
10
11
12import React from 'react';
import styles from './pageA.scss';
function PageA() {
return (
<div className={styles['page-a']}>
我是一段文字
</div>
);
}
export default PageA;/src/pages/PageA.scss
css1
2
3.page-a {
color: rgb(255, 0, 0);
}如果时全局样式,可以用 :global {} 包裹
/src/index.scss
css1
2
3
4
5
6
7
8:global {
.title {
display: block;
width: 100px;
height: 100px;
color: rgb(255, 0, 0);
}
}
推荐写法
在每一个组件的最外层容器使用css modules,其子元素还是用正常的 css 样式
组件样式文件遵循单一根节点原则,只有组件最外层容器className作为根节点,其子元素的样式均写在 :global{} 中
/src/pages/PageA.jsx
javascript
1 | import React from 'react'; |
/src/pages/PageA.scss
css
1 | .page-a { |