原生JS因jQuery的”write less,do more”变得极简, HTML因语义化编码变得简明, 那么, 有没有一种方式让CSS也更加的高效精致呢? 当然有, 那便是模块化编码.
CSS的模块化,我们可以理解成(抑或本身就是)OOP思想, 重用性、灵活性、可扩展性便是它终极的目标, “类”便是它的核心, OOP的多用组合少用继承一样是它的基本原则. CSS模块化是一个新颖高效的CSS编码方式, 若有接触过YUI CSS的朋友肯定对这种方式有所了解.
如何CSS模块化, 我想这才是大家真正关心的. 我所理解的CSS模块化, 应该从两大块去区分.
第一大块, 从整站全局模块化. 这一点大家并不陌生, 时常用到的reset css便是模块化的一部分, 全局通用的字体样式, 链接样式, 以及通用头部底部及主体容器等等这些我们已经熟知, 另外诸如定义文字排版(如.f12{font-size:12px})、定位(如.tl{text-align:left})、长度高度(如.w10{width:10px})、边距(如.m10{margin:10px})等页面中会常用到的样式,这一类,我们称之为CSS通用原子类(哈,与类扯上关系了,那就权当成类吧).通用原子类有两个特点: 通用性和原子性, 任何页面都可以随意使用它们, 且他们只表现最基础的样式, 一个通用原子类只设置一个样式,不可再分. 关于整站全局模块化不再详述, 本文后面我会贴出阿当的《Web前端开发修炼之道》 一书中常用通用原子类样式.
第二大块, 是从视觉效果上模块化, 在视觉上样式和功能相对独立稳定的部分即可视为模块. 拆分这些模块, 应该尽量遵循一个原则: 模块与模块之间尽量不要包含相同的部分, 若有相同部分就再拆出来独立成一个模块.下图是我画的一个简易的页面视觉图: 看到上图, 菜鸟的CSS编码一般是为1~4定义四个类名,为他们写各自的样式; 明智一点的写法是为1~4定义四个类名, 用.a .b .c .d{…}方式定义共同样式, 然后再为各自定义不同部分的样式; 但是, 还有一种完美的方式, 那便是模块化. 下面我就以上图为例做个简单的模块化分析.
第一步, 分析整个视觉共用部分. 可以看出,1~4中,标题背景,标题文字,内容文字这三个部分的样式都是相同的, 所以, 我们可以为这个四个区块定义一个类名, 将共同的样式写给这个类名:
01 ... 02 div class="box" 03 h2倒霉松鼠再出山/h2 04 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 05 /div 06 div class="box" 07 h2倒霉松鼠再出山/h2 08 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 09 /div 10 div class="box" 11 h2倒霉松鼠再出山/h2 12 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 13 /div 14 div class="box" 15 h2倒霉松鼠再出山/h2 16 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 17 /div 18 ... 19 /div
第二步, 分析出不同部分, 并权衡高效使用. 可以看出, 不同部分, 主要是内容背景色和区块宽度两部分. 先说背景色, 背景色有三种, 淡黄(1个), 白色(2个), 灰色(1个), 遵从”模块与模块之间尽量不要包含相同的部分, 若有相同部分就再拆出来独立成一个模块”的原则, 我们要把2个白底的样式提出来, 另两个单独定义, 而根据CSS优先原则, 我们可以把白底默认定义到第一步中的box样式中, 另两种背景色可做重定义处理. 再来看看宽度与定位, 2,4宽度等同且都右浮动, 所以, 我们可以把这部分提出来模块化, 而浮动一般可以直接调用通用原子类, 所以, 我们仅仅需要定义一个宽度样式中(若这个宽度在通用原子类中也有就更好了). 如此以来, HTML可以这样写:
01 ... 02 div class="box bg_y" 03 h2倒霉松鼠再出山/h2 04 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 05 /div 06 div class="box fr right_w" 07 h2倒霉松鼠再出山/h2 08 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 09 /div 10 div class="box" 11 h2倒霉松鼠再出山/h2 12 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 13 /div 14 div class="box fr right_w bg_g" 15 h2倒霉松鼠再出山/h2 16 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p 17 /div 18 ...
或许, 这样的结构对HTML页面来说, 会显的有些臃肿, 但CSS文件因为重用性的提高而大大的减小了.CSS模块化是一个比较实用但也需要去领悟的思想, 实际使用中也需要全面的分析, 过多的模块也会导致维护性的降低, 如同OOP编程一样, 我们也要考虑”公有属性”与”私有属性”.
本文通过一个简单的例子解析了CSS模块化的基本思想, 更多关于CSS模块化的知识, 可以看YUI CSS或者其他网络上的资源.
do write, less more…CSS也可以做到.
附: 阿当《Web前端开发修炼之道》一书中分享的通用原子类:
001 /*文字排版*/ 002 .f12{font-size:12px} 003 .f13{font-size:13px} 004 .f14{font-size:14px} 005 .f16{font-size:16px} 006 .f20{font-size:20px} 007 .fb{font-weight:bold} 008 .fn{font-weight:normal} 009 .t2{text-indent:2em} 010 .lh150{line-height:150%} 011 .lh180{line-height:180%} 012 .lh200{line-height:200%} 013 .unl{text-decoration:underline;} 014 .no_unl{text-decoration:none;} 015 /*定位*/ 016 .tl{text-align:left} 017 .tc{text-align:center} 018 .tr{text-align:right} 019 .bc{margin-left:auto;margin-right:auto;} 020 .fl{float:left;display:inline} 021 .fr{float:right;display:inline} 022 .cb{clear:both} 023 .cl{clear:left} 024 .cr{clear:right} 025 .clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden} 026 .clearfix{display:inline-block}* html .clearfix{height:1%}.clearfix{display:block} 027 .vm{vertical-align:middle} 028 .pr{position:relative} 029 .pa{position:absolute} 030 .abs-right{position:absolute;right:0} 031 .zoom{zoom:1} 032 .hidden{visibility:hidden} 033 .none{display:none} 034 /*长度高度*/ 035 .w10{width:10px} 036 .w20{width:20px} 037 .w30{width:30px} 038 .w40{width:40px} 039 .w50{width:50px} 040 .w60{width:60px} 041 .w70{width:70px} 042 .w80{width:80px} 043 .w90{width:90px} 044 .w100{width:100px} 045 .w200{width:200px} 046 .w250{width:250px} 047 .w300{width:300px} 048 .w400{width:400px} 049 .w500{width:500px} 050 .w600{width:600px} 051 .w700{width:700px} 052 .w800{width:800px} 053 .w{width:100%} 054 .h50{height:50px} 055 .h80{height:80px} 056 .h100{height:100px} 057 .h200{height:200px} 058 .h{height:100%} 059 /*边距*/ 060 .m10{margin:10px} 061 .m15{margin:15px} 062 .m30{margin:30px} 063 .mt5{margin-top:5px} 064 .mt10{margin-top:10px} 065 .mt15{margin-top:15px} 066 .mt20{margin-top:20px} 067 .mt30{margin-top:30px} 068 .mt50{margin-top:50px} 069 .mt100{margin-top:100px} 070 .mb10{margin-bottom:10px} 071 .mb15{margin-bottom:15px} 072 .mb20{margin-bottom:20px} 073 .mb30{margin-bottom:30px} 074 .mb50{margin-bottom:50px} 075 .mb100{margin-bottom:100px} 076 .ml5{margin-left:5px} 077 .ml10{margin-left:10px} 078 .ml15{margin-left:15px} 079 .ml20{margin-left:20px} 080 .ml30{margin-left:30px} 081 .ml50{margin-left:50px} 082 .ml100{margin-left:100px} 083 .mr5{margin-right:5px} 084 .mr10{margin-right:10px} 085 .mr15{margin-right:15px} 086 .mr20{margin-right:20px} 087 .mr30{margin-right:30px} 088 .mr50{margin-right:50px} 089 .mr100{margin-right:100px} 090 .p10{padding:10px;} 091 .p15{padding:15px;} 092 .p30{padding:30px;} 093 .pt5{padding-top:5px} 094 .pt10{padding-top:10px} 095 .pt15{padding-top:15px} 096 .pt20{padding-top:20px} 097 .pt30{padding-top:30px} 098 .pt50{padding-top:50px} 099 .pb5{padding-bottom:5px} 100 .pb10{padding-bottom:10px} 101 .pb15{padding-bottom:15px} 102 .pb20{padding-bottom:20px} 103 .pb30{padding-bottom:30px} 104 .pb50{padding-bottom:50px} 105 .pb100{padding-bottom:100px} 106 .pl5{padding-left:5px} 107 .pl10{padding-left:10px} 108 .pl15{padding-left:15px} 109 .pl20{padding-left:20px} 110 .pl30{padding-left:30px} 111 .pl50{padding-left:50px} 112 .pl100{padding-left:100px} 113 .pr5{padding-right:5px} 114 .pr10{padding-right:10px} 115 .pr15{padding-right:15px} 116 .pr20{padding-right:20px} 117 .pr30{padding-right:30px} 118 .pr50{padding-right:50px} 119 .pr100{padding-right:100px}
|