待看文章
CSS
目前书写css所用的预处理器为:sass
规范选择的是:
CSS
1 | /* 好的方式 */ |
编译结果:
1 | @charset "UTF-8"; |
HTML中使用
1 | <div class="btn-twitter"></div> |
CSS命名
参考几种设计规范的思想,目前采取的是OOCSS结合SMACSS命名(语法基于sass)
使用规范
利用OOCSS思想来提取公共类
1 | // 可以分成几大类 |
利用SMACSS思想来给具体的dom命名
1 | // 某个页面的dom |
对于一些状态类的样式有两种方法
1 | // 直接定义在公共类中(这个适用于该状态样式能多次复用的情况) |
OOCSS
面向对象的CSS,主要思想是 “结构和设计的分离,容器和内容的分离”
简单的说就是抽象公共类,把复用度高的样式抽取出来,例如:
1 | .mt20 { margin-top: 20px } |
SMACSS
可扩展和模块化结构 CSS 的一个简称。
主要目标是 减少代码量,简化代码的维护。
在整个系列中,包括了base,modules,staes,themes。修饰符使用的是–,子模块使用__符号。
- Base 基本规则,整体样式,比如 body、input、button、form
- Layout 布局规则,比如 顶部,页脚,边栏,模块的大小等
- Module 可复用的模块样式规则
- State 状态样式 比如 隐藏 当前高亮
- Theme 主题 控制整体UI
BEM
BEM 是一种前端项目开发的方法学,由 Yandex 公司提出。BEM 的名称来源于该方法学的三个组成部分的英文首字母,分别是块(Block)、元素(Element)和修饰符(Modifier)。这三个不同的组成部分称为 BEM 实体。
Block——块
块即是通常所说的 Web 应用开发中的组件或模块。每个块在逻辑上和功能上都是相互独立的。块中封装了组件相关的 JavaScript、CSS 代码和 HTML 模板。由于块是独立的,可以在应用开发中进行复用,从而降低代码重复并提高开发效率。块可以放置在页面上的任何位置,也可以互相嵌套。
Element——元素
元素是块中的组成部分。元素不能离开块来使用。BEM 不推荐在元素中嵌套其他元素。
Modifier——修饰符
修饰符用来定义块或元素的外观和行为。同样的块在应用不同的修饰符之后,会有不同的外观。
1 | // 简单地说 |
举个栗子
如何使用呢BEM命名方法呢?请先看以下例子:
1 | //我们要为这个菜单写样式 |
“祖传”命名
放在以前,我们或许会这么写:
1 | <ul class="nav"> |
看了一下,还是多清爽的。但是各位朋友是否注意到了一个问题:子元素item和其父元素menu,从命名上看,关系似乎太不紧密。一个box也可以有item子类,一个xxx也可以包含一个item子类。看看其样式的写法:
1 | //sass |
从样式文件上看,仿佛也没有太大问题,但是,这是在我们代码层数较少的情况。如果是一个复杂的页面元素,我们sass层级会非常深。编译后的css,层级也会很深。
BEM命名
现在我们使用BEM再来编写看看:
1 | <ul class="nav"> |
乍看之下,根据 BEM 命名规则产生的 CSS 类名都会很复杂,但实际上在熟悉了命名规则之后,可以很容易理解其含义。其次,css不再存在复杂的层级关系,浏览器渲染的时候,样式系统从最右边的选择符开始向左进行匹配规则。只要当前选择符的左边还有其他选择符,样式系统就会继续向左移动,直到找到和规则匹配的元素,或者因为不匹配而退出,减少层级就能提升性能,对应静态css文件大小也会减少。
很多人会吐槽两个下划线和两个横杠作为连接符,并不优雅。但是我觉得,BEM是一种思想,是我们需要理解的,至于我们用什么样的连接符,什么样的方式实现,可以根据自己项目的情况考虑。
参考文章: