css渲染原理

css渲染原理

  • 瀏覽器渲染原理
    • 瀏覽器接收到服務(wù)器返回的html頁面害驹。
    • 瀏覽器開始構(gòu)建DOM樹(DOM TREE),遇到css樣式會構(gòu)建CSS規(guī)則樹(css RULE TREE)。
    • 遇到j(luò)avascript會通過DOM API和CSSDOM API來操作DOM Tree和CSS Rule Tree。
    • 解析完成后,瀏覽器會通過DOM Tree和CSS Rule Tree來構(gòu)造Rendering Tree(渲染樹)萎胰。
    • 最后,渲染樹構(gòu)建完成后就是“布局”處理棚辽,也就是確定每個(gè)節(jié)點(diǎn)在屏幕上的確切顯示位置技竟。
    • 渲染之后,開始“繪制”屈藐,遍歷渲染樹榔组,并用UI后斷層,將每一個(gè)節(jié)點(diǎn)繪制出來联逻。
  • css渲染規(guī)則
    • css的渲染規(guī)則搓扯,是從上到下,從右到左渲染的包归。
.main h4 a {font-size: 14px}
  • 渲染過程是這樣的:首先先找到所有的a锨推,沿著a的父元素查找h4,然后再沿著h4公壤,查找.main换可。中途找到了符合匹配規(guī)則的節(jié)點(diǎn)就加入結(jié)果集。如果找到根元素的html都沒有匹配境钟,則這條路徑不再遍歷锦担。下一個(gè)a開始重復(fù)這個(gè)查找匹配俭识,直到?jīng)]有a繼續(xù)查找慨削。
    -瀏覽器的這種查找規(guī)則就是為了盡早過濾掉一些無關(guān)的樣式規(guī)則和元素。
  • 頁面渲染與執(zhí)行過程
    • 通過一個(gè)例子套媚,我們來詳細(xì)看看頁面渲染和執(zhí)行過程到底是怎么工作的:
<html>
  <body>
    <link href="example.css" rel="stylesheet">
    <div>Hi here</div>
    <script>
      document.write('<script src="other.js"><scr' + 'ipt>')
    </script>
    <div>Hi again</div>
    <script src="last.js"></script>
  </body>
</html>
  1. 解析器遇到了example.css缚态,并將它從網(wǎng)絡(luò)中下載下來。下載樣式表的過程是耗時(shí)的堤瘤,但是解析器并沒有被阻塞玫芦,繼續(xù)往下解析
  2. 解析器遇到<script>標(biāo)簽,但是由于樣式文件下載未完成本辐,阻塞了該腳本的執(zhí)行(上面已指出)桥帆。解析器(構(gòu)建DOM樹和 CSS規(guī)則樹)被阻塞住医增,不能繼續(xù)往下解析
  3. 因?yàn)殇秩緲涫荄OM樹 和 CSS規(guī)則樹 來構(gòu)造,所以此時(shí)老虫,渲染樹的構(gòu)建也被阻塞
  4. 渲染樹是繪制觸發(fā)條件之一叶骨,因此Hi there!也就 不能被繪制(painting->display)到頁面中。
  • 繪制的觸發(fā)條是: 渲染樹構(gòu)建完成祈匙,并遇到了阻塞
  1. 接下來忽刽,一旦example.css下載完成,內(nèi)聯(lián)的腳本執(zhí)行完了之后夺欲,解析器開始執(zhí)行遇到的<script>標(biāo)簽跪帝,并查到src屬性中的other.js文件,立即被阻塞些阅,開始下載other.js伞剑;
  2. 因?yàn)榻馕銎鞅蛔枞|發(fā)了繪制條件扑眉,瀏覽器就會收到繪制的請求纸泄,“Hi,here”就會顯示在頁面上
  3. other.js加載完成了之后腰素,解析器繼續(xù)向下解析聘裁,遇到 last.js 之后又被阻塞,
  4. 因?yàn)榻馕銎髟俅伪蛔枞В中纬闪?“繪制” 條件衡便,因此繪制DOM樹的內(nèi)容,即洋访,“Hi镣陕,again”就會顯示在頁面上。
  5. last.js加載完成姻政,并且被執(zhí)行呆抑。
  • css優(yōu)化
    • 把 Stylesheets 放在 HTML 頁面頭部

      • 瀏覽器在所有的 stylesheets 加載完成之后,才會開始渲染整個(gè)頁面汁展,在此之前鹊碍,瀏覽器不會渲染頁面里的任何內(nèi)容,頁面會一直呈現(xiàn)空白食绿。這也是為什么要把 stylesheet 放在頭部的原因侈咕。如果放在 HTML 頁面底部,頁面渲染就不僅僅是在等待 stylesheet 的加載器紧,還要等待 html 內(nèi)容加載完成耀销,這樣一來,用戶看到頁面的時(shí)間會更晚铲汪。
      • 對于 @import 和 <link> 兩種加載外部 CSS 文件的方式:@import 就相當(dāng)于是把 <link> 標(biāo)簽放在頁面的底部熊尉,所以從優(yōu)化性能的角度看罐柳,應(yīng)該盡量避免使用 @import 命令
    • 嵌套層級不要超過三級

      • 一般情況下,嵌套層級不要超過三級狰住,過渡的嵌套會導(dǎo)致代碼變得臃腫硝清,導(dǎo)致css文件體積變大,造成性能上的浪費(fèi)转晰,影響渲染的速度芦拿;css層級太多,也過于依賴html DOM結(jié)構(gòu)查邢,不易于維護(hù)蔗崎。如果層級比較深,就直接定義一個(gè)class代替多余的層級扰藕。
    • css 命名規(guī)范缓苛,書寫規(guī)范。

    • 多用繼承屬性

      • 盡量的繼承父類樣式 邓深,重復(fù)的定義會造成很多不必要的性能浪費(fèi)未桥。
    • 少用濾鏡,好用hack芥备,少用position: absolute;

    • 使用簡寫樣式冬耿。見下例

        .mg {
          margin-top: 20px;
          margin-right: 0px;
          margin-bottom: 20px;
          margin-left: 100px;
        }
    

