CSS技巧: 模块化编码

原生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模块化视觉样例  看到上图, 菜鸟的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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值