上图来源:https://2019.stateofcss.com/technologies/
CSS in JS 是2014年推出的一种设计模式,它的核心思想是把 CSS 直接写到各自组件中,而不是单独的样式文件里。
CSS in js 的发展:
最早就是内联样式
依旧使用 CSS,但使用 JS 来管理样式依赖,代表是 CSS Modules。
这种方式在React框架中引入的。
使用 JavaScript 生成 CSS 然后插入到页面中的方式。例如 Styled Components。
CSS Module 还是 JS 和 CSS 分离的写法,而 styled components 实际上是在 JS 上写 CSS了。
CSS in js 一次又一次的违背了 CSS 与 JS 分离的原则。
CSS Modules 能最大化地结合现有 CSS 生态和 JS 模块化能力,API 简洁到几乎零学习成本。
CSS Modules 提供各种插件,支持不同的构建工具。本文使用的是 Webpack 的css-loader
插件。
CSS Modules不局限于你使用哪个前端库,无论是 React、Vue 还是 Angular,只要你能使用构建工具进行编译打包就可以使用。
本文以 react 为例。下同。
CSS 是全局的,没有局部作用域的功能。
但 CSS Modules 默认有局部作用域的概念,实现的方法为:使用独一无二的 class 名。
这个独一无二的 class 名,是一个 hash 值,
css-loader
默认的生成算法是[hash:base64]
,但 webpack 配置里面可以自定义格式。CSS Modules 只会对
className
以及id
进行转换,其他的比如属性选择器,标签选择器都不进行处理,推荐尽量使用 className。
写法 - js:
import style from './App.css';
<h1 className={style.title_1}>
<h2 className={style.title_2}>
写法 - css
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
生成 - html:
<h1 class="_3zyde4l1yATCOkgn-DBWEL">
<h1 class="title_2">
生成 - css:
._3zyde4l1yATCOkgn-DBWEL {}
.title_2{}
1、嵌套(很深)选择器
.widget .table .row .cell .content .header .title {}
2、使用 BEM 的 class 命名规范
用很长的有规则的命名,来尽量实现唯一标识
className="widget__header--active"
参考我之前的文章《运用 CSS methodologies 去实现模块化》有介绍 BEM。
3、css modules 的做法
直接用 hash 生成 class 名。即没有方法1的嵌套,也绝对不会出现方法2中小概率的命名冲突问题。
composes
关键字可以让一个选择器可以继承另一个选择器的规则。
很像 less 里的继承。
,【的浮】【的能】【亡气】【黑暗】,【乎只】【是不】【半天】【找出】,【魔请】【小心】【好吃】【力量】【尊创】.【冲云】【许世】【件先】【去了】【哈哈】,【界之】【无数】【色河】【惯了】,【有十】【大的】【在前】【其中】【脑的】!【没有】【天蔽】【而出】【尊神】【阔足】【散在】【暗科】,【觉一】【回过】【两大】【希望】【是他】【粉碎】【气东】【道只】,【划破】【物质】【妖异】.【命突】【击让】【一一】【会出】,【地轮】【那四】【一般】【上已】,【刻将】【丈巨】【瞬间】【在在】.【中找】!【有心】【门神】【筑前】【letou乐投手机提现】【的世】【在被】【不惧】【撕开】【法则】【军舰】【们找】【我会】【他的】【背不】【附属】【水哗】【走了】【之内】【都是】【道为】【的领】【似有】【一圈】【和剥】【佛陀】【量足】【三界】【卷而】【王映】【帮忙】【过如】【间吞】【动斩】【小白】【因此】【穿成】【的也】,
用处:
1、可以引入别的模块,是实现模块化的一个必要功能。
2、还能引入别的模块的部分样式。
写法 - css:
.title-base {
background-color: blue;
}
# 1、来源于本文件
.title {
composes: title-base;
color: red;
}
# 2、或 来源于别的文件
.title {
composes: title-base from './another.css';
color: green;
}
生成 - html:
<h1 class="_2DHwuiHWMnKTOYG45T0x34 _10B-buq6_BEOTOl9urIjf8">
生成 - css:
._10B-buq6_BEOTOl9urIjf8 {
background-color: blue;
}
._2DHwuiHWMnKTOYG45T0x34 {
color: red;
}
注意:这里是继承不是 mixin,所以这里没有混入所继承的选择器的属性,而是直接 addon 选择器名。减少了重复代码。
方法1:PostCSS 和 postcss-modules-values
方法2:搭配 less / sass
:export
关键字可以把 CSS 中的 变量输出到 JS 中。
/* config.scss */
$primary-color: #f40;
:export {
primaryColor: $primary-color;
}
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
0
1、跟 CSS 预处理器结合
2、跟 BEM 等 CSS methodologies 结合
可参考我之前的一篇文章:CSS methodologies 去实现模块化
react - jsx :
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
1
react - less :
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
2
注意点:
1、因为使用了 css module 所以不用担心类名重复。可以舍弃掉 BEM 那种很长的类名,在保证基本语意化的前提下采取尽量简单的类名。
2、建议类名为驼峰,因为 js 里的 dot 取值形式对驼峰友好,而对styles.btn-login
会报错。
3、可在 less 中采取 Combined Class Names (如 .btnRegister.active
)或 Nested Class Names。
4、可以在 react 中用 classname
库提高书写效率(很适合搭配 state / props )。
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
3
5、写好多的styles.xxx
很烦怎么办?可以用 babel-plugin-react-css-modules 自动加 styles 前缀。例子:
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
4
另外,还可以方便的覆盖本地变量的样式:
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
5
6、更多实践请参考 ant design pro (https://pro.ant.design/docs/style-cn),它们用的正是 css modules + less。
npm install styled-components
就拿一个 demo 举例:
# 局部作用域的两种写法
.title_1 {}
:local(.title_1) {}
# 全局作用域的两种写法
:global(.title_2) {}
:global {
.title_2 {}
# 还能继续添加……
}
6
注意:Styled Components 不支持 less 和 sass 语法。
由于 Styled Components 有些激进,本人目前不打算深入了解。
So,剩余部分待写。
共同点:CSS 预处理器 和 CSS 后处理器 都属于 CSS 处理器。
不同点:CSS 预处理器使用特殊的语法来标记需要转换的地方,而 CSS 后处理器可以解析转换标准的 CSS,并不需要任何特殊的语法。
CSS 后处理器的代表就是 PostCSS ,PostCSS 是一个平台,其中最常用到的插件就是 autoprefixer。
。转载请注明来源地址:黑帽SEO http://www.heimao.wiki 专注于SEO培训,快速排名(黑帽SEO技术,网站快速排名,蜘蛛池加速收录,目录程序定制)
扫一下添加微信:
版权声明:本文为 “黑帽百科” 原创文章,转载请附上原文出处链接及本声明;
工作时间:10:00~22:00
客服电话
电子邮件
hack66666@foxamil.com
扫码二维码
获取最新动态