css模块化(二)

上一篇讲了几个概念,这次,我们讲讲实例,描述常见的一些设计模式。

如果熟读了鬼哥的css模块化的内容,你就会发现,他的文章系列中的好几篇我们之前就已经讲过,所以就不赘述了。

那么,我们为毛要进行模块化呢?肯定是有好处的,没好处,追求它干啥?

在研究这个问题之前,我们先看问题,思考问题,然后解决问题。

如下图:

 

像这样的设计,你该怎么办?

我们尽可能给出所有的正经的css+html设计方案。

方案一:基类和原子类(面向属性)的拼接

html:

<div id="wrapper">
    <div class="module w240">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd bg54BAF3">
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module w440">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd bg9C0">
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module w240">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd bgF27B2E">
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module w440">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd bgb8efe1">
            <p>xxx各种描述</p>
        </div>
    </div>
</div>

css:

* { margin:0; padding:0; }
#wrapper { margin:20px auto; width:724px; overflow:hidden; zoom:1; }
/*这尼玛就是原子类啊*/
.w240 { width:240px; }
.w440 { width:440px; }
.bg54BAF3 { background:#54BAF3;}
.bg9C0 { background:#9C0; }
.bgF27B2E { background:#F27B2E; }
.bgb8efe1 { background:#b8efe1; }
/*基类*/
.module { float:left; margin:0 20px 20px 0;   }
.module header { height:30px; line-height:30px;color:#333; font-size:14px; }
.module header h1 { font-size:14px; text-indent:10px; background:rgba(238,238,238,0.7); border:1px solid #ddd; border-radius:4px 4px 0 0; }
.module .bd { height:200px; padding:10px; border-radius:0 0 4px 4px; color:#fff;  }
.module .bd p { }

在线demo:http://jsfiddle.net/xmlovecss/EbuqG/

方案二:就是四个模块,同一样式属性,在css中进行合并

 html:

<div id="wrapper">
  <div class="module1">
    <header>
       <h1>标题标题</h1>

    </header>
    <div class="bd">
      <p>xxx各种描述</p>
      <p>xxx各种描述</p>
      <p>xxx各种描述</p>
      <p>xxx各种描述</p>
      <p>xxx各种描述</p>
    </div>
  </div>
  <div class="module2">
    <header>
       <h1>标题标题</h1>

    </header>
    <div class="bd">
      <p>xxx各种描述</p>
    </div>
  </div>
  <div class="module3">
    <header>
       <h1>标题标题</h1>

    </header>
    <div class="bd">
      <p>xxx各种描述</p>
    </div>
  </div>
  <div class="module4">
    <header>
       <h1>标题标题</h1>

    </header>
    <div class="bd">
      <p>xxx各种描述</p>
    </div>
  </div>
</div>

css:

* { margin:0; padding:0; }
#wrapper { margin:20px auto; width:724px; overflow:hidden; zoom:1; }
/*公用样式*/
.module1, .module2, .module3, .module4 { float:left; margin:0 20px 20px 0; }
.module1 header,.module2 header,.module3 header,.module4 header { height:30px; line-height:30px;color:#333; font-size:14px; }
.module1 header h1,.module2 header h1,.module3 header h1,.module4 header h1 { font-size:14px; text-indent:10px; background:rgba(238,238,238,0.7); border:1px solid #ddd; border-radius:4px 4px 0 0; }
.module1 .bd,.module2 .bd,.module3 .bd,.module4 .bd { height:200px; padding:10px; border-radius:0 0 4px 4px; color:#fff;  }
.module1 .bd p,.module2 .bd p,.module3 .bd p,.module4 .bd p { }
/*私有样式*/
.module1,.module3 { width:240px; }
.module2,.module4 { width:440px; }
.module1 .bd { background:#54BAF3; }
.module2 .bd { background:#9C0; }
.module3 .bd { background:#F27B2E; }
.module4 .bd { background:#b8efe1; }

在线demo:http://jsfiddle.net/xmlovecss/Pd6GX/

方案三:基类和扩展类(面向对象命名)

html:

<div id="wrapper">
    <div class="module extend_mod1">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd">
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module extend_mod2">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd">
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module extend_mod3">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd">
            <p>xxx各种描述</p>
        </div>
    </div>
    <div class="module extend_mod4">
        <header>
            <h1>标题标题</h1>
        </header>
        <div class="bd">
            <p>xxx各种描述</p>
        </div>
    </div>
</div>

css:

* { margin:0; padding:0; }
#wrapper { margin:20px auto; width:724px; overflow:hidden; zoom:1; }
/*基类*/
.module { float:left; margin:0 20px 20px 0;   }
.module header { height:30px; line-height:30px;color:#333; font-size:14px; }
.module header h1 { font-size:14px; text-indent:10px; background:rgba(238,238,238,0.7); border:1px solid #ddd; border-radius:4px 4px 0 0; }
.module .bd { height:200px; padding:10px; border-radius:0 0 4px 4px; color:#fff;  }
.module .bd p { }
/*扩展类*/
.extend_mod1,.extend_mod3 { width:240px; }
.extend_mod2,.extend_mod4 { width:440px; }
.extend_mod1 .bd { background:#54BAF3; }
.extend_mod2 .bd { background:#9C0; }
.extend_mod3 .bd { background:#F27B2E; }
.extend_mod4 .bd { background:#b8efe1; }

当然,这个示例中,也有人会把结构中的扩展类改成id来做区分。

在线demo:http://jsfiddle.net/xmlovecss/YZFPV/

在分析上面的实例时,有一点必须说明,我给出的三种方案里,都是扩展,没有重写。如果要涉及到重写,第一种方案就最糟糕了,样式权重会成为一个灾难。

我们分析一下上面三种方案的可行性:

  • 第一种:如果整个项目中就出现一次这样的界面,并且忽略语义化,那无可厚非,还可以。改动起来不是很费事儿。如果还要增加其它的个性属性(样式),那么得制造多少原子类啊!

    如果不止一次地出现这样的界面,次数越多,你想想,pd驱动设计改界面,到时候,面向属性的原子类命名,不止一个页面的html修改,哭去吧,骚年。

  • 第二种:尽管有人会觉得,第二种方案好像比较傻逼。事实上,第二种方案也是比较聪明的方案,可扩展性强,维护代价低,语义好。尽管折腾吧,毫无惧色。

  •  第三种:第三种方案的出现,其实是为了规避第一种方案的命名不语义化,规避第二种的重复属性声明。好处不言自明,不拿id做区分的话,样式声明需要有先后的顺序,共性module样式声明在前,个性样式extend_module声明在后。

好了,分析完啦。这只是一个简单的示例,没有使用覆盖,而用的都是扩展,不会造成重绘的问题,因而提高了页面渲染效率。

给个小练习吧:

 

再来个复杂点的:

posted @ 2013-01-17 09:35  xmlovecss  阅读(228)  评论(0编辑  收藏  举报