重拾css(5)——瀏覽器默認樣式

上一節介紹了樣式的五種來源,我們再經過一張圖回顧一下。css

圖片描述

對於上面的三層,我們大概都比較熟悉了。下面的兩層中,用戶自定義樣式通常也就是改一改字號大小和字體樣式,也沒甚好說的。而最有的說的就是瀏覽器的默認樣式。html

不一樣瀏覽器的默認樣式多少有些區別,特別是老版本的瀏覽器之間,如今高級瀏覽器愈來愈向統一的標準靠攏,對前端程序猿來講是一件好事情。雖然有些許差別,可是絕大部分仍是相同的,我先把代碼粘貼出來 ,具體的解讀我們慢慢道來(只說重點,比較容易的或者不經常使用的就不說了)。前端

html, address, 
blockquote, 
body, dd, div, 
dl, dt, fieldset, form, 
frame, frameset, 
h1, h2, h3, h4, 
h5, h6, noframes, 
ol, p, ul,center, 
dir, hr, menu, pre{ display: block} 
/* 以上按照block顯示,沒有規定的則按照默認的inline顯示 */

li { display: list-item} 
/* 程序猿經常使用的display值是:inline/block/inline-block,不多用到 list-item
list-item究竟是什麼樣的顯示效果,能夠經過例子驗證。。。。
第一,你能夠不用ul-li,而用其餘標籤實現list-item的效果
第二,要意識到,瀏覽器對待html只是把它看成一個dom樹,至於顯示成什麼效果,是經過瀏覽器默認的css實現的,即樣式所有經過css設計,和html無關 */

head { display: none} 
table { display: table } 
/* display:table 和 block 最大的區別在於:包裹性。 提到包裹性,就不得不提一下float和absolute*/

tr { display: table-row} 
thead { display: table-header-group} 
tbody { display: table-row-group} 
tfoot { display: table-footer-group} 
col { display: table-column} 
colgroup { display: table-column-group} 
td, th { display: table-cell; } 
/* 與table相關的其餘display值,研究的意義不大,可是table-cell值得一說。
table-cell是多列布局的最新解決方案,比使用float更加有效(不兼容IE六、7)
實際上table-cell是要依賴其餘table相關的display,可是瀏覽器會爲咱們作這些工做,沒必要手動填寫 */

caption{ display: table-caption} 
th { font-weight: bolder; text-align: center} 
/* 標題默認設置了粗體和文字居中 */

caption{ text-align: center} 
body { margin: 8px; line-height: 1.12} 
/* 不一樣瀏覽器的margin不同,因此要設置【 *{margin:0} 】 
line-height:1.12 針對英文沒問題,可是中文看起來很彆扭
另外,1.12是一個相對值(即1.12em),與文字有關的距離設置最好用相對值*/

h1{ font-size: 2em; margin: .67em 0} 
h2{ font-size:1.5em; margin: .75em 0} 
h3{ font-size: 1.17em; margin: .83em 0} 
h4, p, 
blockquote, ul, 
fieldset, form, 
ol, dl, dir, 
menu { margin:1.12em 0} 
/* em是相對單位,1em就是一單位,瀏覽器默認的一單位是16px,
能夠經過 body{font-size:20px} 來修改一單位的值
p的字體大小是1em,h1是2em,h2是1.5em,等等
另外,與文字相關的距離值,最好用相對單位,例如 line-height:1.4; margin:.5em等等,這樣作的好處就是當自定義了1em的絕對px時,line-height也會跟着變 */

/* 注意,若是咱們本身寫css【 * {margin:0} 】,能夠把p、h一、h2等標籤的margin覆蓋掉
咱們都知道,*選擇器的權重是最低的,可是它卻能覆蓋掉標籤選擇器,說明瀏覽器已經在這裏面作了手腳
瀏覽器沒有讓默認樣式和用戶自定義樣式「公平競爭」,而是優先用戶自定義樣式 */

