Open MangiDu opened 6 years ago
A CSS Module is a CSS file in which all class names and animation names are scoped locally by default.
组件的css样式和html结构必定是息息相关,合理的css命名能方便理解html的结构也方便维护和复用。
Block Element Modifier
.block {} .block__element {} .block--modifier {}
block-name__element-name--modifier-name
header
contaienr
menu
checkbox
input
menu item
list item
checkboc caption
header title
disabled
highlighted
fixed
size big
color yellow
<form class="form form--theme-xmas form-simple"> <input class="form__input" type="text" /> <input class="form__submit form__submit--disabled" type="submit" /> </form>
.form {} .form--theme-xmas {} .form--simple {} .form__input {} .form__submit {} .form__submit--disabled {}
The idea behind it is to divide the user interface into independent blocks. This makes interface development easy and fast even with a complex UI, and it allows reuse of existing code without copying and pasting.
.nav .nav__listItem .btn--orange {}
<a class="btn" href="http://www.jd.com"> <div class="nav__listItem">item one</div> <div class="nav__listItem">item two</div> </a>
不生成嵌套层级的写法
.block { @at-root #{&}__element {} @at-root #{&}--modifier {} }
除了BEM,还有其他的CSS命名规则,如SMACSS、OOCSS,并不是说BEM就一定优于它们,而是它们包括BEM都意图于形成一套帮助理解css和保持其可维护的规则。
起源于BEM,使用驼峰命名和连字符区分后代元素和修饰符
.ComponentName {} .ComponentName--modifierName {} .ComponentName-descendantName {} .ComponentName.is-someState {}
.ProductDetails {} .ProductDetails-price {} .ProductDetails-title--sale {}
完整名称: Object Oriented CSS,“面向对象CSS” 是比较早期的一种组织、编写、管理css的方案
两个主要的原则:
.mod {} .inner {} .talk {} .talk .inner {}
完整名称:Scalable and Modular Architecture for CSS,“可扩展、模块化CSS架构” 样式被划分为5个部分:
在Layout、State、Module这三种中使用不同的前缀来作区分 如
layout-
grid-
is-
module-
模块相关的元素使用一个 base name 作为前缀,如.exm和.exm-caption
.exm
.exm-caption
为模块编写样式时,避免使用id选择符和元素选择符
语义化命名
.example {} .example-title {} .example-contents {} .example .is-important {} // 使用单独的状态 .example-important {} // 或者把模块和状态合并起来
.mt-1 { margin-top: 1px; } .w-200 { width: 200px; }
Attribute Modules from CSS
<div button="large blue"></div> <div am-button="large blue"></div>
如下样式:
.button {} .button--large {} .button--blue {}
可以被转换为
[am-button] {} [am-button~='large'] {} [am-button~='blue'] {}
如果觉得这么写太unusual了太激进了,你可以考虑如下写法
<div am-button am-button-large am-button-blue></div>
Flat hierarchy of selecters, Utility styles, Name-spaced components 层级扁平的选择器,通用样式,带有命名空间的组件
w100
width: 100%
.sc-
shop cart
命名方式和bootstrap相似始终使用“-”中划线分割,不使用扁平的层级,带有命名空间的嵌套 以alert组件为例
@alert-prefix-cls: ~"@{ant-prefix}-alert"; .@{alert-prefix-cls} { &&-no-icon {} &-icon {} &-description {} &-success {} ... ... }
以button组件为例
@btn-prefix-cls: ~"@{ant-prefix}-btn"; .@{btn-prefix-cls} { &-primary {} &-ghost {} &-dashed {} &-danger {} ... ... &-background-ghost {} &-background-ghost&-primary {} &-background-ghost&-danger {} }
CSS模块
组件的css样式和html结构必定是息息相关,合理的css命名能方便理解html的结构也方便维护和复用。
BEM
Block Element Modifier
header
,contaienr
,menu
,checkbox
,input
,通常使用一个短名词来命名。menu item
,list item
,checkboc caption
,header title
disabled
,highlighted
,fixed
,size big
,color yellow
COMCEPT
WHY
实际运用时
使用Sass
不生成嵌套层级的写法
其他
除了BEM,还有其他的CSS命名规则,如SMACSS、OOCSS,并不是说BEM就一定优于它们,而是它们包括BEM都意图于形成一套帮助理解css和保持其可维护的规则。
SUIT
起源于BEM,使用驼峰命名和连字符区分后代元素和修饰符
OOCSS
完整名称: Object Oriented CSS,“面向对象CSS” 是比较早期的一种组织、编写、管理css的方案
两个主要的原则:
SMACSS
完整名称:Scalable and Modular Architecture for CSS,“可扩展、模块化CSS架构” 样式被划分为5个部分:
在Layout、State、Module这三种中使用不同的前缀来作区分 如
layout-
、grid-
is-
module-
模块相关的元素使用一个 base name 作为前缀,如
.exm
和.exm-caption
为模块编写样式时,避免使用id选择符和元素选择符
语义化命名
Atomic CSS
AMCSS
Attribute Modules from CSS
如下样式:
可以被转换为
如果觉得这么写太unusual了太激进了,你可以考虑如下写法
FUN
Flat hierarchy of selecters, Utility styles, Name-spaced components 层级扁平的选择器,通用样式,带有命名空间的组件
w100
-width: 100%
.sc-
-shop cart
一些其他厂规
NEC(网易)
ALICEUI(支付宝)
一些其他组件库的样式命名
bootstrap(block-name-element-name-modifier-name)
antd
命名方式和bootstrap相似始终使用“-”中划线分割,不使用扁平的层级,带有命名空间的嵌套 以alert组件为例
以button组件为例
element(BEM)
Bulma(原子式)
参考