前端框架 - css样式 构造方法 oocss / bem / smacss / ...

今天早上坐地铁看公众号文章的时候发现了一篇关于如何写出更优雅、质量高、维护性比较强的css样式。
在老早以前我写css样式的时候相当暴力,各种写,行内样式(也叫内联样式)、内部样式、外部引用样式

// 行内样式写法
<body>
  <p style="color:red; line-height: 50px"></p>
</body>
// 内部样式写法, 最好包在html <head>标签里面
<head>
    <style type="text/css">
        p {
            line-height:50px;
            color: red;
        }
    </style>
</head>
// 外部样式 引用,此处必须包在头部标签head里面才算规范
  <head>
      <link rel="stylesheet" href="./assets/style/demo.css" type="text/css">
</head>
/*
  此处要注意一下 type="text/css",可以修改的,以后有时间慢慢写吧
*/

有一个需要注意的地方

css样式里面的class是不区分大小写的
比如说 .demoText和 .demotext是一样的,但是Id的是区分大小写的

  .demoText {}
  .demotext {}
  以上都是一样的效果
  #demoText{}
  #demotext {}
 以上是不同的id,控制不同的标签样式

好了,废话不多说,继续说css样式构造方法

直接上图说话,用文章页来举例子!

OOCSS 写法

  • Separate structure and skin(分离结构和主题)减少对 HTML 结构的依赖
  • Separate container and content(分离容器和内容)增加样式的复用性

比如说一个Button

  <div>
       <button class="btn btn-default btn-disabled">Click Here </button>
  </div>

  <style>
        .btn { } // 
        .btn-default {} // 
        .btn-disabled {} //
</style>

以上button样式首先分离了div结构,然后分离了主题样式, btn-default和btn-disabled样式肯定是不一样的,这样就会区分出来,样式不依赖任何结构,放在哪里都是由指定样式来表现

我个人理解oocss,举个例子,将各个结构里面的小组件里面的小元件等等分别摘出来作为一个小块来进行样式渲染,每个小元件里面定义好类名之后将小元件能够考虑到的各种状态各种颜色等等的样式分开来写,这样互不影响

Bootstrap就是依赖oocss的规则来定义css的

[优点] OOCSS追求元件的复用,其class命名更为抽象,一般不体现具体事物,而注重表现层的抽取.

BEM

bem 就是block, element modifier, 顾名思义就是块级、元素、修饰

举例子:
通常页面都会有侧边栏,侧边栏有头部,有尾部,所以侧边栏的样式和代码按照BEM规则来写如下

<div class="sidebar">
    <div class = "sidebar-header">
    </div>
     <div class="sidebar-body">
          <a href class="sidebar-body_active">xxx</a>
     </div>
    <div class="sidebar-footer">
    </div>
</div>

[优点] 独立存在的区块,可以在不同场合下重用

[缺点] 写的css比较多,如果jquery里面也引用到样式名称,css重构之后js也需要随之更改;

SMACSS

SMACSS is a way to examine your design process and as a way to fit those rigid frameworks into a flexible thought process. (smacss通过一个灵活的思维过程来检查你的设计过程和方式是否符合你的架构,更像一种规范~)

设计的主要规范有三点:

  • Categorizing CSS Rules(为css分类)
  • Naming Rules(命名规范)
  • Minimizing the Depth of Applicability(最小化适配深度)
  • Categorizing CSS Rules

这一点是SMACSS的核心。SMACSS认为css有5个类别,分别是:
1 Base 页面元素的默认外观,不会定义到id&class

body {}
div {}
p {}
div 
table {}
...

2 Layout 布局规范,元素是有层次级别之分的,Layout Rules属于较高的一层,它可以作为层级较低的Module Rules元素的容器。左右分栏、栅格系统等都属于布局规范。布局是一个网站的基本,无论是左右还是居中,甚至其他什么布局,要实现页面的基本浏览功能,布局必不可少。SMACSS还约定了一个前缀l-/layout-来标识布局的class。举个最普遍的例子。

.layout-header {}
.layout-container {}
.layout-sidebar {}
.layout-content {}
.layout-footer {}

3 Module Module Rules, 模块规范,模块是SMACSS最基本的思想,同时也是大部分CSS理论的基本,将样式模块化就能达到复用和可维护的目的,但是SMACSS提出了更具体的模块化方案。SMACSS中的模块具有自己的一个命名,隶属于模块下的类皆以该模块为前缀

.todolist{}
.todolist-title{}
.todolist-image{}
.todolist-article{}

4 State 状态规范,这个应该很多前端开发者都很好理解,描述的是任一元素在特定状态下的外观 , 例如,一个消息框可能有success和error等状态。与OOCSS抽取修饰类的方式的不同,SMACSS是抽取更高级别的样式类,得到更强的复用性,如隐藏某个元素的写法,
oocss抽取的是指定组件, smacss抽取的更高。

   .is-success {}
   .is-error {}
   .is-hidden {}

5 Theme or Skin 主题规范,描述了页面主题外观,一般是指颜色、背景图。Theme Rules可以修改前面4个类别的样式,且应和前面4个类别分离开来(便于切换,也就是“换肤”)。SMACSS的Theme Rules不要求使用单独的class命名,也就是说,你可以在Module Rules中定义.header{ }然后在Theme Rules中也用.header { }来定义需要修改的部分(后加载覆盖前加载样式内容)

Naming Rules(命名规范)

按照前面5种的划分:

  • Base Rules(Pass)
  • Layout Rules用l-或layout-这样的前缀,例如:.l-header、.l-sidebar。
  • Module Rules用模块本身的命名,例如图文排列的.media、.media-image。
  • State Rules用is-前缀,例如:.is-active、.is-hidden。
  • Theme Rules如果作为单独class,用theme-前缀,例如.theme-a-background、.theme-a-shadow。
Minimizing the Depth of Applicability 最小适配深度原则
/* depth 1 */
.sidebar ul h3 { }

/* depth 2 */
.sub-title { }

这种方法不建议用,因为集成选择符有时候会引发央视冲突,尽可能用短的

总之,我感觉css这样应该结合着用,oocss, bem要按照smacss的标准来进行规范和添加规则,当然这样的一般应用到大型项目当中,比如说管理系统,或者电商之类的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 嘿,坐(作)前排(端)的同学!在普遍全套技能加身的你,是否有为可维护CSS烦恼过?是继承打补丁逐类复写,还是来套媒...
    July_EF阅读 1,611评论 0 3
  • 作者:狼狼的蓝胖子原文地址:http://luopq.com/2016/01/05/css-optimize/ 写...
    IT程序狮阅读 1,706评论 2 51
  • https://csswizardry.com/2013/01/mindbemding-getting-your-...
    jh2k15阅读 482评论 0 0
  • 五天四夜在我们生命中只占据了毫不起眼的时光,可我们往往忽视了在漫长的生命长河中,是由无数个五天四夜组成。 今天见证...
    夢瑤阅读 352评论 0 0
  • 我们村子不算大,不到两千口人,村子虽然很小,却也和一个人的一辈子一样,总是发生着一些有趣的,无趣的,高兴的,悲伤的...
    两个懒散的人阅读 368评论 2 1