Ben Frain曾说过,写css代码很轻易,然则扩大和保护却很难。本文就引见了一套计划来处理这个题目。
OOCSS
OOCSS 意为面向对象的CSS。这类要领有两种主要 看法:
- 构造与设想星散
- 容器和内容星散
运用这套构造,开辟者能获得能够在差别处所运用的平常类。
在这一步,会存在两点(一般就好和坏):
- 好: 经由过程反复应用削减代码量 (DRY准绳)。
- 坏: 组合运用。当你转变一个特定元素的款式, 你须要转变的很有能够不仅仅是CSS(由于大多是类都是大众的),而且还会增加新的类。
别的,这类OOCSS的要领自身并没有明白的划定规矩,而是笼统的发起,所以这类要领在生产中的效果会有差别。
现实效果就是,这类OOCSS的头脑启发了其他人竖立出属于他们本身更详细的代码构造。
SMACSS
SMACSS 意为可扩大、模块化(Scalable and Modular Architecture)的CSS。这类要领的主要目标是削减代码量,而且使代码保护更简朴。
Jonathan Snook将款式分为了5个部份:
- Base rules. 这些是主要的网页元素款式 – body, input, button, ul, ol等。在这部份, 我们主要运用
HTML标签和属性挑选器, 特别的情况下运用 – 类 (比方, 你有JavaScript的款式挑选); - Layout rules. 这些是全局元素的款式,比方<caption> <footer> <sidebar>的尺寸等。Jonathan发起在这些元素中运用id挑选器,由于这些元素在页面中不会涌现凌驾一次。但是,这篇文章的作者以为这并非好的做法。(在款式文件中,不论id什么时候涌现,都邑在别的的某个处所形成些贫苦).
- Modules rules.在单个页面中,块会被屡次运用。关于模块的分类,并不发起运用id和标签挑选器(离别为了反复运用和上下文独立性)。
- State rules. 在这一部份,划定了模块的差别状况和网页基本,这是唯一能够运用关键字!Important 的处所。
- Theme rules. 设想你能够须要替换的款式。
别的,还发起对属于某个特定分组的类设定定名空间,并为JavaScript中运用的类运用零丁的定名空间。
这类要领使得编写和保护代码都越发轻易,而且吸收了许多开辟者。
Atomic CSS
运用Atomic CSS,为每一个可重用的属性竖立一个零丁的类。比方 margin-top: 1px;就能够竖立一个类 mt-1,width: 200px;能够竖立一个w-200。
这类作风许可经由过程反复声明来尽量削减代码,而且转变模块款式也相对轻易,for example, when changing a technical task.
但是,这类要领也有很大的瑕玷:
- 类名都是形貌性的属性名,而不是对元素自身的语义化形貌,有时会使得开辟复杂化。
- 直接在HTML中显现设置。
由于这些瑕玷,这类要领遭到了大批指摘。然则,这类要领关于大型项目而言,照样很有用的。
别的Atomic CSS也被用在差别的框架里来指明改正元素款式,另有一些别的要领的展现层。
MCSS
MCSS是多层CSS。这类誊写代码的作风发起将款式分为几个部份,称为层(layers)。
- 底层(Zero layer or foundation)。这层代码担任重置浏览器款式(比方reset.css 和
normalize.css); - 基本层(Base layer)包括网站反复运用的元素的款式:按钮、文本输入框等。
- 项目层(Project layer)包括零丁的模块和一个“上下文”——依据客户端浏览器,检察站点/应用程序的装备,用户角色等对元素的修正。
- 润饰层(Cosmetic layer)代码是OOCSS的作风,对元素的表面做一些小的修正。发起只保存影响元素表面,但不会损坏网站规划的款式(比方色彩和不主要的缩进)。
层级之间的交互条理是很主要的:
- 基本层(base layer)定义中性款式,不影响其他层。
- 基本层(base layer)的元素只会影响本层的类。
- 项目层(project layer)的元素能影响基本层和项目层。
- 润饰层(cosmetic layer)是以形貌性OOCSS类(“atomic”类)的情势设想的,而且不会影响其他的CSS代码,可挑选性的用于标记当中。
AMCSS
AMCSS就是”Attribute Modules for CSS(css的属性模块)”。
让我们看一个例子:
<div class="button button--large button--blue">Button</div>
如许一个类的链并不简朴,所以让我经由过程属性来构造这些值。
效果以下:
<div button="large blue">Button</div>
为了防止定名争执,增加定名空间到属性上是个好主意。然后,我们的按钮就变成了下面的模样:
<div am-button="large blue">Button</div>
假如你运用考证器搜检代码,会发明并没有am-button这个属性,所以能够在属性称号前加上data-。
运用一个不为人知,作为class属性的挑选器”~ =” (IE7+):该挑选器挑选属性值包括指定单词的元素,用空格分开。所以,这类class~=”link”的挑选器类似于a.class.button如许的挑选器。纵然特地运用,由于class挑选器也只是该属性挑选器的特别情况。
因而,CSS代码
.button {...}
.button--large {...}
.button--blue {...}
转换为
[am-button] {...}
[am-button~="large"] {...}
[am-button~="blue"] {...}
假如你以为如许的代码不常见,也能够运用不那么激进的AMCSS情势:
<div am-button am-button-large am-button-blue></div>
FUN
FUN 示意挑选器的扁平构造(Flat hierarchy of selectors),功用款式(Utility styles),定名支解组件(Name-spaced components)。
每一个字母背面都有特定的准绳:
- F, flat hierarchy of selectors: 发起运用类来挑选元素,防止无用的串连,而且不运用id。
- U, utility styles: 勉励竖立atomic作风的效劳来处理典范的拼集使命,比方 w100示意width:
100%;,fr示意float: right; - N, name-spaced components: Ben发起增加定名空间来指定特别的模块元素的款式。这类要领防止了类名的堆叠。
一些开辟者注意到运用这类准绳来誊写和保护代码是相称轻易的;在某种程度上,作者拿出了最好的效果,而且以一种简约的体式格局展现了这项手艺。
这类要领对项目和代码构造另有不小请求,它只竖立纪录元素的首选情势和标记运用的要领。然则在小项目中,这些划定规矩充足竖立出充足高质量的代码。
总结
正如你所见,这些要领里并没有一个圆满的。这些要领中没有一条相对的划定规矩——你能够从开始运用一套计划来竖立你本身的东西, 或许从头开始竖立一条新的要领。