0,引言
1,基礎
牛頓是站在巨人伽利略的肩膀上的,我們也可以這麼做。首先我們要選定一個前進的基礎。
請永遠不要使用
這問題太多了,在此不多加表述。
目前比較流行的有Eric Meyer的重置樣式和YUI的重置樣式。另有Condensed Meyer Reset簡化Eric Meyer的樣式。有趣的是,Eric的重置樣式也是源於YUI的。而那份簡化版又把Eric的樣式簡化回YUI的樣式了 。但同時,糟糕的是,網上流傳的比較廣的(尤其是國內)都不是最新的版本。上面兩個頁面裡直接看到的都不是最新的,Eric專門為有一個reset.css頁面。而YUI當前版本(2.7.0)的reset.css實際地址裡,比上面的頁面中還多一些東西。此外,我們還可以基於一些常見的框架,比較著名的比如Blueprint或者Elements CSS Framework(這個的reset也是源自於Eric Meyer的)。OK,准備工作就差不多了。以上這些都可以作為參考資料來組織我們自己的reset。我這裡主要采用YUI,兼帶Eric的reset。
2,默認色彩
對於頁面是不是有默認背景色和前景色,YUI和Eric有著不同的看法。
YUI重置背景色為白色而文字顏色為黑色。
而Eric在當前最新版中讓所有顏色為透明,他認為透明才是最原始的顏色。雖然他曾一度認為也應當設置白色背景色、黑色文字顏色。至於最後為什麼改了,Eric並沒有給出具體理由。
這個問題我基本認為是用戶自定義的更重要還是你的設計更重要的問題。我個人的觀點是,如果你的設計本身就是白色背景,那麼不要設置背景。一小部分中高水平的用戶,他們會自定義網頁默認背景色。設置成他們喜歡的背景色,比如淺藍色。基本常見的浏覽器都提供了這個簡單的功能。而我們的背景色重置則會破壞用戶的選擇——盡管這樣能保證你的設計原汁原味的呈現給所有用戶。當然我知道,更高端的用戶會用Stylish之類的Firefox擴展來自定義頁面。但不得不說,只會用“選項”來調背景色的用戶更多,不是麼?而同時,如果設計本身就有其他背景色,比如黑色、藍色、綠色之類的,OK,這些設計當然可以設置背景色。但請不要放進reset.css裡。這裡是重置樣式的地方,不是你設計的地方。請把你的設計放在更廣袤的土地上。
所以,簡單說來,NO,不要在reset中設置背景色。
那麼,文字顏色呢?原則上來說,也是不應該設置文字顏色的。但是IE中的表單元素中legend這個對象比較特別,跟主題結合的比較緊密。legend會默認有自己的顏色(跟當前的主題有關)而不會繼承父元素的顏色(即便設了color:inherit;)。
從某些角度來說,可以想當然地認為設置字體顏色人數遠小於設置背景色的人數;以及認為就算設置了背景色,人們看到legend元素是黑色的也不會覺得奇怪。因此,YUI在其reset中設置了legend {color: #000;}是無可厚非的。
但反過來說,把這個放到typography.css或者form.css裡豈不是更好?不同的頁面設計,其對legend的色彩要求很可能是不同的,放在reset.css裡重復定義是沒有必要的。因此這條CSS規則可以作為在reset.css之後首先應當設置的規則。
3,padding和margin
曾經一度流行的* { margin: 0; padding: 0; }
也就是出於這個目的。讓各個元素的padding和margin都歸零,尤其是那些h1和p以及ul/ol/li之類的元素,還有,body本身也是有margin的。清除元素的padding和margin是很有用的。
YUI這樣做:
而Eric這樣做:
可以看到,Eric把幾乎所有的元素都寫上了規則。而YUI只把有padding和margin的元素清空樣式,而其他元素則不動。我個人比較偏好YUI的做法,因為他這樣可以避免給一些無關元素帶上不必要的樣式。導致元素過多時的性能下降。但Eric的也有可取之處,他這樣寫,整個reset.css可以小上不少字節,對服務器的壓力會小一些。但進一步想,這種做法跟用 * 來選擇所有元素還有什麼區別呢?這已經幾乎囊括了所有元素了!你怎麼用呢?看你自己喜好了。
4,邊框
YUI裡:
Eric已經在上一條中把所有的邊框都清掉了,還是推薦用YUI的,理由同上。
5,外邊框(outline)
這個就是元素獲取焦點時的虛線框,在ie之外的浏覽器上可以像下面Eric做的那樣,通過設置outline來消除。
而YUI則沒有設置這一條。而在Eric的樣式中,可以看到Eric的提醒:務必重新定義獲取焦點後的樣式!
這點其實很重要,出於可訪問性的角度出發,那些不便於使用鼠標的人基本上都是用tab導航來浏覽網頁的。獲取焦點的元素有特定樣式的話可以極大幫助這類群體的用戶,通常建議設置成跟:hover一樣。經常設計上會因為這個虛線框而大打折扣。因此這條保留在reset中,並且作為reset.css之後及早定義的規則。
另外,對於在Firefox之類的支持outline的浏覽其中,除了獲取焦點的元素外,浏覽器本身並沒有給元素設置outline屬性,所以,像Eric那樣把所有元素的outline設成0,我就覺得沒有太大必要了。
6,字體樣式(font style/weight/size/variant)
YUI裡,分成了多條:
Eric則在他最終版的reset中去掉了關於這些的樣式重置,只保留了 font-size: 100%;
同樣他沒有給出具體理由。
但通常情況下,我認為還是重置一下這些樣式好,比如strong元素,很多時候只是語義而已,並非希望他真的加粗。可能會有背景色或者其他方式來強調。而之所以這裡都用了inherit這個繼承屬性而不是定義 font-weight: normal;
可以在 Eric 先前的reset文章中看到。這是為了防止——父元素字體加粗了,而沒有一個子元素繼承加粗屬性(因為設置了normal)——這種情況的發生。所以把YUI中設置h1-h6的樣式以及abbr和acronym的兩句樣式都改成inherit會比較好。
此外,對於h1-h6的字體大小定義,建議放到專門的typography.css裡,不建議放在reset.css裡。所以這裡我同樣傾向於用YUI的策略,全部重置。
但是很不幸,在ie6/ie7當中,不論是strong還是h1-h6,亦或是em等元素,設置了inherit均無法繼承父元素屬性,依然保持自己的特色。這就帶來了浏覽器差異,樣式重置本身是為了避免浏覽器差異的,但現在帶來了浏覽器差異,是萬萬不可取的。對於這個問題我考慮了很久,到底是為了統一所有浏覽器都重置成normal(YUI的想法),還是放棄重置這些元素,讓他們順其自然,來保證在所有浏覽器中樣式一樣(Eric的想法)。我最後決定采用YUI的做法。因為,無論重置成normal還是不重置,這些元素都無法繼承父元素屬性。既然如此,那麼退而求其次,保證這些元素都恢復到普通外觀,避免在設計的時候還要重置樣式。
不得不說,這種妥協是僅僅針對IE6和IE7的,也許在5年後,老板和客戶都不要求支持IE7的時候,我們可以放心大膽得使用inherit了。
此外,YUI並沒有給code kbd samp tt 這幾個元素重置字體大小。但實際上在IE中,他們都會被縮小顯示。所以此處應當給予重置font-size: 100%;
7,行高(line-height)
對於行高,YUI並沒有給出重置定義,而Eric則給出了重置:
行高默認所有元素都會繼承的,所以給body設置行高為1就足夠了。通常行高設為1時候,英文照常閱讀,但中文就無法閱讀了,行間距過於緊密導致容易看錯行。通常在中文環境下得設置1.4到1.5才能是用戶正常閱讀。我建議是1.5,這樣算出來的值也是整數。比如字體大小12px的時候行高是18px,字體大小16px時行高24px。看起來也會比較舒服。此外,還有一個不設置成1的重要原因是:IE下,行高為1時,中文字頂部會被削掉幾像素,字體加粗時尤為明顯。所以,重置的原則是好的,但切不可重置為1。
8,列表樣式
YUI用了:
Eric用了:
盡管我沒有測試出YUI的有什麼問題,但我始終覺得設置ol和ul會比較穩妥。而且,波及的元素更少,性能應該更高一點。雖然下載量會多3字節。
9,表格元素
在表格方面,都比較統一。均是:
Eric還提醒到,需要在html中設置cellspacing=”0″ 來達到完美重置效果。
但此外YUI還設置了
讓caption和th元素不要居中。作為重置,是可取的。建議添加此規則。
10,上下標以及baseline
YUI寫成
似乎沒有優化,不知道為何沒有寫到一起去。而Eric則在最開始那條中就已經定義。而其中的問題是,YUI這樣定義了,但沒有重置字體大小,這點是有所遺憾的。既然是重置樣式,就徹底一些,所以建議改成這樣的:
同樣對於Eric把所有元素都放到了Baseline上,包括上標下標。Eric的解釋是,強制讓設計師精確定位這些元素的垂直偏移。
11,插入和刪除(ins/del)
對於這個問題,YUI直接清除了ins的下劃線和del的刪除線這兩個文本裝飾:
而Eric保留了刪除線:
如何取捨?我選擇Eric的,為什麼我這裡不追求完美的樣式重置了呢?很簡單,我這個reset的目標是為了讓我們寫頁面的時候盡量避免浏覽器默認樣式,以及不同浏覽器之間默認樣式差異帶來的問題。而del元素刪除線的文本裝飾,我相信沒有人會反對的。有人會加上其他樣式,比如字體變淡之類的,但對於del如此強語義的元素來說,沒有什麼比用刪除線更能表達含義的了。而不像上面那個focus樣式,未必人人喜歡虛線框。但似乎又沒有什麼浏覽器默認不給del元素加刪除線,故這條可以省略。
所以,這裡我只重置ins樣式,別忘了給ins元素在等下也添加一些樣式。
12,引用元素的引號
某些浏覽器中,q或者blockquote前後會出現引號。這個並不是誰都喜歡的。所以需要重置他。
YUI的比較簡單,只重置了q:
而Eric則比較周到,把q和blockquote都重置了。
OK,就決定用Eric的了,對於樣式重置,細致一點周到一點總沒有錯。
13,鏈接
對於鏈接,YUI和Eric都沒有采取樣式重置,但從我思考許久後還是決定把鏈接樣式重置放進來。究其原因,還是因為樣式重置一來要徹底,二來對於鏈接樣式並非所有設計師都喜歡用下劃線裝飾。因此,我還是建議把鏈接的下劃線重置掉。
但這樣做有點粗糙。真正有下劃線樣式的其實只有 :link和:visited所以改成下面這樣比較好:
此外,對於鏈接顏色,可以作為reset後急需設置的規則來處理。直接放入reset.css中不是很合適。
14,我的重置樣式
總結上面種種規則,這裡給出一下我的CSS重置規則,BSD協議發布,請隨意使用。測試樣本(這個是從YUI那裡復制過來的,感謝YUI為此做出的貢獻。)
下載:reset.css reset-min.css
15,完成一個初步的CSS框架
之前提到了,樣式重置作為一個所有項目可以使用的共性存在,而不同的項目應當有其個性。當然還有其他一些共性,不屬於樣式重置的部分,但同樣重要。再往下講就可以做一個CSS框架了。CSS框架所要考慮的內容遠比一個CSS Reset要考慮的多很多,這裡只是點到為止,不做更多展開。
layout.css
首先除了reset.css之外要建立的layout.css,這裡目前主要推薦放入.clearfix。清除浮動很重要。但這不屬於樣式重置,放在布局當中正合適。
此外,layout.css中還可以放入自己常用的布局,比如 #wrap{margin:0 auto;width:960px;}
之類的規則。看個人喜好而定。
typography.css
這裡可以放置很多規則,非常重要的是以下三個:
:focus, a, ins
這三個是被重置掉的,但又很重要的內容,建議在reset之後立即在typography中設定全站樣式,保持樣式統一。
ins可以單獨設置, :focus 最好設置成跟 :hover一樣,而a的樣式還是按照LoVe,HAte的法則來設置。
h1-h6系列也是之前被重置掉的。可以考慮在這裡設置樣式。按站點特性來定。我個人是不喜歡全局定義hx系列的字體大小的,統一為100%我覺得挺好。
接下來要設置的是font-family屬性,可以參考射雕的文章。另外,小麥的文章中提到,表單元素的字體在IE中都不能繼承父元素的字體,所以要單獨設置。
至於其他需要全局設置的,可以參考前文中的敘述,找到相應的部分添加到typography.css中即可。這樣就可以在保證reset.css通用性的情況下,使不同的項目又有個性。盡量保證reset.css在所有項目中都是一樣的。有利於項目的開發。最後不要忘記在寫表格的時候加cellspacing=”0″ 來達到完美重置效果。
16,探討
文章寫的比較倉促,也受限與本人能力所限,只能寫到這裡。歡迎留言探討,也可發郵件或上Twitter找我。以便進一步完善這個reset。謝謝。