我听说很多开发者厌恶 CSS。而在我的经验中,这往往是由于他们并没有花时间来学习 CSS。

CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具。从这点来说,也还算不错吧?

尽管如此,CSS 写得越多,你越容易发现一个巨大的弊端。

因为维护 CSS 真是老大难。

特别是那些写得差劲的 CSS 会很快变成程序员的噩梦。

这里向大家介绍一些命名规范,遵照这些规范可以省时省力,少走弯路。

对此你一定深有体会吧?

使用连字符分隔的字符串

如果你常写 JavaScript,那么你知道对变量使用驼峰式命名法(camel case)是一种惯例。

var redBox = document.getElementById('...')

这样很好,对吧?

但问题是这种命名法并不适用于 CSS。

请切忌以如下方式命名:

.redBox {
border: 1px solid red;
}

相应的,你可以这样写:

.red-box {
border: 1px solid red;
}

这是一种非常标准的 CSS 命名规范。也可以说更易读。

同时,这也和 CSS 属性名称保持了一致。

// Correct
.some-class {
font-weight: 10em
}
// Wrong
.some-class {
fontWeight: 10em
}

BEM 命名规范

不一样的团队在写 CSS 选择器(CSS selectors)有不一样的方法。有些团队使用的是连字符分隔(hyphen delimiters)法,还有一些倾向于使用一种叫 BEM 的命名法,这种方法更加有条理。

总的来说,这些 CSS 命名规范试图解决 3 类问题:

  1. 仅从名字就能知道一个 CSS 选择器具体做什么
  2. 从名字能大致清楚一个选择器可以在哪里使用
  3. 从 CSS 类的名称可以看出它们之间的联系

不知你是否见过这样的类名:

.nav--secondary {
...
}
.nav__header {
...
}

这就是 BEM 命名规范。

向 5 岁小孩解释 BEM 规范

BEM 规范试图将整个用户界面分解成一个个小的可重复使用的组件。

让我们来看看下图:

这可是个足以得奖的火柴人呢 :)

