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編碼一般是為1~4定義四個類名,為他們寫各自的樣式; 明智一點的寫法是為1~4定義四個類名, 用.a .b .c .d{…}方式定義共同樣式, 然后再為各自定義不同部分的樣式; 但是, 還有一種完美的方式, 那便是模塊化. 下面我就以上圖為例做個簡單的模塊化分析.
第一步, 分析整個視覺共用部分. 可以看出,1~4中,標題背景,標題文字,內容文字這三個部分的樣式都是相同的, 所以, 我們可以為這個四個區塊定義一個類名, 將共同的樣式寫給這個類名:
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可以這樣寫:
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前端開發修煉之道》一書中分享的通用原子類:
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}