CSS命名规范
BEM 是一种 CSS 命名规范。
# BEM
BEM(块、元素、修饰符)是一种基于组件的 Web 开发方法。其背后的想法是将用户界面划分为独立的块。这使得即使使用复杂的 UI 也能轻松快速地进行界面开发,并且允许重用现有代码而无需复制和粘贴。该笔记将围绕 BEM 核心模块,块(block)、元素(element)、修饰符(modifier)进行简述。
在选择器中可以使用以下三种符号来表示扩展关系
- 中划线(-) :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
- 双下划线(__):双下划线用来连接块和块的子元素
- 单下划线(_):单下划线用来描述一个块或者块的子元素的一种状态
# Block(块)
如下面的例子,li.item 是列表的一个子元素
/* 常规写法和BEM写法相同 */
.list
1
2
2
# Element(元素)
/* 常规写法 */
<ul class="list">
<li class="item">Pricing</li>
<li class="item">Contact</li>
</ul>
/* BEM写法 */
<ul class="list">
<li class="list__item">Pricing</li>
<li class="list__item">Contact</li>
</ul>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
/* 常规写法 */
.list {
}
.list .item {
}
/* BEM写法 */
.list {
}
.list__item {
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# Modifier(修饰符)
/* 常规写法 */
<ul class="list">
<li class="item">Pricing</li>
<li class="item">Contact</li>
</ul>
/* BEM写法 */
<ul class="list">
<li class="list__item_active">Pricing</li>
<li class="list__item">Contact</li>
</ul>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
/* 常规写法 */
.list {
}
.list .item {
}
.list .item.active {
}
/* BEM写法 */
.list {
}
.list__item {
}
.list__item_active {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 优点
BEM 难点在于明确节点的作用域,开始和结束,如何正确的使用,科学的使用。 BEM 保证样式不冲突的核心就是:在元素名中加入唯一的标识。这个标识在 BEM 中对应的是模块名,也可能是一个独一无二的乱序字符串。
- 摆脱特异性的困扰
- 修复继承问题
- 停止担心命名
# CSS 命名规则
# 短的比长的好
// 推荐
.some-intro {
...;
}
// 不推荐
.some-introduction {
...;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 组合比单命名更好
// 不建议
.header {
...;
}
//推荐
.cs-header {
...;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 面向属性和面向语义
/* 面向属性 */
.clearfix:after {
content: "";
display: table;
clear: both;
}
/* 面向语义 */
.header {
background-color: #333;
color: #fff;
}
.logo {
font-size: 0;
color: transparent;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 面向属性
- 优点:在于 CSS 的重用率高,性能最佳,即插即用,方便快捷,开发也极为迅速,因为它省去了大量在 HTML 和 CSS 文件之间切换的时间。
- 缺点:在于由于属性单一,其适用场景有限,另外因为使用方便,易被过度使用,从而带来更高的维护成本。
# 面向语义
- 优点是应用场景广泛,可以实现非常精致的布局效果,扩展方便; -缺点:在于代码啰唆,开发效率一般,因为所有 HTML 都需要命名,哪怕是一个 10 像素的间距。这就导致很多开发者要么选择直接使用标签选择器,要么就选择一个简单的类名,然后通过父子关系限定样式,结果带来了更糟糕的维护问题。
# 命名推荐
# 状态
前一个 prev
后一个 next
当前的 current
显示的 show
隐藏的 hide
打开的 open
关闭的 close
选中的 selected
有效的 active
默认的 default
反转的 toggle
禁用的 disabled
危险的 danger
主要的 primary
成功的 success
提醒的 info
警告的 warning
出错的 error
大型的 lg
小型的 sm
超小的 xs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 布局
文档 doc
头部 header(hd)
主体 body
尾部 footer(ft)
主栏 main
侧栏 side
容器 box/container
1
2
3
4
5
6
7
2
3
4
5
6
7
# 通用部件
列表 list
列表项 item
表格 table
表单 form
链接 link
标题 caption/heading/title
菜单 menu
集合 group
条 bar
内容 content
结果 result
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 组件
按钮 button(btn)
字体 icon
下拉菜单 dropdown
工具栏 toolbar
分页 page
缩略图 thumbnail
警告框 alert
进度条 progress
导航条 navbar
导航 nav
子导航 subnav
面包屑 breadcrumb(crumb)
标签 label
徽章 badge
巨幕 jumbotron
面板 panel
洼地 well
标签页 tab
提示框 tooltip
弹出框 popover
轮播图 carousel
手风琴 collapse
定位浮标 affix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 语义化
品牌 brand
标志 logo
额外部件 addon
版权 copyright
注册 regist(reg)
登录 login
搜索 search
热点 hot
帮助 help
信息 info
提示 tips
开关 toggle
新闻 news
广告 advertise(ad)
排行 top
下载 download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上次更新: 2024/01/18, 10:44:15