webrebuild.org第四届年会——金秋四城联动

邀您参加“裸奔”

在你对CSS华丽的效果着迷时,别忘了在华丽外表下面,最原始的文字。

邀您参与每年4月9号的“CSS裸奔节”,详情请登陆webrebuild.org

[原]从宜家的家具设计讲模块化

Ghost 发表于 [2009-02-11 17:46]

很久之前就知道 宜家 ,以前在广州的时候也去过一次,给我的印象就是:大、贵、巧。地方很大,东西很贵,设计很巧。现在住的地方离宜家不远,这个月找时间去逛了下,地方还是那么大,东西还是那么贵,设计还是那么的巧。虽然没有买什么东西,不过也还是有所收获的,通过宜家的家具设计方法,我们可以聊聊模块化。

去过宜家的同学应该都有注意到,宜家的家具基本都是组合的,可拆装。模块化的特点也是这样,可以组合,相对独立,在需要的时候可以很方便的加上。那怎么写可以基本实现这种方式呢?给个简单的例子:

<div class="mode-a">
	<h3>模块化Demo</h3>
	<p>模块化结构的例子。</p>
</div>

对应的CSS可以这么写:

.mode-a{...}
.mode-a h3{...}
.mode-a p{...}

其中“mode-a”就是这个模块的名称,表示这是名为“a”的模块,现在这个模块可以被放到你所需要的地方。既然是做模块,就不会只有一个,我们再加一个“mode-b”:

<div class="mode-b">
	<h3>模块化Demo</h3>
	<div>
		<h4>模块化的特点:</h4>
		<ul>
			<li>相对独立</li>
			<li>可移植性高</li>
		</ul>
	</div>
</div>

对应的CSS可以这么写:

.mode-b{...}
.mode-b h3{...}
.mode-b div{...}
.mode-b h4{...}
.mode-b ul li{...}

实际应用中大多需要加一些classname来减少类定义的复杂度,这个例子比较简单,但足以说明模块化的特点。上面两个模块可同时被使用到一个或多个页面中。

在宜家的卖场中,也许你也注意到了,基本是以设计师来划分商品区的,特别是那些小件的商品。模块化后的代码也可以被分配给不同的人进行编写,提高效率。当然要实现这种方式,我们也需要做些工作,如模块的命名规范(可参考《 样式命名规范 》)、模块中哪些地方是需要留接口的等等。如上面的例子中可以约定的就有:命名以“mode”开头,模块标题使用h3标签。这样不管是哪个人写出来的模块都可兼容项目中的页面。

看到这你可能会发现,既然上面已经约定了模块固定的结构,每个模块的样式定义中所写的这一部分不就是冗余的吗?是的。如果已经形成相关的约定,这部分的样式定义可以被提出来放到项目的公共定义中,减少代码的冗余。如上面的例子可以变成:

/* =S global */
h3{
/* 第一种写法 */
...
}
.mode-a h3,
.mode-b h3{
/* 第二种写法 */
...
}
/* =E global */
/* =S mode-a */
.mode-a{...}
.mode-a p{...}
/* =E mode-a */
/* =S mode-b */
.mode-b{...}
.mode-b div{...}
.mode-b h4{...}
.mode-b ul li{...}
/* =E mode-b */

不知你有没注意到宜家那些小件的商品,往往可以组合到不同的其它商品上面。这也带出了模块化的另一个话题:模块中的模块。即在模块中可以存在其它的模块,也很好理解,就像我们做网站的时候,整个页面的结构就像是一个大的模块,而上面所讲的例子就是模块中的模块了,只不过我们把这个定义缩小一层。上面例子中对h3的定义,就可以看成是一个模块,它在“mode-a”、“mode-b”两个模块中都出现,并且结构表现相对固定。

OK,这只是对一个标签的定义,如果不只一个标签呢?我们重新改下例子:

<div class="mode-b">
	<div class="mode-a">
		<h3>模块化Demo</h3>
		<p>模块化结构的例子。</p>
	</div>
	<div class="cont">
		<h4>模块化的特点:</h4>
		<ul>
			<li>相对独立</li>
			<li>可移植性高</li>
		</ul>
	</div>
</div>
<div class="mode-c">
	<div class="mode-a">
		<h3>模块化Demo</h3>
		<p>这个是“模块中的模块”的例子。</p>
	</div>
	<div class="cont">
		<h4>模块中的模块:</h4>
		<p>模块“mode-a”就是一个模块中的模块。</p>
	</div>
