前言
上一章節介紹了CSS Reset的歷史,最後對Normalize.css做了簡單的瞭解,所以從這節開始對原始碼進行註釋翻譯與解讀,儘可能從最根本性的問題了解它在幫我們做什麼?
回顧:關於CSS Reset 那些事(一)之 歷史演變與Normalize.css
Normalize 原始碼解讀
前面講到的分模組解讀,就是先黏貼一段原始碼,然後根據官方提供的註釋進行翻譯整理,儘可能提供案例解析,然後再次進行整理總結,如果你有疑問,可以留言一起交流。
原始碼地址:https://github.com/necolas/normalize.css/blob/master/normalize.css
原始碼版本:v3.0.3
html與body 元素
1 2 3 4 5 6 7 8 9 10 |
/** * 1. Set default font family to sans-serif. * 2. Prevent iOS and IE text size adjust after device orientation change, * without disabling user zoom. */ html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } |
- 設定全域性的字型為sans-serif,關於中文字型的設定可參考 Amaze UI
- 防止 iOS 橫屏字號放大,同時保證在PC上 zoom 功能正常
第2個問題場景是這樣,蘋果IOS裝置調整後會自動調整文字的大小,按照蘋果的意圖是為了提升使用者體驗,比如豎屏狀態下是14px
,轉換為橫屏時就變成了20px
,把text-size-adjust:100%
就不會調整字型大小了。
如果把值設定為'text-size-adjust:none'
,那麼就會導致使用者無法放大縮小字型了。
1 2 3 4 5 6 7 |
/** * Remove default margin. */ body { margin: 0; } |
- 修復瀏覽器預設邊距,統一效果
HTML5 元素 display definitions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * Correct `block` display not defined for any HTML5 element in IE 8/9. * Correct `block` display not defined for `details` or `summary` in IE 10/11 * and Firefox. * Correct `block` display not defined for `main` in IE 11. */ article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } |
- 修復 IE 8/9,HTML5新元素不能正確顯示的問題,定義為
block
的元素 - 修復 IE 10/11,
details
和summary
定義為block
的元素 - 修復 IE 11,
main
定義為block
的元素
這個問題想必大家都已經非常清楚,當低版本瀏覽器遇到不識別的元素時,會預設把他們當成內聯元素(inline
),這裡重新定義成為block
元素。
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * 1. Correct `inline-block` display not defined in IE 8/9. * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. */ audio, canvas, progress, video { display: inline-block; /* 1 */ vertical-align: baseline; /* 2 */ } |
- 修復 IE 8/9,HTML5新元素不能正確顯示的問題,定義為
inline-block
元素 - 修復Chrome, Firefox, 和Opera的
progress
元素沒有以baseline垂直對齊
progress
是HTML5的新標籤,可以定義進度條,但是它Chrome, Firefox, 和Opera並沒有已baseline垂直對齊。
1 2 3 4 5 6 7 8 |
/** * Prevent modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } |
- 對不支援
controls
屬性的瀏覽器,audio
元素給以隱藏 - 移除iOS5裝置中多餘的高度
在IE8之前的瀏覽器是不支援controls
屬性,這裡的辦法是直接隱藏該元素
1 2 3 4 5 6 7 8 9 |
/** * Address `[hidden]` styling not present in IE 8/9/10. * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. */ [hidden], template { display: none; } |
- 修復 IE 7/8/9,Firefox 3 和 Safari 4 中
hidden
屬性不起作用的問題 - 在 IE,Safari,Firefox 22- 中隱藏
template
元素
hidden
是HTML5的新元素,可以對元素進行隱藏,但是低版本瀏覽器並不會識別它,這裡統一做了樣式。
template
標籤用於HTML模板,大家應該都是用過HTML模版開發頁面,這個標籤是按照實際需求新增的,但是模板又不能在介面上顯示,所以這裡統一了樣式,相容舊瀏覽器。
連結 Links
1 2 3 4 5 6 7 |
/** * Remove the gray background color from active links in IE 10. */ a { background-color: transparent; } |
- 去掉 IE 10+ 點選連結時的灰色背景
1 2 3 4 5 6 7 8 9 |
/** * Improve readability of focused elements when they are also in an * active/hover state. */ a:active, a:hover { outline: 0; } |
- 去掉點選時的
outline
焦點框,同時保證使用鍵盤可以顯示焦點框,這個操作針對所有瀏覽器
語義化文字標籤 Text-level semantics
1 2 3 4 5 6 7 |
/** * Address styling not present in IE 8/9/10/11, Safari, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } |
- 修正
abbr
元素在 Firefox 外其他瀏覽器沒有下劃線的問題
語義abbr
標籤是表示簡稱或縮寫,自身的title
屬性是完整版,但是此標籤在Firefox下預設有下邊框,而其他瀏覽器中沒有,這裡統一了樣式。
1 2 3 4 5 6 7 8 |
/** * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. */ b, strong { font-weight: bold; } |
- Firefox3+,Safari4/5 和 Chrome 中統一設定為粗體
Firefox 3+, Safari 和 Chrome 給b
和strong
設定的屬性是bolder
,而不是bold
,這裡統一了樣式。
1 2 3 4 5 6 7 |
/** * Address styling not present in Safari and Chrome. */ dfn { font-style: italic; } |
- 修正 Safari5 和 Chrome 中沒有樣式的問題
dfn
標籤可標記那些對特殊術語或短語的定義,在Safari 和Chrome 裡不是斜體,在這裡統一了樣式。
1 2 3 4 5 6 7 8 9 |
/** * Address variable `h1` font-size and margin within `section` and `article` * contexts in Firefox 4+, Safari, and Chrome. */ h1 { font-size: 2em; margin: 0.67em 0; } |
- 修復 Firefox 4+,Safari 5 和 Chrome 中
section
和article
內的h1
字型大小
1 2 3 4 5 6 7 8 |
/** * Address styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } |
- 修復 IE 6/9, Safari 5 和 Chrome中樣式不呈現的問題
mark
標籤用來突出顯示部分文字,設定後會有一個高亮背景,但是此標籤是HTML5中的新標籤,在低版本瀏覽器並不識別,所以需要重置樣式。
1 2 3 4 5 6 7 |
/** * Address inconsistent and variable font size in all browsers. */ small { font-size: 80%; } |
- 在所有瀏覽器中統一
small
的字型大小
small
標籤在 HTML 4.01 就已經存在,HTML5 中增強了它的寓意,表示旁註資訊,不過此標籤在各個瀏覽器中呈現的字型大小不一樣,在這裡做了統一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } |
- 防止所有瀏覽器中的
sub
和sup
影響行高
sup
和sub
兩個標籤是用來表示上標和下標,據HTML標準中對small
,sub
和sup
的大小要求都是smaller
,但是如上所示normalize.css
給small
設的是80%,而sub
和sup
卻是75%,所以為了保持一致,且不影響其他元素的行高,把兩者的line-height
設為0
,然後設定它的垂直以baseline開始,設定top
和bottom
手動設定兩者偏移量
內嵌元素 Embedded content
1 2 3 4 5 6 7 |
/** * Remove border when inside `a` element in IE 8/9/10. */ img { border: 0; } |
- 去除 IE6-9 和 Firefox 3 中
a
內部img
元素預設的邊框
在舊版本的瀏覽器中,圖片預設會有一個奇醜無比的藍色邊框,這這裡進行清除,統一樣式。
1 2 3 4 5 6 7 |
/** * Correct overflow not hidden in IE 9/10/11. */ svg:not(:root) { overflow: hidden; } |
- 修復 IE9 中的
overflow
的怪異表現
群組元素 Grouping content
1 2 3 4 5 6 7 |
/** * Address margin not present in IE 8/9 and Safari. */ figure { margin: 1em 40px; } |
- 修復 IE 8/9、Safari中margin失效
figure
是HTML5的新標籤,用做文件插圖,但它在 IE 8/9 and Safari 中的預設margin
失效,這裡做了統一設定。
1 2 3 4 5 6 7 8 |
/** * Address differences between Firefox and other browsers. */ hr { box-sizing: content-box; height: 0; } |
- 修正 Firefox 和其他瀏覽器之間的差異
在 Firefox 中,hr
元素的預設樣式很多,和其它瀏覽器主要的差異有兩點:
1.設定了height
為2px
;
2.box-sizing
為border-box
;
此樣式對這兩個問題進行重置,進行統一
1 2 3 4 5 6 7 |
/** * Contain overflow in all browsers. */ pre { overflow: auto; } |
- 標籤設定滾動條,內容溢位時出現
大部分瀏覽器的pre
在overflow
的時候會直接溢位去,這裡加上overflow:auto
讓它出現滾動條
1 2 3 4 5 6 7 8 9 10 11 |
/** * Address odd `em`-unit font size rendering in all browsers. */ code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } |
- 用於修復 Safari 5 和 Chrome 中奇怪的字型設定,統一字型樣式,
總結
此章節我們對Normalize.css中設定的 html與body元素,HTML5元素,連結,語義化文字,內嵌元素,群組元素 的原始碼進行詳細的解讀,發現正如其說的一樣,它不僅僅幫我們修復了瀏覽器的預設bug,還保留了許多標籤的預設值,尤其是語義化標籤,堅持他們存在的意義。
由於原始碼部分過長,所以對於原始碼的解析會分為兩節,下一節我們繼續來介紹:
表單:表單往往存在很多問題,如常見的各種不繼承問題,這這裡都會得到修復
表格:表格的預設邊距和邊框真的很醜,需要修復修復
下一節會完成所有模組對normalize.css原始碼解讀,屆時會整理一份normalize-zh.css
中文註釋的版本上傳至Github,供大家參考使用,敬請期待…