歡迎光臨
每天分享高質量文章

關於CSS Reset那些事(2):Normalize.css 原始碼解讀

作者:Alsiso

網址:http://alsiso.github.io/2015/07/27/cssreset-one/

前言

上一章節介紹了CSS Reset的歷史,最後對Normalize.css做了簡單的瞭解,所以從這節開始對原始碼進行註釋翻譯與解讀,盡可能從最根本性的問題瞭解它在幫我們做什麼?

Normalize 原始碼解讀

前面講到的分模組解讀,就是先黏貼一段原始碼,然後根據官方提供的註釋進行翻譯整理,盡可能提供案例解析,然後再次進行整理總結,如果你有疑問,可以留言一起交流。

原始碼地址:https://github.com/necolas/normalize.css/blob/master/normalize.css

原始碼版本:v3.0.3

html與body 元素

/**

* 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 */

}

  1. 設定全域性的字型為sans-serif,關於中文字型的設定可參考 Amaze UI
  2. 防止 iOS 橫屏字號放大,同時保證在PC上 zoom 功能正常

第2個問題場景是這樣,蘋果IOS裝置調整後會自動調整文字的大小,按照蘋果的意圖是為了提升使用者體驗,比如豎屏狀態下是14px,轉換為橫屏時就變成了20px,把text-size-adjust:100%就不會調整字型大小了。

如果把值設定為’text-size-adjust:none’,那麼就會導致用戶無法放大縮小字型了。

/**

* Remove default margin.

*/

body {

margin: 0;

}

  • 修複瀏覽器預設邊距,統一效果

HTML5 元素 display definitions

/**

* 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,

essay-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. 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垂直對齊。

/**

* 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屬性,這裡的辦法是直接隱藏該元素

/**

* 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

/**

* Remove the gray background color from active links in IE 10.

*/

a {

background-color: transparent;

}

  • 去掉 IE 10+ 點選連結時的灰色背景

/**

* Improve readability of focused elements when they are also in an

* active/hover state.

*/

a:active,

a:hover {

outline: 0;

}

  • 去掉點選時的outline焦點框,同時保證使用鍵盤可以顯示焦點框,這個操作針對所有瀏覽器

語意化文字標簽 Text-level semantics

/**

* Address styling not present in IE 8/9/10/11, Safari, and Chrome.

*/

abbr[title] {

border-bottom: 1px dotted;

}

  • 修正abbr元素在 Firefox 外其他瀏覽器沒有下劃線的問題

語意abbr標簽是表示簡稱或縮寫,自身的title屬性是完整版,但是此標簽在Firefox下預設有下邊框,而其他瀏覽器中沒有,這裡統一了樣式。

/**

* 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,這裡統一了樣式。

/**

* Address styling not present in Safari and Chrome.

*/

dfn {

font-style: italic;

}

  • 修正 Safari5 和 Chrome 中沒有樣式的問題

dfn 標簽可標記那些對特殊術語或短語的定義,在Safari 和Chrome 裡不是斜體,在這裡統一了樣式。

/**

* 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字型大小

/**

* Address styling not present in IE 8/9.

*/

mark {

background: #ff0;

color: #000;

}

  • 修複 IE 6/9, Safari 5 和 Chrome中樣式不呈現的問題

mark標簽用來突出顯示部分文字,設定後會有一個高亮背景,但是此標簽是HTML5中的新標簽,在低版本瀏覽器並不識別,所以需要重置樣式。

/**

* Address inconsistent and variable font size in all browsers.

*/

small {

font-size: 80%;

}

  • 在所有瀏覽器中統一small的字型大小

small標簽在 HTML 4.01 就已經存在,HTML5 中增強了它的寓意,表示旁註資訊,不過此標簽在各個瀏覽器中呈現的字型大小不一樣,在這裡做了統一

/**

* 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

/**

* Remove border when inside `a` element in IE 8/9/10.

*/

img {

border: 0;

}

  • 去除 IE6-9 和 Firefox 3 中a內部img元素預設的邊框

在舊版本的瀏覽器中,圖片預設會有一個奇醜無比的藍色邊框,這這裡進行清除,統一樣式。

/**

* Correct overflow not hidden in IE 9/10/11.

*/

svg:not(:root) {

overflow: hidden;

}

  • 修複 IE9 中的overflow的怪異表現

群組元素 Grouping content

/**

* 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失效,這裡做了統一設定。

/**

* 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;

此樣式對這兩個問題進行重置,進行統一

/**

* Contain overflow in all browsers.

*/

pre {

overflow: auto;

}

  • 標簽設定捲軸,內容上限溢位時出現

大部分瀏覽器的pre在overflow的時候會直接上限溢位去,這裡加上overflow:auto讓它出現捲軸

/**

* 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,供大家參考使用,敬請期待…

贊(0)

分享創造快樂