h5{ font-size: .83em; margin: 1.5em 0} 
h6{ font-size: .75em; margin: 1.67em 0} 
h1, h2, h3, h4, 
h5, h6, b, 
strong { font-weight: bolder} 
/* 這裏能夠看到哪些標籤文字是加粗的 */

blockquote { margin-left: 40px; margin-right: 40px} 
i, cite, em, 
var, address { font-style: italic} 
/* 這裏能夠看到哪些標籤是斜體 */

pre, tt, code, 
kbd, samp { font-family: monospace} 
pre{ white-space: pre} 
button, textarea, 
input, object, 
select { display:inline-block; } 
/* 不知道inline-block是什麼樣子的?或者不知道inline-block有什麼特性?
在這裏看看哪些標籤是inline-block,就知道inline-block的用處了
具體inline-block的用途,咱們會在後面詳細介紹,此處只是點出來 */

big { font-size: 1.17em} 
small, sub, sup { font-size: .83em} 
sub{ vertical-align:sub} 
sup { vertical-align: super} 
table { border-spacing: 2px; } 
thead, tbody, 
tfoot { vertical-align: middle} 
td, th { vertical-align: inherit } 
s, strike, del { text-decoration: line-through} 
hr {border: 1px inset} 
/* 爲何<hr/>默認是那麼個難看的樣子,特別是IE下,這就是罪魁禍首 */

ol, ul, dir, 
menu, dd { margin-left: 40px} 
ol {list-style-type: decimal} 
/* ul 和 ol 在默認狀況下都會有一篇左邊的間距,在這裏能夠看到爲什麼會有間距,以及間距的具體大小是多少。
 */

ol ul, ul ol, 
ul ul, ol ol { margin-top: 0;margin-bottom: 0} 
u, ins { text-decoration: underline} 
br:before {content: "A"} 
/* ????????????? */
:before, :after { white-space: pre-line } 
/* <br/>爲什麼能實現換行?瀏覽器獲得html的br標籤,只會解析成一個dom節點而已,
而「換行」這一功能是經過這裏實現的????? */

center{text-align: center} 
abbr, acronym { font-variant: small-caps; letter-spacing: 0.1em} 
:link, :visited { text-decoration: underline} 
:focus {outline: thindottedinvert} 

/* Begin bidirectionality settings (do not change) */
BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override} 
BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override} 

*[DIR="ltr"] { direction: ltr; unicode-bidi: embed} 
*[DIR="rtl"] { direction:rtl; unicode-bidi: embed} 
/* 這些標籤或屬性都不經常使用 */

