关于CSS Reset 于Normalize.css
前言
近期在翻閱陳舊的歷史資料,整理之前飽受爭議的CSS Reset問題,不過好像十多年過去,現在大家統一了口徑,紛紛推薦使用Normalize.css,包括Bootstrap都進行了內置使用,可見它的認可程度之高。
由于文章涉及內容較多,會分為章節進行介紹:
第一章,
整理CSS Reset歷史的演變痕跡,從第一份CSS Reset的誕生,到提出No CSS Reset的思想,再到國產CSS Reset 1.0版本的驕傲誕生;最終時過境遷,CSS Reset被Normalize.css所替代;
隨后開始認識Normalize.css,了解它都做了那些事情,訴說與CSS Reset的區別,突出優勢,告訴你為什么要使用它。
第二章,
由于Normalize.css只提供了英文文檔,沒有提供對應的中文版本,所以從這章開始對其源碼進行翻譯整理與解讀,本章包含 html與body,HTML5元素,鏈接,語義化文本標簽,內嵌元素,群組元素等內容解讀。
第三章,
繼續來介紹源碼中的表單和表格部分,并且整理一份normalize-zh.css中文注釋的版本上傳至Github,供大家參考使用,敬請期待
CSS Reset 歷史回顧
第一份 CSS Reset
為什么會有CSS Reset的存在呢?那是因為早期的瀏覽器支持和理解的CSS規范不同,導致渲染頁面時效果不一致,會出現很多兼容性問題。 關于?瀏覽器的默認樣式?請點擊查閱!
根據玉伯的文章中透漏,最早的一份CSS Reset來自Tantek 的undohtml.css,從URL中的日期可以看出時間是2004年,Tantek根據自身需要對于一些標簽進行了簡單的重置,源碼如下:
/* undohtml.css */ /* (CC) 2004 Tantek Celik. Some Rights Reserved. */ :link,:visited { text-decoration:none } ul,ol { list-style:none } h1,h2,h3,h4,h5,h6,pre,code { font-size:1em; } ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote, fieldset,input{ margin:0; padding:0 } a img,:link img,:visited img { border:none } address { font-style:normal }核心代碼與作用
隨后加入到CSS Reset的行列的大牛越來越多,比如業界領袖?YUI團隊?以及Eric Meyer把這份代碼內容變的更加充實,但是不難發現代碼的核心部分還是對樣式進行重置,在此可以結論出早期的CSS Reset的作用就是清除所有瀏覽器默認樣式,讓它一切歸零!
* { margin:0; padding:0 }不過在此之后一段時間內,有人開始批判這種暴力清零的CSS Reset方式,隨后部分前端開發者們也傳來一些爭議聲音,比如:
注:由于都是一些陳舊的老問題,就不提供出處了,再此不過多討論,感興趣Google~
No CSS Reset 思想
其實面對于爭議問題,國外的大牛Jonathan Snook是第一個提出No CSS Reset思想,其核心是Less is more,少即是多,不再提倡使用暴力歸零的方法。
后來玉伯也在《Reset CSS研究》文章中闡述說明,其實 Eric Meyer 并不期望大家下載他的?CSS Reset?后直接就拿去用,而是應該按照自己的需求,適量裁剪和修改后再進行使用。
后來YUI更新了CSS Reset,還配套了?cssfonts.css?和?cssbase.css。cssreset.css只負責清除默認樣式,而cssfonts.css和?cssbase.css?則負責將一些元素的默認樣式再重設回來,這樣就消除了之前的爭議,這一方案迅速被大家接受了,又開始愉快的拷貝使用起來。
YUI 提供的cssfonts.css
/* YUI 3.18.1 (build f7e7bcb) Copyright 2014 Yahoo! Inc. All rights reserved. Licensed under the BSD License. http://yuilibrary.com/license/ *//*** Percents could work for IE, but for backCompat purposes, we are using keywords.* x-small is for IE6/7 quirks mode.*/ body {font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small; /* for IE */*font:x-small; /* for IE in quirks mode */ }/*** Nudge down to get to 13px equivalent for these form elements*/ select, input, button, textarea {font:99% arial,helvetica,clean,sans-serif; }/*** To help tables remember to inherit*/ table {font-size:inherit;font:100%; }/*** Bump up IE to get to 13px equivalent for these fixed-width elements*/ pre, code, kbd, samp, tt {font-family:monospace;*font-size:108%;line-height:100%; }/* YUI CSS Detection Stamp */ #yui3-css-stamp.cssfonts { display: none; }國產 CSS Reset
上面展現的是YUI最新版本V3.18.1,但是很尷尬的發現,YUI 提供的?cssfonts.css?和?cssbase.css?只考慮了西歐文字,對漢字的支持卻不多,這就導致中國很多用戶只使用了cssreset.css,而沒有使用其他兩個。
據說nake和adiaos兩大運動品牌到天朝后,有些運動科技會縮水,但是萬萬沒想到,萬能的代碼到了天朝也是會縮水的。
于是乎,有些大牛不甘心,不僅僅厭倦了國內抄來抄去的CSS Reset現狀,也受夠了YUI只考慮西歐洲字體,不考慮漢字的缺陷,大廠們就開始摸索制定屬于自己的CSS Reset,比如2009年阿里Kissy框架 (源碼連接已失效,主頁留紀念) 的第一份CSS Reset:
/* KISSY CSS Reset 理念:清除和重置是緊密不可分的 特色:1.適應中文 2.基于最新主流瀏覽器 維護:玉伯(lifesinger@gmail.com), 正淳(ragecarrier@gmail.com) *//* 清除內外邊距 */ body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 結構元素 */ dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ pre, /* text formatting elements 文本格式元素 */ fieldset, lengend, button, input, textarea, /* form elements 表單元素 */ th, td { /* table elements 表格元素 */margin: 0;padding: 0; }/* 設置默認字體 */ body, button, input, select, textarea { /* for ie *//*font: 12px/1 Tahoma, Helvetica, Arial, "宋體", sans-serif;*/font: 12px/1 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif; /* 用 ascii 字符表示,使得在任何編碼下都無問題 */ }h1 { font-size: 18px; /* 18px / 12px = 1.5 */ } h2 { font-size: 16px; } h3 { font-size: 14px; } h4, h5, h6 { font-size: 100%; }address, cite, dfn, em, var { font-style: normal; } /* 將斜體扶正 */ code, kbd, pre, samp, tt { font-family: "Courier New", Courier, monospace; } /* 統一等寬字體 */ small { font-size: 12px; } /* 小于 12px 的中文很難閱讀,讓 small 正常化 *//* 重置列表元素 */ ul, ol { list-style: none; }/* 重置文本格式元素 */ a { text-decoration: none; } a:hover { text-decoration: underline; }abbr[title], acronym[title] { /* 注:1.ie6 不支持 abbr; 2.這里用了屬性選擇符,ie6 下無效果 */border-bottom: 1px dotted;cursor: help; }q:before, q:after { content: ''; }/* 重置表單元素 */ legend { color: #000; } /* for ie6 */ fieldset, img { border: none; } /* img 搭車:讓鏈接里的 img 無邊框 */ /* 注:optgroup 無法扶正 */ button, input, select, textarea {font-size: 100%; /* 使得表單元素在 ie 下能繼承字體大小 */ }/* 重置表格元素 */ table {border-collapse: collapse;border-spacing: 0; }/* 重置 hr */ hr {border: none;height: 1px; } /* 讓非ie瀏覽器默認也顯示垂直滾動條,防止因滾動條引起的閃爍 */ html { overflow-y: scroll; }這應該是國內的第一份CSS Reset,是玉伯和另外一位前輩完成的,向他們致敬,記得玉伯在寫完第一版本后,在總結文章的結尾還是千叮嚀,萬囑咐說:
請記住:永遠不存在萬能解決方案,永遠沒有銀彈。
因此我的建議和 Eric 是一樣的:請根據具體需求,適量裁剪和修改后再使用。
替代品 Normalize.css
再把歷史拉回到今天,時過遷境,中國的前端職位越發的火熱,開發者們也變得更為專業,CSS Reset?泛濫使用逐漸淡出的前端的視野,被取而代之就是Normalize.css,關于對CSS Reset?與?Normalize.css的區別?可以引用知乎上?張小核桃的一個回答:
CSS Reset 是革命黨,CSS Reset 里最激進那一派提倡不管你小子有用沒用,通通給我脫了那身衣服,憑什么你 body 出生就穿一圈 margin,憑什么你姓 h 的比別人吃得胖,憑什么你 ul 戴一胳膊珠子。于是 *{margin:0;} 等等運動,把人家全拍扁了。看似是眾生平等了,實則是浪費了資源又占不到便宜,有求于人家的時候還得賤賤地給加回去,實在需要人家的默認樣式了怎么辦?人家鍋都扔爐子里燒了,自己看著辦吧。
Normalize.css 是改良派。他們提倡,各個元素都有其存在的道理,簡單粗暴地一視同仁是不好的。body 那一圈確實擠壓了頁面的生存空間,那就改掉。士農工商,誰有誰的作用,給他們制定個規范,確保他們在任何瀏覽器里都干好自己的活兒。
下面開始對Normalize.css進行簡單的介紹,關于兩者的差異區別可以看問答平臺:
使用normalize.css遇到的問題?
Normalize.css 和 Reset CSS 有什么本質區別沒?
Normalize.css 簡單介紹
關于對Github的介紹,這里引用?咀嚼之味?針對?官方介紹?翻譯的的?中文版本。
簡要概述
Normalize.css?是@necolas和@jon_neal?兩位大牛花了幾百個小時來研究不同瀏覽器的默認樣式的差異而得出的結晶,感謝前輩們的貢獻。
Normalize.css 只是一個很小的CSS文件,但它在默認的HTML元素樣式上提供了跨瀏覽器的高度一致性。相比于傳統的CSS Reset,Normalize.css是一種現代的、為HTML5準備的優質替代方案。Normalize.css現在已經被用于Twitter Bootstrap、HTML5 Boilerplate、GOV.UK、Rdio、CSS Tricks 以及許許多多其他框架、工具和網站上。
目前Normalize.css?已經成為了CSS Reset的替代方案是無可爭議的事情了。國內著名的AliceUI,AmazeUI?框架都是基于或者借鑒Normalize.css進行的制定化版本。
可以從這里下載:
Github:https://github.com/necolas/normalize.css/
做了那些事
Normalize.css做了以下幾件事:
- Preserves useful defaults, unlike many CSS resets.
保護有用的瀏覽器默認樣式而不是完全去掉它們 - Normalizes styles for a wide range of elements
一般化的樣式:為大部分HTML元素提供 - Corrects bugs and common browser inconsistencies
修復瀏覽器自身的bug并保證各瀏覽器的一致性 - Improves usability with subtle improvements
優化CSS可用性:用一些小技巧 - Explains what code does using detailed comments
解釋代碼:用注釋和詳細的文檔來
優勢對比
前面講到CSS Reset的核心作用就是清零,而且過于暴力;那么作為后者Normalize.css,到底有什么優勢可以完全取代前者呢?
1.Normalize.css 保護了有價值的默認值
Reset通過為幾乎所有的元素施加默認樣式,強行使得元素有相同的視覺效果。 相比之下,Normalize.css保持了許多默認的瀏覽器樣式。 這就意味著你不用再為所有公共的排版元素重新設置樣式。 當一個元素在不同的瀏覽器中有不同的默認值時,Normalize.css會力求讓這些樣式保持一致并盡可能與現代標準相符合。
2.Normalize.css 修復了瀏覽器的bug
它修復了常見的桌面端和移動端瀏覽器的bug。這往往超出了Reset所能做到的范疇。 關于這一點,Normalize.css修復的問題包含了HTML5元素的顯示設置、預格式化文字的font-size問題、在IE9中SVG的溢出、許多出現在各瀏覽器和操作系統中的與表單相關的bug。
3.Normalize.css 修復了瀏覽器的bug
使用Reset最讓人困擾的地方莫過于在瀏覽器調試工具中大段大段的繼承鏈。在Normalize.css中就不會有這樣的問題,因為在我們的準則中對多選擇器的使用時非常謹慎的,我們僅會有目的地對目標元素設置樣式。
4.Normalize.css 是模塊化的
這個項目已經被拆分為多個相關卻又獨立的部分,這使得你能夠很容易也很清楚地知道哪些元素被設置了特定的值。因此這能讓你自己選擇性地移除掉某些永遠不會用到部分(比如表單的一般化)。
5.Normalize.css 擁有詳細的文檔
Normalize.css的代碼基于詳細而全面的跨瀏覽器研究與測試。這個文件中擁有詳細的代碼說明并在Github Wiki中有進一步的說明。這意味著你可以找到每一行代碼具體完成了什么工作、為什么要寫這句代碼、瀏覽器之間的差異,并且你可以更容易地進行自己的測試。
這個項目的目標是幫助人們了解瀏覽器默認是如何渲染元素的,同時也讓人們很容易地明白如何改進瀏覽器渲染。
源碼解析
雖然Normalize.css第五條優勢是說提供了詳細的文檔,但是它并沒有提供對應的中文版本,首先英文注釋看起來不夠清晰,其次對問題的解析程度也不夠細化,而且也不包含問題案例,所以接下來一章會對Normalize.css源碼進行模塊解讀與翻譯整理。
總結
以上是生活随笔為你收集整理的关于CSS Reset 于Normalize.css的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu安装minisat_为Lat
- 下一篇: CSS 基本样式