MangiDu / blog

0 stars 0 forks source link

有关 CSS 命名 #9

Open MangiDu opened 6 years ago

MangiDu commented 6 years ago

CSS模块

A CSS Module is a CSS file in which all class names and animation names are scoped locally by default.

组件的css样式和html结构必定是息息相关,合理的css命名能方便理解html的结构也方便维护和复用。

BEM

Block Element Modifier

.block {}
.block__element {}
.block--modifier {}
block-name__element-name--modifier-name
<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 {}

COMCEPT

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.

WHY

实际运用时

.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>

使用Sass

不生成嵌套层级的写法

.block {
    @at-root #{&}__element {}
    @at-root #{&}--modifier {}
}

其他

除了BEM,还有其他的CSS命名规则,如SMACSS、OOCSS,并不是说BEM就一定优于它们,而是它们包括BEM都意图于形成一套帮助理解css和保持其可维护的规则。

SUIT

起源于BEM,使用驼峰命名和连字符区分后代元素和修饰符

.ComponentName {}
.ComponentName--modifierName {}
.ComponentName-descendantName {}
.ComponentName.is-someState {}
.ProductDetails {}
.ProductDetails-price {}
.ProductDetails-title--sale {}

OOCSS

完整名称: Object Oriented CSS,“面向对象CSS” 是比较早期的一种组织、编写、管理css的方案

两个主要的原则:

SMACSS

完整名称:Scalable and Modular Architecture for CSS,“可扩展、模块化CSS架构” 样式被划分为5个部分:

在Layout、State、Module这三种中使用不同的前缀来作区分 如

模块相关的元素使用一个 base name 作为前缀,如.exm.exm-caption

为模块编写样式时,避免使用id选择符和元素选择符

语义化命名

.example {}
.example-title {}
.example-contents {}

.example .is-important {} // 使用单独的状态
.example-important {} // 或者把模块和状态合并起来

Atomic CSS

.mt-1 { margin-top: 1px; }
.w-200 { width: 200px; }

AMCSS

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>

FUN

Flat hierarchy of selecters, Utility styles, Name-spaced components 层级扁平的选择器,通用样式,带有命名空间的组件

一些其他厂规

NEC(网易)
ALICEUI(支付宝)

一些其他组件库的样式命名

bootstrap(block-name-element-name-modifier-name)
antd

命名方式和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 {}
}
element(BEM)
Bulma(原子式)

参考