渲染流程:HTML系奉、CSS和JavaScript檬贰,是如何變成頁面的?

構(gòu)建 DOM 樹

構(gòu)建 DOM 樹的輸入內(nèi)容是一個(gè)非常簡(jiǎn)單的 HTML 文件喜最,然后經(jīng)由HTML 解析器解析偎蘸,最終輸出樹狀結(jié)構(gòu)的 DOM。
DOM 和 HTML 內(nèi)容幾乎是一樣的瞬内,但是和 HTML 不同的是迷雪,DOM 是保存在內(nèi)存中樹狀結(jié)構(gòu),可以通過 JavaScript 來查詢或修改其內(nèi)容虫蝶。

樣式計(jì)算(Recalculate Style)

樣式計(jì)算的目的是為了計(jì)算出 DOM 節(jié)點(diǎn)中每個(gè)元素的具體樣式

  1. 把 CSS 轉(zhuǎn)換為瀏覽器能夠理解的結(jié)構(gòu)
    以當(dāng)渲染引擎接收到 CSS 文本時(shí)章咧,會(huì)執(zhí)行一個(gè)轉(zhuǎn)換操作,將 CSS 文本轉(zhuǎn)換為瀏覽器可以理解的結(jié)構(gòu)——styleSheets能真。
  2. 轉(zhuǎn)換樣式表中的屬性值赁严,使其標(biāo)準(zhǔn)化
    CSS 文本中有很多屬性值,如 2em粉铐、blue疼约、bold,這些類型數(shù)值不容易被渲染引擎理解蝙泼,所以需要將所有值轉(zhuǎn)換為渲染引擎容易理解的程剥、標(biāo)準(zhǔn)化的計(jì)算值,這個(gè)過程就是屬性值標(biāo)準(zhǔn)化汤踏。2em 被解析成了 32px织鲸,red 被解析成了 rgb(255,0,0),bold 被解析成了 700……
  3. 計(jì)算出 DOM 樹中每個(gè)節(jié)點(diǎn)的具體樣式
    樣式計(jì)算階段的目的是為了計(jì)算出 DOM 節(jié)點(diǎn)中每個(gè)元素的具體樣式溪胶,在計(jì)算過程中需要遵守 CSS 的繼承和層疊兩個(gè)規(guī)則搂擦。這個(gè)階段最終輸出的內(nèi)容是每個(gè) DOM 節(jié)點(diǎn)的樣式,并被保存在 ComputedStyle 的結(jié)構(gòu)內(nèi)哗脖。
    CSS 繼承就是每個(gè) DOM 節(jié)點(diǎn)都包含有父節(jié)點(diǎn)的樣式瀑踢。
    層疊是 CSS 的一個(gè)基本特征,它是一個(gè)定義了如何合并來自多個(gè)源的屬性值的算法懒熙。它在 CSS 處于核心地位丘损,CSS 的全稱“層疊樣式表”正是強(qiáng)調(diào)了這一點(diǎn)。

布局階段

  1. 創(chuàng)建布局樹
    遍歷 DOM 樹中的所有可見節(jié)點(diǎn)工扎,并把這些節(jié)點(diǎn)加到布局中;而不可見的節(jié)點(diǎn)會(huì)被布局樹忽略掉衔蹲,如 head 標(biāo)簽下面的全部內(nèi)容肢娘,屬性包含 dispaly:none的元素呈础。
  2. 布局計(jì)算
    計(jì)算布局樹節(jié)點(diǎn)的坐標(biāo)位置,在執(zhí)行布局操作的時(shí)候橱健,會(huì)把布局運(yùn)算的結(jié)果重新寫回布局樹中而钞,所以布局樹既是輸入內(nèi)容也是輸出內(nèi)容,這是布局階段一個(gè)不合理的地方拘荡,因?yàn)樵诓季蛛A段并沒有清晰地將輸入內(nèi)容和輸出內(nèi)容區(qū)分開來臼节。

分層

