0.bem
我是谁、我在哪里、我要干什么。这是一句哲学,你懂我意思吧
- bem是css的一种命名规范,这种规范被大范围使用,比如框架组件样式命名(bootstrap、elementui等等);
- css规范是非常有必要的,可以有效减少类名重复冲突(常见的命名污染),也更有利于读写;
- bem简单来说就是一句话
block-name__element-name--modifier-name:模块名 + 元素名 + 修饰器名
官方文档:点击跳转
1.实际使用
这里我以轮播组件举例,技术涉及到
1.1 首先,我们打出基础布局
<div class="aw-carousel">
<div class="aw-carousel__contain">
....
</div>
</div>- 最为层命名为
aw-carousel,aw为修饰名称、carousel为内容,以-分隔 - 里面命名继承外层名称
aw-carousel,而里层为内容容器,且我没有对其使用修饰名称(ps:如果加修饰,则为xx-contain),故单一取名为contain,以下划线__(ps:此处使用双下划线,也可以使用单下划线,看个人爱好)
1.2 然后,我们为其放入内容
.... 此处承接上一步的....
<button class="aw-carousel__arrow aw-carousel__arrow--left"></button>
<button class="aw-carousel__arrow aw-carousel__arrow--right"></button>
<div class="aw-carousel__item"></div>
<div class="aw-carousel__item aw-carousel__item--active"></div>
<div class="aw-carousel__item"></div>
....- 内容包含轮播子组件
aw-carousel__item以及左右指示器aw-carousel__arrow,由于两者为同级关系,所以常用相同的前缀aw-carousel(ps:注意,只是此处这样写,可以看出该内容的父节点名称为aw-carousel__contain,但仍使用了顶层aw-carousel。这样写是因为aw-carousel__contain与此处内容没有关系,仅作为子节点) - 由于左右指示器具有不同的样式(左、右),故这里使用了
aw-carousel__arrow--left aw-carousel__arrow--right来区分,观察其语法,使用--来连接,又因为其属于指示器aw-carousel__arrow,故使用其前缀 - 同指示器,子组件
aw-carousel__item存在激活状态,故以aw-carousel__item为前缀添加aw-carousel__item--active。如果认为此处无需关联或需要使用js去动态添加类名时,则将其命名为is-active等纯语义化名称也无伤大雅
2.注意事项
-
避免或禁止使用子代选择器
// bad .page-btn { .list {} span {} } -
遵守核心思想
// bad .page-btn__btn // 重复使用btn,语义错误 -
规范是死的,人是活的,只要不太离谱,基于
bem创建自己的写法也是可以的