@media print{ 
h1{ page-break-before:always} 
h1, h2, h3, 
h4, h5, h6{ page-break-after: avoid} 
ul, ol, dl { page-break-before: avoid}
/* 對於打印頁面時的設置,不經常使用 */

/* 如下都是按照標籤選擇器來的,標籤選擇器比類、id選擇器的權重都低。
因此,用戶自定義的樣式,不管是用標籤、類仍是id,都能覆蓋默認的標籤選擇器 */

瀏覽器默認樣式

1.理念上的轉變

在解讀代碼以前,我先把我看瀏覽器默認樣式最大的體會給你們說一下,這個是很是重要的。就是要先從理念上從新認識html和css。瀏覽器

之前我都是認爲瀏覽器自身原本就認識各類html標籤,而且會根據規則設置標籤的樣子,例如p是block顯示,ul有margin-left,h1粗體顯示……之前覺得這些標籤默認的顯示方式和css無關,是瀏覽器本身乾的,css設置網頁樣式是加載以後又渲染的。dom

如今知道這種想法是錯誤的。其實瀏覽器加載了html以後只爲一件東西——生成dom樹,瀏覽器把html變爲dom樹結構,就完成了對html的結構化。至於後來對視圖的渲染,p是block、br換行,那是整合了css以後的事情。而瀏覽器整合css又是另外一個路線,和解析html是分開的。這裏的「css」就包含了瀏覽器默認樣式。ide

能夠結合下圖理解:佈局

圖片描述

一句話,瀏覽器將載入的html變爲dom樹,可是此時沒有任何顯示樣式。因此顯示的樣式,都是css定義的,瀏覽器只會經過css來渲染視圖樣式。學習

2.block元素

圖片描述

爲什麼默認狀況下p、h一、ul、div都是block顯示,就是這裏定義的。因此,不要再說div天生就是block——這句話應該換成:瀏覽器默認樣式天生規定了div是block——因此才致使了div是block!是默認樣式規定的,不是瀏覽器的內核規定的。字體

沒有設置block的元素,默認爲inline顯示。spa

3.display:list-item

圖片描述

咱們在使用display時,經常使用的值通常是:inline/block/inline-block,用不到list-item。那這裏的list-item到底有什麼做用?咱們不妨親自試一試:

圖片描述

看到沒有,出現了ul-li中的效果了吧,若是再加一個margin-left是否是就跟ul-li同樣了?

因此,ul-li爲何會默認顯示成那種樣子?——list-item纔是「罪魁禍首」。

4.display:table

圖片描述

先給出一個快速思考題:<table>和<div>在容器尺寸上最大區別是什麼(只是容器尺寸,不考慮內容區別)?請在兩秒鐘內說出答案。

答案是——div寬度和父容器相同,table寬度根據內容而定——即table具備「包裹性

舉個例子:

圖片描述

上圖中,第一個div默認是block,寬度撐滿整個頁面。第二個div設置了display:table,寬度根據內容而定。這就是「包裹性」。而提到「包裹性」,又不得不讓我想到float和absolute。具體怎樣這裏沒法細說,後面的文章會詳細講到,有興趣的能夠先查着。

各位思考一下,大家作的項目中,哪些地方想要這種「包裹性」,而不是寫死寬度或者用js計算寬度?若是想不到,我給你們截個圖提醒一下。以下圖:

圖片描述

5.display:table-cell

圖片描述

上面的截圖中,咱們看到了眼花繚亂的好多display,並且都是和table相關的。從字面意思上咱們能看出,這是瀏覽器爲了渲染一個完整的表格,而須要的許多顯示方式(PS:看似一個簡單的表格,渲染規則就這麼多,這就提醒咱們思考問題的嚴謹性和邏輯性)。

這裏的大部分都是咱們一直都不會用到的,用不到的瞭解便可,不必深究。可是這個table-cell咱們卻能用獲得,並且是用它來幹一件很重要的事情——多列布局

多列布局在css中有多重要就不用我說了吧,傳統模式下你們都使用float來解決這一問題,可是float寫出來的東西代碼複雜,寬度調整不靈活,瀏覽器兼容性有問題。因此纔有了新方案——table-cell,注意,IE六、7不行!

簡單舉個例子:

圖片描述

記得我剛學html時候,不會用div + css作多列布局,我就用table作多列布局。而今,你能夠用table-cell,像用table同樣作多列布局,作出來的效果和table作出來的效果是如出一轍的。

6.body樣式

body { margin: 8px; line-height: 1.12 }

在body中,定義了兩個樣式,如上圖。

第一,在默認狀況下,頁面中的文字不會直接頂到瀏覽器的邊框,這就是由於默認樣式爲body設置了margin的緣故。這裏須要注意個問題,不一樣瀏覽器爲body設置的margin值可能不同,所以你們都知道在css中用 *{margin:0} 來解決這一兼容性問題。

以前已經提到過,選擇器的級別要低於body標籤選擇器,所以當兩者來源相同(例如,都來自內部樣式)時,是不會起做用的,即便它是「後加載」的。而{margin:0}依然有效的緣由是瀏覽器默認樣式的優先級低於外聯、內部樣式。例如:

圖片描述

第二,瀏覽器默認樣式還爲body設置了line-height,line-height這個值1.12是對英文比較友好,中文狀態下就顯得有點擁擠。Line-height是具備繼承性的,在body中設置了,body下面全部的文字都會繼承生效。

另外注意,這裏的line-height: 1.12是一個相對值,便是文字高度的1.12倍。看到這裏,咱們在寫line-height的時候,也必定要注意使用相對值,不要使用絕對值。以下:

圖片描述

上圖是編寫line-height的三種形式,你們以爲哪一種形式最好?區別是什麼?

狀況1:永遠按照文字的1.4倍計算,無論文字的高度如何,可適應任何變化;
狀況2:永遠按照1.4em計算,隨着em的值改變,無論文字高度如何(此時文字高度可能已經經過絕對的px值改變了大小,而不是隨em改變的);
狀況3:就是25px,絕對的。

相信看到這裏你們會發現,經過一個line-height咱們能窺探到的道道有不少。若是你們看懂了這三種狀況,從軟件設計和系統擴展的角度說,固然咱們都會選擇第一種。

7.em和px

你們在設置文字高度或者與文字有關的距離,如p的margin、line-height(上文剛講完,再也不贅述),會用em仍是用px?——反正我以前不熟悉css時候,都是用px。由於px是固定大小,一目瞭然。——固然,它也不利於擴展。

所以,咱們推薦你們用em。並且瀏覽器的默認樣式也建議咱們這樣書寫:

clipboard.png

如上圖,它設置了h1字體大小2em、縱向margin是0.67em,h2字體大小1.5em、縱向大小0.75em……p的縱向margin是1.12em,字體大小1em(上圖中沒有,但在整個文件中有)

em是什麼?——em是一個瀏覽器識別的長度單位,可是它不是絕對的、固定的,而是相對的,相對的計算必然會一個參考物,那麼這裏相對所指的是相對於父元素的font-size,所以,用em做爲長度單位,是實現彈性設計的關鍵。
你們都知道px是一個絕對的長度單位制,它永遠不會改變。瀏覽器默認狀況下令1em === 16px。如今你知道爲什麼p默認是16px了吧。並且你還知道了h1是p高度的兩倍,h2是p高度的1.5倍……(你知道的愈來愈多了。。。)

固然,咱們能夠經過css修改1em的值。

圖片描述

因爲font-size和margin都是經過em來定義的,當em被修改時,只要字體大小修改,margin值也會跟着修改。這就是em好用之處,也是彈性設計的體現!

從如今開始,與字體大小有關的css,所有都用em!

8.粗體和斜體

圖片描述

上圖中,標註了在整個html中,哪些元素設置了粗體/斜體。重點仍是一個思惟轉換的問題:h1不是天生的粗體,而是設置了font-weight:bolder的樣式而已……

這裏須要提一句題外話:< b >和< strong >有啥區別?< i >和< em >有啥區別?
< b >是W3C預設的加粗式樣,若是不想寫font-weight:bold;實現單純的加粗效果,用< b >是個不錯的選擇,但若是想作語義上的強調< strong >更合適。推薦使用語義化的標籤。

9.inline-block

圖片描述

我相信最初學習使用inline-block的朋友都有一個困惑:inline-block究竟是個啥?這時候若是你很是勤奮好學的話,你就去網上查資料,而後作各類實驗。——精神可嘉,行爲不可取。

學習仍是有捷徑的。看看瀏覽器默認樣式告訴你的捷徑:button、input就是inline-block!這樣以點播你就會一會兒明白,最起碼能給你一個很好的形象的概念。看看button和input的表現,你就知道inline-block是什麼樣子了:

能在父容器里居中、能設置高度寬度和margin、不會像table或div那樣佔一整行……——這就是inline-block——記得這是瀏覽器默認樣式告訴你的。

原文地址:http://www.cnblogs.com/wangfu...

相關文章
相關標籤/搜索