可以簡寫為

    .mg {
      margin: 20px 0px 20px 100px;
    }
    7. 不要再id選擇器和class選擇器前使用標(biāo)簽名 例如:
    div #box {
      color: white;
    }
    • id選擇器本身就能唯一確定一個(gè)元素,沒必要再在前面加上標(biāo)簽名萌壳。同樣亦镶,類選擇器也是,如果需要給某個(gè)標(biāo)簽的類增添額外的樣式袱瓮,建議使用另一個(gè)類名缤骨。這種情況下,也可以使用 div .box{} 形式尺借,差別不大绊起。

    • 平鋪的背景圖片不要過小,1px的圖片平鋪長寬25px的區(qū)域塊燎斩,需要2500次虱歪,太影響渲染速度。

    • 謹(jǐn)慎使用float瘫里,具體細(xì)節(jié)請參考我的另一片文章 《深入理解f浮動與清除浮動》

    • 合理化布局(模塊化布局)

      • 可以把樣式劃分為”基類“ 和 “擴(kuò)展類”实蔽; 把模塊基本相同的樣式寫在基類里荡碾,不同的再重新用class定義谨读,寫在擴(kuò)展類中。
    • 盡量少用通配符坛吁,只用通配符設(shè)定一切基礎(chǔ)的樣式劳殖,如:

    * {margin:0; padding:0;}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铐尚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哆姻,更是在濱河造成了極大的恐慌宣增,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矛缨,死亡現(xiàn)場離奇詭異爹脾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)箕昭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門灵妨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人落竹,你說我怎么就攤上這事泌霍。” “怎么了述召?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵朱转,是天一觀的道長。 經(jīng)常有香客問我积暖,道長兼呵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任乖篷,我火速辦了婚禮该贾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘性誉。我一直安慰自己窿吩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布错览。 她就那樣靜靜地躺著纫雁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倾哺。 梳的紋絲不亂的頭發(fā)上轧邪,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音羞海,去河邊找鬼忌愚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛却邓,可吹牛的內(nèi)容都是我干的硕糊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼简十!你這毒婦竟也來了檬某?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤螟蝙,失蹤者是張志新(化名)和其女友劉穎恢恼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰默,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡场斑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牵署。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和簸。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碟刺,靈堂內(nèi)的尸體忽然破棺而出锁保,到底是詐尸還是另有隱情,我是刑警寧澤半沽,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布爽柒,位于F島的核電站,受9級特大地震影響者填,放射性物質(zhì)發(fā)生泄漏浩村。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一占哟、第九天 我趴在偏房一處隱蔽的房頂上張望心墅。 院中可真熱鬧,春花似錦榨乎、人聲如沸怎燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐姚。三九已至,卻和暖如春肛捍,著一層夾襖步出監(jiān)牢的瞬間隐绵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工拙毫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留依许,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓缀蹄,卻偏偏與公主長得像峭跳,于是被迫代替她去往敵國和親膘婶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容