跳转到主要内容
qingkong 提交于 24 February 2015

6.8 可扩展模块化架构CSS代码规范(1)——SMACSS(I)

针对上一节提到的目标、误区,我们需要一套对应的CSS编写方式,用前人总结的最佳实践来作为指导方针,并且这种方式不应该根据项目的变化而变化。关于CSS的架构方式,比较重要的三个分别是:OOCSS,BEM和SMACSS。Drupal选择了SMACSS,他是Drupal8的CSS架构标准。Zen、Omega、Zurb Foundation主题都采用了SMACSS的方式来架构CSS。它的作者是Jonathan Snook,你可以在http://smacss.com找到更多详细资料,以下只做简单介绍。

SMACSS描述了如何编写灵活可扩展的CSS代码的方法,它的核心思路是将CSS规则进行合理的分类。一共分为以下五类:

1. Base

2. Layout

3. Module

4. State

5. Theme

这里的Module和Theme和Drupal中的对应名词没有关系。对此,Zen的作者曾经吐槽说:看来,Jonathan Snook在提出SMACSS概念的时候一定考虑过一个问题,就是,我怎样才能搞昏那帮玩Drupal的人。见https://www.drupal.org/node/1921610#comment-7099982

 

Base:

这一类样式属于默认样式,大部分情况下都是单一的元素选择器,也包括属性、伪类、子元素、后代选择器。它不包括类选择器和ID选择器。如:

html, body, form { margin: 0; padding: 0; }

input[type=text] { border: 1px solid #999; }

a { color: #039; }

a:hover { color: #03C; }

它的主要功能一般是设置标题大小、默认链接样式、默认字体样式、页面背景等。并且在这一组中不应该使用!important 。前端中经常使用的CSS Resets 和 Nomalize都应该属于这一组。

 

Layout:

Layout规则一般用来指定页面中比较大的部分,如Header, Sidebar, Content, Footer等。这些在Drupal中往往被做成区域(region)。他们可以被细分成更小的区域,这些则被划分到Module类中。Layout规则是唯一允许并推荐使用ID选择器的分组。但是如果使用网格系统的话,类选择器也是被允许的。一般来说layout使用单一选择器,可以是ID也可以是Class。如:

#header,

#footer {

  /* Some CSS properties */

}

#sidebar-first,

#sidebar-second {

  /* Some CSS properties */

}

#content {

  /* Some CSS properties */

}

某些使用多个选择器组合起来的情况:有时需要根据用户的选择变换页面元素的样式——这种情况下,可在 layout 的父级元素上指定派生/上下文选择器(通常是在body上指定)。

用上级元素样式影响下级元素样式:

#article {

    float: left;

} 

#sidebar {

    float: right;

} 

.l-flipped #article {

    float: right;

} 

.l-flipped #sidebar {

    float: left;

} 

此处.l-flipped被指派给上级元素,比如body,从而使得 article 和 sidebar可以互换位置。 

两种样式混用:

#article {

    width: 80%;

    float: left;

}

#sidebar {

    width: 20%;

    float: right;

}

.l-fixed #article {

    width: 600px;

} 

.l-fixed #sidebar {

    width: 200px;

} 

这里使用.l-fixed 类来改变布局,从流式布局(使用百分比进行定义)改为固定布局(使用像素进行定义)。

 

另外,需要指出的是,在Layout组中,ID选择器的命名没有特殊规定,但是类选择器都使用“l-”作为前缀,以示区别。

Drupal 版本