哎,可惜并不是 :(

这个火柴人代表了一个组件,比如说一个设计区块。

或许你已经猜到了 BEM 这里的 B 意为『区块』(‘Block’)。

在实际中,这里『区块』可以表示一个网站导航、页眉、页脚或者其他一些设计区块。

根据上述解释,那么这个组件的理想类名称即是 stick-man

组件的样式应写成这样:

.stick-man {

 }

在这里我们使用了连字符分隔法,很好!

E 代表元素(Elements)

BEM 中的 E 代表着元素。

整体的区块设计往往并不是孤立的。

比方说,这个火柴人有一个头部(head),两只漂亮的手臂(arms)和双脚(feet)。

The head , feet, and arms are all elements within the component. They may be seen as child components, i.e. children of the overall parent component. 这些 head、 feet 和 arms 都是组件中的元素。它们可视作子组件(child components),也就是父组件的组成部分。 如果使用 BEM 命名规范的话,这些元素的类名都可以通过在两条下划线后加上元素名称来产生。

比如说:

.stick-man__head {
}
.stick-man__arms {
}
.stick-man__feet {
}

M 代表修饰符(Modifiers)

M 在 BEM 命名法中代表修饰符。

如果说这个火柴人有个 blue 或者 red 这样的修饰符怎么办呢?

在现实场景里,这可能是一个 red 或者 blue 的按钮。这就是之前在讲的组件当中的限定修饰。

如果使用 BEM 的话,这些修饰符的类名都可以通过在两条连字符后加上元素名来产生。

比如说:

.stick-man--blue {
}
.stick-man--red {
}

最后这个例子展示的是父组件加修饰符。不过这种情况并不经常出现。

假如我们这个火柴人拥有另一个不一样的头部大小呢?

这一次元素被加上了修饰符。记住,元素指一个整体封装区块中的一个子组件。

.stick-man 表示区块(Block), .stick-man__head 表示元素(the element)。

从上例可以看出,双连字符也可以这样使用:

.stick-man__head--small {
}
.stick-man__head--big {
}

重申一次,上例中使用的双连字符是用来指代修饰符的。

这样你都明白了吧。

这就是 BEM 的基本用法。

个人来说,我在小项目中一般只用连字符分割法来写类名,在用户界面更复杂的项目中使用 BEM 方法。

关于 BEM,从这里了解更多

BEM - Block Element Modifier: _BEM - Block Element Modifier is a methodology, that helps you to achieve reusable components and code sharing in the…_getbem.com

为何要使用命名规范?

在计算机科学当中只有两类难题:缓存失效和命名 - Phil Karlton

命名的确很难。所以我们要尽量把它变得容易点,也为以后维护代码省点时间。

能正确命名 CSS 中的类名可以让你的代码变得更易理解和维护。

如果你选择 BEM 命名规范,在看标记语言(markup)时就更容易看清各个设计组件/区块之间的关系。

感觉不错吧?

和 JavaScript 关联的 CSS 名称

今天是 John 上班第一天。

他拿到了如下一段 HTML 代码:

<div class="siteNavigation">
</div>

因为刚好读了这篇文章,John 意识到这种命名方法在 CSS 中不是最好的方法。于是他讲代码修改成下面这样:

<div class="site-navigation">
</div>

看上去不错吧?

不过 John 没想到的是,他把整个代码库搞砸了 

CSS 命名规范将省下调试时间的更多相关文章

  1. 这些 CSS 命名规范将省下你大把调试时间

    我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...

  2. css命名规范: BEM 的命名法

    整理自:前端早读课[第1183期]这些 CSS 命名规范,将省下你大把调试时间 试图解决 3 类问题: 仅从名字就能知道一个 CSS 选择器具体做什么 从名字能大致清楚一个选择器可以在哪里使用 从 C ...

  3. html,css命名规范 (转)

    HTML+CSS命名规范总结 1.HTML部分 1.1添加必须的utf-8的字符集,并且使用HTML5的简洁 方式: <meta charset="utf-8"> 1. ...

  4. web前端开发CSS命名规范参考

    做为一个web前端工程师,每天接触HTML.css就像吃饭一样,但是作为一名合作.优秀的web前端工程师,对DIV+CSS命名还是有一定的规范的,本文整理了一份web前端开发中DIV+CSS各种命名规 ...

  5. CSS 命名规范及标题供参考与学习

    一.CSS 命名规范   XHTML-CSS写作建议 所有的xhtml代码小写 属性的值一定要用双引号("")括起来,且一定要有值 每个标签都要有开始和结束,且要有正确的层次 空元 ...

  6. CSS命名规范(规则)常用的CSS命名规则

    CSS命名规范(规则)常用的CSS命名规则   CSS命名规范(规则)常用的CSS命名规则   头:header   内容:content/container   尾:footer ...

  7. 通用CSS命名规范

    一.文件命名规范 样式文件命名主要的 master.css布局,版面 layout.css专栏 columns.css文字 font.css打印样式 print.css主题 themes.css [/ ...

  8. CSS 命名规范总结

    CSS 命名规范总结 BEM 命名给 CSS 以及 html 提供清晰结构,命名空间提供更多信息,模块化提高代码的重用,以达到 CSS 命名语义化.可重用性高.后期维护容易.加载渲染快的要求. 首先, ...

  9. 我认为最节省时间的CSS命名规范

    CSS命名规范一 js中对变量的命名最好使用camel case驼峰式命名法,但CSS中更适用于red-box命名规范. CSS命名规范二 BEM命名规范 B=>block E=>elem ...

随机推荐

  1. PAT 1010 Radix(X)

    1010 Radix (25 分)   Given a pair of positive integers, for example, 6 and 110, can this equation 6 = ...

  2. android studio import cannot resolve symbol错误

    试了好多,都不行 经过查阅和测试,发现如果上文的解决方式不可以的话,可以使用另一种: 删除项目.idea目录下的libraries目录 重新启动Android Studio 感谢作者:https:// ...

  3. sea.js模块加载工具

    seajs的使用 seajs是一个jS模块加载器,由淘宝前端架构师玉伯开发,它可以解决命名空间污染,文件依赖的问题.可以在一个js文件中引入另外一个js.require('a.js') 1.安装 np ...

  4. 机器学习基石笔记:Homework #4 Regularization&Validation相关习题

    原文地址:https://www.jianshu.com/p/3f7d4aa6a7cf 问题描述 程序实现 # coding: utf-8 import numpy as np import math ...

  5. PAT_A1103#Integer Factorization

    Source: PAT A1103 Integer Factorization (30 分) Description: The K−P factorization of a positive inte ...

  6. 剑指offer——60二叉树的深度

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.   题解: 简单的深度遍历即可.   class Solution ...

  7. mysql数据库中某字段一部分乱码

    笔者问题:mysql表(表中数据就是乱码,可能是插入时编码问题,这个问题以后解决)导出excel时数据中有乱码(但是在页面上查看是正常的),我们希望能导出一份没有中文乱码的excel 根据热力站中一次 ...

  8. 两台linux服务器传文件方法

    scp -r /当前服务器的文件的路径 第二台服务器的用户名@第二台服务器的ip:/第二台服务器的存放文件的路径

  9. C# 简单的统计指定几个字符组合的所有结果

    比如 用 a,b,c,d 4个字符组成一个8个长度的字符串,问一共有多少可能,应该有4的8次方种,用代码简单实现 private string[] AAA() { string[] cs = { &q ...

  10. UartAssist串口调试工具

    第一步安装UartAssist 第二步打开UartAssist 界面为 我们将我们的wifi模块连接电脑, 查看的端口号通过计算机管理设备管理器进行查看 根据要求发送数据 就可以了