</div>
/* =S mode-a */
.mode-a{...}
.mode-a h3{...}
.mode-a p{...}
/* =E mode-a */
/* =S mode-b */
.mode-b{...}
.mode-b h4{...}
.mode-b .cont{...}
.mode-b .cont ul li{...}
/* =E mode-b */
/* =S mode-c */
.mode-c{...}
.mode-c h4{...}
.mode-c .cont{...}
.mode-c .cont p{...}
/* =E mode-c */

从上面可以看到,“mode-a”是一个独立的模块,当它作为“mode-b”和“mode-c”的一部分时,就成了模块中的模块了。抛下砖,希望能引出更多相关的讨论。

文章地址:http://www.cssforest.org/blog/index.php?id=126

[原]从宜家的家具设计讲模块化》采用的授权是创作共用的 “署名-非商业性使用-相同方式共享 3.0 通用许可”.

文章被分类到:重构思想


评论也精彩

  1. linxz 在 535 日 之前 说:

    模块化的东西出现比较多的还是博客类的站点。
    QZONE也应该是这样的吧。
    从某一个模块移动到另外一个,根据其中的一个模块来改变里面的值,也就有了中间内容区域大的,侧边内容区域小的却可以放得内容。

    文字有点乱……闪!

  2. unicac 在 535 日 之前 说:

    感觉有点乱,看得没头绪啊!

  3. weilaixu 在 534 日 之前 说:

    基本都描述到了!
    应用的时候分析到位,其实是很灵活的。

  4. Robin 在 534 日 之前 说:

    css的namespace呀,模块化和组件化开发就要这样,每个组件有自己的style ns,这样别人引用时才不会污染全局样式,减少样式冲突。

  5. 树残由尔 在 534 日 之前 说:

    讲得比较乱 没法理出头绪

  6. Leo.lin 在 534 日 之前 说:

    恩,说得很好,有共鸣…

    不知道你做过portal的项目没?

    portlet的CSS实现就是以模块化的概念出现的,可以拖拽,可以随意改变字体颜色字体大小。

    Class的命名我一般是这样起的:

    模块-元素-功能(可选择)-类型-状态(可选择)
    Example: portlet-font-title-emphasis portlet-bg-highlight portlet-font-info
    欢迎探讨

  7. 寂静猴子 在 534 日 之前 说:

    勉强的看下来了,不实践总是不行滴,希望实践中能够把这个真的弄明白了…

  8. 5457 在 533 日 之前 说:

    模块化开发确实能提高工作效率,减少工作压力。

    但要有HTML和CSS的命名规范。
    因为当一个项目不是一个人完成的时候,各设计师CSS包括HTML结构代码可能都不一样。
    如果这些都不能保持一致的话,模块化也就无从谈起。

    另外各模块间的嵌套、css编写的先后顺序、模块间的兼容与扩展性都要考虑。
    感觉大规模的模块形式开发还需要一段时间才能规范成型。

  9. 啊丢 在 531 日 之前 说:

    会晕,因为太高阶了! 我这初学者还得努力

  10. rainaxin 在 528 日 之前 说:

    这个例子很贴切啊,其实平时生活中很多东西都是这个话题的镜子,还是要不断的挖掘,也许就会发觉更新的思维。

  11. 孤帆远影 在 527 日 之前 说:

    模块思想值得推荐,但具体实施还是有一定困难的,需要长时间的经验积累

  12. qq个性签名 在 526 日 之前 说:

    模块思想值得推荐

  13. XiangBei 在 446 日 之前 说:

    不这样写 再怎么写哩?

  14. netfreeman 在 444 日 之前 说:

    <div class=“module one”>
    <div class=“head”>
    <h3><span>modulename</span></h3>
    <span class=“readmore”></span>
    </div>
    <div class=“showtime”>
    this is content!
    </div>
    <span class=“modulebottom”></span>
    </div>

    hai ke yi zhe yang xie !

  15. Jashion 在 142 日 之前 说:

    你这样讲,我觉得有点像blueprint框架了!

  16. Jashion 在 131 日 之前 说:

    事隔11日,再看这篇文章,理解的程度不同了,写得很不错!

  17. Ghost 在 131 日 之前 说:

    @Jashion 这就是“温故知新”了,重点除了要以不同的认知去看之外,还有就是要“再看”。呵呵。

  18. king165001 在 30 日 之前 说:

    想法,甚至系具体写法都不谋而合,模块化的代码一系可重用性高,二系容易维护。

  19. fish 在 18 日 之前 说:

    觉得可以建一个这样的前端的模块库

欢迎发表评论
  1. 请不要发表跟文章无关的评论,内容或站点如指向非个人博客地址的以发广告对待!
  2. 为抵制垃圾评论,留言需要先预览再点击提交。
  3. 评论支持textile语法,查看 textile帮助
  4. 还可以使用QQWeb输入法