命名规则
常见难点与痛处
难以理解
每个人起名字的风格不同,可能有人习惯将样式写在同一类名下,有人又习惯将不同的样式区分类名(但是名字又只有作者自己才能意会,也许过一阵子也意会不了了)。
难以复用
通常来说,当我们复用 CSS 代码时,总是会发现有那么一个或两个样式跟现在需要的样式不同,因为这个样式很可能是当时作者认为是为特定元素而写的,或者它是从其他地方继承而来了一些属性,这时我们无法修改,只能再复制出一份代码。
于是新的问题又来了,代码不仅没复用成功,还增加了一倍的代码维护负担。
难以维护
不仅是上述的原因导致了维护困难。当我们更新一个页面的样式的时候,却破坏了另一个页面的样式,当我们决定覆盖它时,却又陷于优先度的问题。
模块化思想
在命名和组织 html 标签和 CSS 样式时,我们不应当从页面级的角度去思考,而应当将页面视为由无数个模块组成的,每个模块互不干扰,像乐高积木一样组织页面。
推崇模块化方法的三大模式如下
OOCSS
面向对象的 CSS,OOCSS 核心思想是:对象是可重用的模式(pattern),其视觉外观不由上下文决定
核心思想
上下文无关
无论对象的位置在哪里,一个对象都应该看起来无差别,不应根据对象的上下文设置对象的样式。
例如,不是将侧边栏中的所有按钮都设置为橙色,将主区域中的所有按钮设置为蓝色,而是应该创建一个蓝色的按钮类,以及一个橙色的 modifier。这样做橙色按钮可以在任何地方使用,它们没有被绑定在侧边栏上,它们只是你的按钮样式之一。
皮肤(主题)
为常见的视觉模式创建可复用的类。
一个网页中结构是不可变,也可能是独立的,但是诸如背景颜色,边框等样式时可以抽离并复用的,应当将其分离出来单独创建。
使用 Class
CSS 不应当由 HTML 标签决定, .site-nav
而不是 #header ul
。
不使用 ID
尽量使用 class,id 选择器会扰乱优先级。
BEM
三个字母分别代表 Block(块)、Element(元素)、Modifier(修饰符)。
Block(块)
块是网页逻辑和功能的独立组件。
首先,块是可嵌套的。它们应该能被包含在另一个块中,而不会破坏任何样式。例如,可能在侧栏中有一个标签界面小部件的块,该块可能包含按钮,这些按钮也是一种单独的块。按钮的样式和选项卡式元素的样式不会相互影响,一个嵌套在另一个中,仅此而已。
其次,块是可重复的。界面应该能够包含同一块的多个实例。
Element(元素)
元素是块的组成部分,它不能在块之外使用。一个不错的例子:一个导航菜单,它包含的项目在菜单的上下文之外没有意义。你不会为菜单项定义块,菜单本身应定义为块,而菜单项是其子元素。
Modifier(修饰符)
修饰符定义块的外观和行为。例如,菜单块的外观的垂直或水平,取决于所使用的修饰符。
命名约定
BEM 所做的另一件事是定义了非常严格的命名约定:
.block-name__element--modifier
这看起来有点复杂,我来分解一下:
- 名称以小写字母书写
- 名称中的单词用连字符(-)分隔
- 元素由双下划线(__)分隔
- 修饰符由双连字符(--)分隔
不嵌套 CSS
使用 .btn__price
而不是 .btn .btn__price
。
即使是在 Sass 或 Less 也不该使用层级嵌套,但是可以使用 .btn__text
然后用 .btn--orange .btn__text
来覆盖应用了修饰符按钮的文本颜色
SMACSS
SMACSS 的含义是 CSS 的可扩展性和模块化架构(Scalable & Modular Architecture)
SMACSS 更像是对 OOCSS 和 BEM 的扩展,即通过命名规则以更好的识别区分 CSS 类名的作用。
类别
CSS 系统可能包含的规则定义的类别:
- 基础(base) 规则是HTML元素的默认样式,如链接,段落和标题。
- 布局(grid) 规则将页面分成几个部分,并将一个或多个模块组合在一起。它们只定义布局,而不管颜色或排版。
- 模块(module)(又名“对象”或“块”)是可重用的,设计中的一个模块。例如,按钮,媒体对象,产品列表等。
- 状态(state) 规则描述了模块或布局在特定状态下的外观。通常使用 JavaScript 应用或删除。例如,隐藏,扩展,激活等。
- 主题(theme) 规则描述了模块或布局在主题应用时的外观,例如,在 Yahoo Mail 中,可以使用用户主题,这会影响页面上的每个模块。
命名约定前缀
- 布局(grid)(.g-):将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等!
- 模块(module)(.m-):通常是一个语义化的可以重复使用的较大的整体!比如导航、登录、注册、各种列表、评论、搜索等!
- 元件(unit)(.u-):通常是一个不可再分的较为小巧的个体,通常被重复用于各种模块中!比如按钮、输入框、loading、图标等!
- 功能(function)(.f-):为方便一些常用样式的使用,我们将这些使用率较高的样式剥离出来,按需使用,通常这些选择器具有固定样式表现,比如清除浮动等!不可滥用!
- 皮肤(skin)(.s-):如果你需要把皮肤型的样式抽离出来,通常为文字色、背景色(图)、边框色等,非换肤型网站通常只提取文字色!非换肤型网站不可滥用此类!
- 状态(.z-):为状态类样式加入前缀,统一标识,方便识别,她只能组合使用或作为后代出现(.u-ipt.z-dis{},.m-list li.z-sel{}),具体详见命名规则的扩展相关项。
命名约定前缀参考自网易NEC
总结
以上皆为各框架的罗列,具体实践个人认为应当综合使用,命名规则应当更加详细,诸如代码规范应当更加详尽规定(待补充)