CSS 如何实现模块化
什么是CSS Modules
ES6之前虽然语言层面上没有模块化的实现,但通过各种方法能够做到模块化的效果,也就是能够实现你和我写的代码可以相互不干扰,不会冲突。那在CSS中又是怎么实现两个CSS文件能不相互影响的呢?这就是CSS Modules要解决的问题。 先看看官方给的定义:
A CSS Module is a CSS file in which all class names and animation names are scoped locally by default.
实际上,CSS Modules 不是一个官方的标准,也不是浏览器的实现。而是你按照的 Modules 的写法(语法)去写CSS,然后通过构建工具转换,就能够实CCSS Modules。
CSS Modules 语法规则
全局作用域的样式
语法: :global(.className)
index.css
:global(.red) {
color: red;
}
这样,red 这个类就是一个全局的样式,和我们正常写的CSS是一样的。
局部作用域的样式
语法: :loacl(.red)
index.css
:local(.red) {
color: red;
}
或者:
.red {
color: red;
}
这样,red这个类就是一个具有局部作用的样式,它不会影响到其他的CSS。
类的组合(继承)
语法: composes: className
注意:这个语法只适用于局部作用域的Class
index.css
.red {
color: red;
}
.ele1 {
composes: red; // 继承了 red Class 的样式
font-size: 24px;
}
继承其他模块的类
index1.css
.red {
color: red;
}
index2.css
.ele {
composes: red from './index1.css' // 继承了index1.css 里的red Class
}
CSS Modules Complier
上面的写法不是CSS的语法,浏览器无法识别上面的写法,那如何让浏览器识别呢,这就需要用一个工具,将它转换成浏览器认识的CSS,这就CSS Modules Complier,例如webpack 的css-loader就实现了这个功能。
是如何实现局部作用的
下面是一个示意图:
通过CSS Modules 的写法写CSS,然后经过CSS Modules Complier 将CSS进行处理,最后会将这个CSS 文件以一个JS对象的形式输出。
要想在CSS里实现局部作用域,这就要保证你的Class名是独一无二的,这就是核心,CSS Modules Complier就是通过将局部作用域的Class Name 转换成一个独一无二的名字实现CSS Module 的。