因?yàn)轫撁嬷杏泻芏鄰?fù)雜的效果,如一些復(fù)雜的 3D 變換珊皿、頁面滾動(dòng)网缝,或者使用 z-indexing做 z 軸排序等,為了更加方便地實(shí)現(xiàn)這些效果蟋定,渲染引擎還需要為特定的節(jié)點(diǎn)生成專用的圖層粉臊,并生成一棵對(duì)應(yīng)的圖層樹(LayerTree)。
瀏覽器的頁面實(shí)際上被分成了很多圖層驶兜,這些圖層疊加后合成了最終的頁面扼仲。
通常情況下,并不是布局樹的每個(gè)節(jié)點(diǎn)都包含一個(gè)圖層抄淑,如果一個(gè)節(jié)點(diǎn)沒有對(duì)應(yīng)的層屠凶,那么這個(gè)節(jié)點(diǎn)就從屬于父節(jié)點(diǎn)的圖層。

  1. 擁有層疊上下文屬性的元素會(huì)被提升為單獨(dú)的一層肆资。明確定位屬性的元素矗愧、定義透明屬性的元素、使用 CSS 濾鏡的元素等迅耘,都擁有層疊上下文屬性贱枣。
  2. 需要剪裁(clip)的地方也會(huì)被創(chuàng)建為圖層。內(nèi)容超過容器的尺寸時(shí)颤专,這時(shí)候就產(chǎn)生了剪裁纽哥,渲染引擎會(huì)把裁剪文字內(nèi)容的一部分用于顯示在 div 區(qū)域,出現(xiàn)這種裁剪情況的時(shí)候栖秕,渲染引擎會(huì)為文字部分單獨(dú)創(chuàng)建一個(gè)層春塌,如果出現(xiàn)滾動(dòng)條,滾動(dòng)條也會(huì)被提升為單獨(dú)的層簇捍。

圖層繪制

在完成圖層樹的構(gòu)建之后只壳,渲染引擎會(huì)對(duì)圖層樹中的每個(gè)圖層進(jìn)行繪制。渲染引擎會(huì)把一個(gè)圖層的繪制拆分成很多小的繪制指令暑塑,然后再把這些指令按照順序組成一個(gè)待繪制列表吼句。

柵格化(raster)操作

繪制列表只是用來記錄繪制順序和繪制指令的列表,而實(shí)際上繪制操作是由渲染引擎中的合成線程來完成的事格。當(dāng)圖層的繪制列表準(zhǔn)備好之后惕艳,主線程會(huì)把該繪制列表提交(commit)給合成線程搞隐。
合成線程會(huì)將圖層劃分為圖塊(tile),這些圖塊的大小通常是 256x256或者 512x512远搪。
然后合成線程會(huì)按照視口附近的圖塊來優(yōu)先生成位圖劣纲,實(shí)際生成位圖的操作是由柵格化來執(zhí)行的。所謂柵格化谁鳍,是指將圖塊轉(zhuǎn)換為位圖癞季。

合成和顯示

一旦所有圖塊都被光柵化,合成線程就會(huì)生成一個(gè)繪制圖塊的命令——“DrawQuad”倘潜,然后將該命令提交給瀏覽器進(jìn)程绷柒。
瀏覽器進(jìn)程里面有一個(gè)叫 viz 的組件,用來接收合成線程發(fā)過來的 DrawQuad 命令窍荧,然后根據(jù) DrawQuad 命令辉巡,將其頁面內(nèi)容繪制到內(nèi)存中,最后再將內(nèi)存顯示在屏幕上蕊退。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郊楣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓤荔,更是在濱河造成了極大的恐慌净蚤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输硝,死亡現(xiàn)場(chǎng)離奇詭異今瀑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)点把,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門橘荠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郎逃,你說我怎么就攤上這事哥童。” “怎么了褒翰?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵贮懈,是天一觀的道長。 經(jīng)常有香客問我优训,道長朵你,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任揣非,我火速辦了婚禮抡医,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘早敬。我一直安慰自己魂拦,他們只是感情好毛仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布搁嗓。 她就那樣靜靜地躺著芯勘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腺逛。 梳的紋絲不亂的頭發(fā)上荷愕,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音棍矛,去河邊找鬼安疗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛够委,可吹牛的內(nèi)容都是我干的荐类。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼茁帽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼玉罐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潘拨,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤吊输,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铁追,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體季蚂,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年琅束,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扭屁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涩禀,死狀恐怖料滥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埋泵,我是刑警寧澤幔欧,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站丽声,受9級(jí)特大地震影響礁蔗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雁社,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一浴井、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霉撵,春花似錦磺浙、人聲如沸洪囤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘤缩。三九已至,卻和暖如春伦泥,著一層夾襖步出監(jiān)牢的瞬間剥啤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工不脯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留府怯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓防楷,卻偏偏與公主長得像牺丙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子复局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345