css命名管理混乱?不妨试试BEM
css的缺陷
我们知道,css使用中一个比较令人烦恼的问题,就是css没有作用域可言,我们写了一个组件或者模块之后,往往希望它们可以四处复用,但是由于css没有作用域,我们给样式命名的时候都会非常小心,因为害怕命名重复导致组件的样式被覆盖。于是,每个新加入项目的开发者在开发类似已有的组件时,很可能就自己重新命名一份新的样式表,以免和现有的重复,那么就会导致css文件像滚雪球一样越来越大。
现在市面上有许多旨在减少CSS代码量,且方便程序员合作和维护CSS代码的方案,例如OOCSS、SMACSS、SUITCSS,而BEM是其中最常被人提起的一个方案。
BEM是什么鬼?
BEM的本质其实只是一个css命名方案。
BEM is a highly useful, powerful and simple naming convention to make your front-end code easier to read and understand, easier to work with, easier to scale, more robust and explicit and a lot more strict.(BEM是一个非常有用,强大和简单的命名规范,使您的前端代码更容易阅读和理解,更容易使用,更容易扩展,更强大和更明确,更严格。)
以上是BEM官网的解释,可以知道它就是一个命名方案,那么它的规范是怎样的?为什么说它更容易阅读也更容易扩展呢?我们下面来看看BEM的具体命名规范。
BEM规范详解
所谓BEM,其实是三个单词的缩写:Block(模块)、Element(元素)、Modifier(修饰符)。
1.Block
一个块是一个独立的实体,就像应用的一块“积木”。一个块既可以是简单的也可以是复合的(包含其他块)。
命名规范:
块名称可以由拉丁字母,数字和短划线组成。 如:.block
如下图的搜索框和按钮组成的组件就是一个块。
2.Element
一个元素是块的一部分,具有某种功能。元素是依赖上下文的:它们只有处于他们应该属于的块的上下文中时才是有意义的。
下图中的input和button都是元素。
命名规范:
元素名称可以包含拉丁字母,数字,破折号和下划线。 CSS类名写成块名称加上两个下划线加上元素名称:.block__elem
3.Modifier
修饰符是块或元素上的标志。这些标志用来形容元素或块的外观、行为或状态。例如button、a标签上的active状态。
命名规范:
修饰符名称可以包含拉丁字母,数字,破折号和下划线。 CSS类名写成块或元素的名称加上两个破折号:.block--mod或.block__elem--mod和.block--color-black。
示例:
假设您有一个带有修饰符“theme:xmas”和“simple:true”的表单块,并且表单块带有input和submit元素。submit元素带有修饰符“disabled: true”,在未填充表单时禁止提交表单。
HTML
<form class="form form--theme-xmas form--simple">
<input class="form__input" type="text" />
<input class="form__submit form__submit--disabled" type="submit"/>
</form>
CSS
.form { }
.form--theme-xmas { }
.form--simple { }
.form__input { }
.form__submit { }
.form__submit--disabled { }
小结:
从上面的实例中,我们不难发现BEM有以下特点:
- 复杂甚至稍显冗长的类名极大减少了类名重复的可能性
- 每个块里的一类元素的样式对应一个类名。如此,一类元素对应一个类名,减少了子选择器或后代选择器的使用,提升了css的性能。
- css类名的命名更加语义化,更容易读懂
- 可复用性高,例如我们可以把主题类名form--theme-xmas替换,即可对应替换为别的主题样式
如何更方便地使用BEM
试想,BEM的命名规范这么长,如果我们自己手写那么长的类名,那非得累死不可。因此借助一些如less、sass的预处理器来帮忙,可以提升我们的开发效率。
以less为例,我们可以使用&符简化我们的代码:
.form {
width: 12rem;
height: 6rem;
&__input{
font-size: 16px;
}
&__submit{
background: blue;
&--disabled{
background: gray;
}
}
}
编译后:
.form {
width: 12rem;
height: 6rem;
}
.form__input {
font-size: 16px;
}
.form__submit {
background: blue;
}
.form__submit--disabled {
background: gray;
}
他山之石:
1.命名并非那么死板
实际上,很多团队在应用BEM的时候,都根据自己的业务作了一定的调整,比如Instagram团队使用的驼峰式: .blockName-elementName--modifierName { /* ... / },还有单下划线:.block-name_element-name--modifierName { / ... */ }。所以不用那么严格遵守,可根据自己的需要来变化。
2.修饰器的写法有可改进之处
有时候元素的状态需要js来控制,此时遵循BEM规范没有任何好处,比如激活状态,BEM推荐的写法是:
.block__element {
display: none;
}
.block__element--active {
display: block;
}
这样就需要我们知道block__element的名称,而且类名也会变得很长,而且active类的样式也无法复用,因此我们可以考虑用常规的操作增加例如.js-active或.is-active这样的类名来控制。
.block__element {
display: none;
}
.block__element.is-active {
display: block;
}
3.每个block可以单独一个css
由于BEM规范下产出的css独立性高,因此可以考虑每个组件单独一个css,当某个页面需要某个组件时,是需要把这个组件的css @import 到页面的css中即可。
/* page.css */
@import "form.css";
@import "slider.css";
.block__element {
display: none;
}
参考:
使用案例:
css命名管理混乱?不妨试试BEM的更多相关文章
- CSS 命名管理 之 BEM
好吧,将 BEM 简单的解释为 “Block-Element-Modifier“, 其实是个不负责任的做法.鬼知道 Block 是什么啊?所以,看了一些似懂非懂的中文解释之后,自己还是得去找些英文来读 ...
- CSS命名实践
前面的话 每次写HTML结构涉及到CSS命名时,都要挣扎一番.关于CSS命名的规范,市面上有不少,如OOCSS.SMACSS.BEM和MVCSS等.在这里面最火的应该算BEM了.本文将详细介绍CSS命 ...
- css 命名规则 BEM!
随着CSS的发展,使用CSS有语义化的命名约定和CSS层的分离,将有助于它的可扩展性,性能的提高和代码的组织管理.著作权归作者所有. BEM本质应该是一个css命名方案,最流行的命名规则之一就是BEM ...
- CSS命名方式=》BEM
时间:2016-11-04 20:04:53 原文地址:https://github.com/zhongxia245/blog/issues/48 一.背景 挺早就听说过BEM了,也大概的知道怎么用, ...
- css命名规范: BEM 的命名法
整理自:前端早读课[第1183期]这些 CSS 命名规范,将省下你大把调试时间 试图解决 3 类问题: 仅从名字就能知道一个 CSS 选择器具体做什么 从名字能大致清楚一个选择器可以在哪里使用 从 C ...
- 更好用的css命名方式——BEM命名
一.什么是BEM? BEM代表块(Block),元素(Element),修饰符(Modifier).无论是什么网站页面,都可以拆解成这三部分. 二.带你认识网页 我们来看一下qq的官网,它可以由三个块 ...
- html和css命名-望文生义
HTML+CSS命名规则 在一个内容较多的HTML页面中,需要设计许多不同的框架,再为这些不同的框架及内容进行分类,给予相应的名称,从而使得网页结构更加清晰,也为工作提供了方便.许多新手朋友在设计一个 ...
- html,css命名规范 (转)
HTML+CSS命名规范总结 1.HTML部分 1.1添加必须的utf-8的字符集,并且使用HTML5的简洁 方式: <meta charset="utf-8"> 1. ...
- css样式管理
css命名 传统网站页面(企业级),大概就是about,product,register等,他们的名字较好区分,他们的样式整体也不会很大,用简单的驼峰法就够了,或者简单的模块. 非传统企业页面,命名驼 ...
随机推荐
- docker pull下载镜像时的报错及其解决方法
使用docker pull从镜像仓库拉取镜像时报错如下: [root@docker-registry ~]# docker pull centos Using default tag: latest ...
- C++之构造函数拷贝
拷贝构造函数,顾名思义,就是通过拷贝对象的方式创建一个新对象.拷贝构造函数有两种原型(我们继续以book类来说明拷贝构造函数原型): book(book &b); book(const boo ...
- 蓝桥杯之 2n皇后问题(双层dfs,暴力)
Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...
- POJ 1904 King's Quest(SCC的巧妙应用,思维题!!!,经典题)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 10305 Accepted: 3798 Ca ...
- # RocEDU.课程设计2018 第三周进展 博客补交
RocEDU.课程设计2018 第三周进展 博客补交 本周计划完成的任务 (1).本周计划完成在平板电脑上实现程序的功能,跟第二周计划完成任务基本相似. 本周实际完成情况 (1).实际完成情况还差最后 ...
- Latex数学公式编写
小叙闲言 一直想用latex来编辑文档,但是没有需求,所以也没有去学习一下,但是最近由于要大量敲数学公式,有了latex数学公式的需求,所以来稍稍总结学习一下 1.在MathType中编写Latex数 ...
- jdbc获取blob类型乱码
一.使用场景: mysql数据库字段类型为longblob,在数据库里看中文字符正常,java读取字串的时候发现中文乱码 使用到了activeMq 二.排查: (1)修改eclipse的环境编码为ut ...
- [CF1067D]Computer Game[凸包/斜率优化+倍增+矩阵乘法]
题意 你有 \(n\) 个任务,初始收益为 \(a\) ,共 \(t\) 轮游戏,每轮可以选择完成一个任务(可以做多次),完成之后可以给任意任务升级,升级之后的任务收益为 \(b\) ,每个任务还有完 ...
- 设计模式 笔记 命令模式 Command
//---------------------------15/04/25---------------------------- //Conmmand 命令模式----对象行为型模式 /* 1:意 ...
- fatal error: caffe/proto/caffe.pb.h: No such file or directory
solution: $make clean $make all -j8