上一節《css知多少(3)——樣式來源與層疊規則》介紹了樣式的五種來源,我們再經過一張圖回顧一下。css
對於上面的三層,我們大概都比較熟悉了。下面的兩層中,用戶自定義樣式通常也就是改一改字號大小和字體樣式,也沒甚好說的。而最有的說的就是瀏覽器的默認樣式。html
不一樣瀏覽器的默認樣式多少有些區別,特別是老版本的瀏覽器之間,如今高級瀏覽器愈來愈向統一的標準靠攏,對前端程序猿來講是一件好事情。雖然有些許差別,可是絕大部分仍是相同的,我先把代碼粘貼出來 ,具體的解讀我們慢慢道來(只說重點,比較容易的或者不經常使用的就不說了)。前端
1 html, address, 2 blockquote, 3 body, dd, div, 4 dl, dt, fieldset, form, 5 frame, frameset, 6 h1, h2, h3, h4, 7 h5, h6, noframes, 8 ol, p, ul,center, 9 dir, hr, menu, pre{ display: block} 10 /* 以上按照block顯示,沒有規定的則按照默認的inline顯示 */ 11 12 li { display: list-item} 13 /* 程序猿經常使用的display值是:inline/block/inline-block,不多用到 list-item 14 list-item究竟是什麼樣的顯示效果,能夠經過例子驗證。。。。 15 第一,你能夠不用ul-li,而用其餘標籤實現list-item的效果 16 第二,要意識到,瀏覽器對待html只是把它看成一個dom樹,至於顯示成什麼效果,是經過瀏覽器默認的css實現的,即樣式所有經過css設計,和html無關 */ 17 18 head { display: none} 19 table { display: table } 20 /* display:table 和 block 最大的區別在於:包裹性。 提到包裹性,就不得不提一下float和absolute*/ 21 22 tr { display: table-row} 23 thead { display: table-header-group} 24 tbody { display: table-row-group} 25 tfoot { display: table-footer-group} 26 col { display: table-column} 27 colgroup { display: table-column-group} 28 td, th { display: table-cell; } 29 /* 與table相關的其餘display值,研究的意義不大,可是table-cell值得一說。 30 table-cell是多列布局的最新解決方案,比使用float更加有效(不兼容IE六、7) 31 實際上table-cell是要依賴其餘table相關的display,可是瀏覽器會爲咱們作這些工做,沒必要手動填寫 */ 32 33 caption{ display: table-caption} 34 th { font-weight: bolder; text-align: center} 35 /* 標題默認設置了粗體和文字居中 */ 36 37 caption{ text-align: center} 38 body { margin: 8px; line-height: 1.12} 39 /* 不一樣瀏覽器的margin不同,因此要設置【 *{margin:0} 】 40 line-height:1.12 針對英文沒問題,可是中文看起來很彆扭 41 另外,1.12是一個相對值(即1.12em),與文字有關的距離設置最好用相對值*/ 42 43 h1{ font-size: 2em; margin: .67em 0} 44 h2{ font-size:1.5em; margin: .75em 0} 45 h3{ font-size: 1.17em; margin: .83em 0} 46 h4, p, 47 blockquote, ul, 48 fieldset, form, 49 ol, dl, dir, 50 menu { margin:1.12em 0} 51 /* em是相對單位,1em就是一單位,瀏覽器默認的一單位是16px, 52 能夠經過 body{font-size:20px} 來修改一單位的值 53 p的字體大小是1em,h1是2em,h2是1.5em,等等 54 另外,與文字相關的距離值,最好用相對單位,例如 line-height:1.4; margin:.5em等等,這樣作的好處就是當自定義了1em的絕對px時,line-height也會跟着變 */ 55 56 /* 注意,若是咱們本身寫css【 * {margin:0} 】,能夠把p、h一、h2等標籤的margin覆蓋掉 57 咱們都知道,*選擇器的權重是最低的,可是它卻能覆蓋掉標籤選擇器,說明瀏覽器已經在這裏面作了手腳 58 瀏覽器沒有讓默認樣式和用戶自定義樣式「公平競爭」,而是優先用戶自定義樣式 */ 59 60 h5{ font-size: .83em; margin: 1.5em 0} 61 h6{ font-size: .75em; margin: 1.67em 0} 62 h1, h2, h3, h4, 63 h5, h6, b, 64 strong { font-weight: bolder} 65 /* 這裏能夠看到哪些標籤文字是加粗的 */ 66 67 blockquote { margin-left: 40px; margin-right: 40px} 68 i, cite, em, 69 var, address { font-style: italic} 70 /* 這裏能夠看到哪些標籤是斜體 */ 71 72 pre, tt, code, 73 kbd, samp { font-family: monospace} 74 pre{ white-space: pre} 75 button, textarea, 76 input, object, 77 select { display:inline-block; } 78 /* 不知道inline-block是什麼樣子的?或者不知道inline-block有什麼特性? 79 在這裏看看哪些標籤是inline-block,就知道inline-block的用處了 80 具體inline-block的用途,咱們會在後面詳細介紹,此處只是點出來 */ 81 82 big { font-size: 1.17em} 83 small, sub, sup { font-size: .83em} 84 sub{ vertical-align:sub} 85 sup { vertical-align: super} 86 table { border-spacing: 2px; } 87 thead, tbody, 88 tfoot { vertical-align: middle} 89 td, th { vertical-align: inherit } 90 s, strike, del { text-decoration: line-through} 91 hr {border: 1px inset} 92 /* 爲何<hr/>默認是那麼個難看的樣子,特別是IE下,這就是罪魁禍首 */ 93 94 ol, ul, dir, 95 menu, dd { margin-left: 40px} 96 ol {list-style-type: decimal} 97 /* ul 和 ol 在默認狀況下都會有一篇左邊的間距,在這裏能夠看到爲什麼會有間距,以及間距的具體大小是多少。 98 */ 99 100 ol ul, ul ol, 101 ul ul, ol ol { margin-top: 0;margin-bottom: 0} 102 u, ins { text-decoration: underline} 103 br:before {content: "A"} 104 /* ????????????? */ 105 :before, :after { white-space: pre-line } 106 /* <br/>爲什麼能實現換行?瀏覽器獲得html的br標籤,只會解析成一個dom節點而已, 107 而「換行」這一功能是經過這裏實現的????? */ 108 109 center{text-align: center} 110 abbr, acronym { font-variant: small-caps; letter-spacing: 0.1em} 111 :link, :visited { text-decoration: underline} 112 :focus {outline: thindottedinvert} 113 114 /* Begin bidirectionality settings (do not change) */ 115 BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override} 116 BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override} 117 118 *[DIR="ltr"] { direction: ltr; unicode-bidi: embed} 119 *[DIR="rtl"] { direction:rtl; unicode-bidi: embed} 120 /* 這些標籤或屬性都不經常使用 */ 121 122 @media print{ 123 h1{ page-break-before:always} 124 h1, h2, h3, 125 h4, h5, h6{ page-break-after: avoid} 126 ul, ol, dl { page-break-before: avoid} 127 /* 對於打印頁面時的設置,不經常使用 */ 128 129 /* 如下都是按照標籤選擇器來的,標籤選擇器比類、id選擇器的權重都低。 130 因此,用戶自定義的樣式,不管是用標籤、類仍是id,都能覆蓋默認的標籤選擇器 */
在解讀代碼以前,我先把我看瀏覽器默認樣式最大的體會給你們說一下,這個是很是重要的。就是要先從理念上從新認識html和css。git
之前我都是認爲瀏覽器自身原本就認識各類html標籤,而且會根據規則設置標籤的樣子,例如p是block顯示,ul有margin-left,h1粗體顯示……之前覺得這些標籤默認的顯示方式和css無關,是瀏覽器本身乾的,css設置網頁樣式是加載以後又渲染的。github
如今知道這種想法是錯誤的。其實瀏覽器加載了html以後只爲一件東西——dom樹,瀏覽器把html變爲dom樹結構,就完成了對html的結構化。至於後來對視圖的渲染,p是block、br換行,那是整合了css以後的事情。而瀏覽器整合css又是另外一個路線,和解析html是分開的。這裏的「css」就包含了瀏覽器默認樣式。web
能夠結合下圖理解(第二節的圖):面試
一句話,瀏覽器將載入的html變爲dom樹,可是此時沒有任何顯示樣式。因此顯示的樣式,都是css定義的,瀏覽器只會經過css來渲染視圖樣式。json
——多好的設計:指責單一,開放封閉!瀏覽器
爲什麼默認狀況下p、h一、ul、div都是block顯示,就是這裏定義的。因此,不要再說div天生就是block——這句話應該換成:瀏覽器默認樣式天生規定了div是block——因此才致使了div是block!是默認樣式規定的,不是瀏覽器的內核規定的。app
沒有設置block的元素,默認爲inline顯示。
咱們在使用display時,經常使用的值通常是:inline/block/inline-block,用不到list-item。那這裏的list-item到底有什麼做用?咱們不妨親自試一試:
看到沒有,出現了ul-li中的效果了吧,若是再加一個margin-left是否是就跟ul-li同樣了?
因此,ul-li爲何會默認顯示成那種樣子?——list-item纔是「罪魁禍首」。
先給出一個快速思考題:<table>和<div>在容器尺寸上最大區別是什麼(只是容器尺寸,不考慮內容區別)?請在兩秒鐘內說出答案。
答案是——div寬度和父容器相同,table寬度根據內容而定——即table具備「包裹性」。
舉一個例子:
上圖中,第一個div默認是block,寬度撐滿整個頁面。第二個div設置了display:table,寬度根據內容而定。這就是「包裹性」。而提到「包裹性」,又不得不讓我想到float和absolute。具體怎樣這裏沒法細說,後面的文章會詳細講到,有興趣的能夠先查着。
各位思考一下,大家作的項目中,哪些地方想要這種「包裹性」,而不是寫死寬度或者用js計算寬度?若是想不到,我給你們截個圖提醒一下。以下圖:
上面的截圖中,咱們看到了眼花繚亂的好多display,並且都是和table相關的。從字面意思上咱們能看出,這是瀏覽器爲了渲染一個完整的表格,而須要的許多顯示方式(PS:看似一個簡單的表格,渲染規則就這麼多,這就提醒咱們思考問題的嚴謹性和邏輯性)。
這裏的大部分都是咱們一直都不會用到的,用不到的瞭解便可,不必深究。可是這個table-cell咱們卻能用獲得,並且是用它來幹一件很重要的事情——多列布局。
多列布局在css中有多重要就不用我說了吧,傳統模式下你們都使用float來解決這一問題,可是float寫出來的東西代碼複雜,寬度調整不靈活,瀏覽器兼容性有問題。因此纔有了新方案——table-cell,注意,IE六、7不行!
簡單舉個例子:
記得我剛學html時候,不會用div + css作多列布局,我就用table作多列布局。而今,你能夠用table-cell,像用table同樣作多列布局,作出來的效果和table作出來的效果是如出一轍的。
在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的三種形式,你們以爲哪一種形式最好?區別是什麼?
相信看到這裏你們會發現,經過一個line-height我能能窺探到的道道有不少。若是你們看懂了這三種狀況,從軟件設計和系統擴展的角度說,固然咱們都會選擇第一種。
你們在設置文字高度或者與文字有關的距離,如p的margin、line-heigt(上文剛講完,再也不贅述),會用em仍是用px?——反正我以前不熟悉css時候,都是用px。由於px是固定大小,一目瞭然。——固然,它也不利於擴展。
所以,咱們推薦你們用em。並且瀏覽器的默認樣式也建議咱們這樣書寫:
如上圖,它設置了h1字體大小2em、縱向margin是0.67em,h2字體大小1.5em、縱向大小0.75em……p的縱向margin是1.12em,字體大小1em(上圖中沒有,但在整個文件中有)
em是什麼?——em是一個瀏覽器識別的長度單位,可是它不是絕對的、固定的,而是相對的。你們都知道px是一個絕對的長度單位制,它永遠不會改變。瀏覽器默認狀況下令1em === 16px。如今你知道爲什麼p默認是16px了吧。並且你還知道了h1是p高度的兩倍,h2是p高度的1.5倍……(你知道的愈來愈多了。。。)
固然,咱們能夠經過css修改1em的值。
因爲font-size和margin都是經過em來定義的,當em被修改時,無論字體大小修改,margin值也會跟着修改。這就是em好用之處!
從如今開始,與字體大小有關的css,所有都用em!
上圖中,標註了在整個html中,哪些元素設置了粗體/斜體。重點仍是一個思惟轉換的問題:h1不是天生的粗體,而是設置了font-weight:bolder的樣式而已……
這裏須要提一句題外話:<b>和<strong>有啥區別?<i>和<em>有啥區別?——不知道的話本身去查查吧,看到許多面試題考這個。
我相信最初學習使用inline-block的朋友都有一個困惑:inline-block究竟是個啥?這時候若是你很是勤奮好學的話,你就去網上查資料,而後作各類實驗。——精神可嘉,行爲不可取。
學習仍是有捷徑的。看看瀏覽器默認樣式告訴你的捷徑:button、input就是inline-block!這樣以點播你就會一會兒明白,最起碼能給你一個很好的形象的概念。看看button和input的表現,你就知道inline-block是什麼樣子了:
能被父容器居中、能設置高度寬度和margin、不會像table或div那樣佔一正行……——這就是inline-block——記得這是瀏覽器默認樣式告訴你的。
這裏我提出本身的一個疑問。如上圖,瀏覽器默認樣式中,對br是這樣設置的。
但願知道答案的朋友,不吝賜教,給我和你們分享一下,謝謝了。
你們看着是否是很過癮?反正我寫着是挺過癮的,雖然打字、寫代碼、畫圖很累,不過頗有成就感——再有大家的鼓勵就更好啦!
首先,我以爲瀏覽器默認樣式很是重要,全部詳細解讀其中的重點,但願能給你們帶來一些啓發。沒有解讀到的就是一些比較容易理解的,或者不經常使用的(例如打印的樣式設置),能夠直接去看看源碼。
其次,這裏面也包含了個人一個疑問,很慚愧沒有看明白。即使是一時半會兒解決不了,給別人分享一下,讓你知道了一個疑問,對你來講,應該也是一個收穫。
---------------------------------------------------------------
本系列的目錄頁面:http://www.cnblogs.com/wangfupeng1988/p/4325007.html
-------------------------------------------------------------------------------------------------------------
學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀》
也歡迎關注個人開源項目——wangEditor,簡潔易用的web富文本編輯器
-------------------------------------------------------------------------------------------------------------