国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理)

這篇具有很好參考價(jià)值的文章主要介紹了前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一.瀏覽器渲染原理

二.渲染時(shí)間點(diǎn)

三.渲染流水線

1.解析html(Parse HTML)

1.1解析成DOM樹(document object model)

1.2解析成CSSOM樹(css?object model)

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

3.布局(Layout)

4.分層(Layer)

5. 繪制(Paint)

6.分塊(Tiling)

7. 光柵化(Raster)

8. 畫(Draw)

四.附加面試題

1.什么是 reflow?

2.什么是 repaint?

3.為什么 transform 的效率高?


一.瀏覽器渲染原理

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

瀏覽器是如何渲染頁(yè)面的?

當(dāng)瀏覽器的網(wǎng)絡(luò)線程收到 HTML 文檔后,會(huì)產(chǎn)生一個(gè)渲染任務(wù),并將其傳遞給渲染主線程的消息隊(duì)列。

在事件循環(huán)機(jī)制的作用下,渲染主線程取出消息隊(duì)列中的渲染任務(wù),開啟渲染流程。

整個(gè)渲染流程分為多個(gè)階段,分別是: HTML 解析、樣式計(jì)算、布局、分層、繪制、分塊、光柵化、畫

每個(gè)階段都有明確的輸入輸出,上一個(gè)階段的輸出會(huì)成為下一個(gè)階段的輸入。

這樣,整個(gè)渲染流程就形成了一套組織嚴(yán)密的生產(chǎn)流水線。

二.渲染時(shí)間點(diǎn)

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

當(dāng)瀏覽器的網(wǎng)絡(luò)線程接收到HTML文檔后,會(huì)產(chǎn)生一個(gè)渲染任務(wù),并將其傳遞給消息隊(duì)列,在事件循環(huán)機(jī)制的作用下,渲染主線程(render thread)取出消息隊(duì)列中的渲染任務(wù),開啟渲染

三.渲染流水線

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

1.解析html(Parse HTML)

首先將html和css分別解析成DOM樹和CSSOM樹

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

1.1解析成DOM樹(document object model)

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

為什么要先解析成樹狀結(jié)構(gòu)內(nèi),因?yàn)镠TML文檔是很多雜亂的字符,為了更清楚它們之間的邏輯,更好地進(jìn)行后續(xù)的渲染步驟,瀏覽器先選擇將它們解析成更加清晰的邏輯結(jié)構(gòu)

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

1.2解析成CSSOM樹(css?object model)

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

解析過(guò)程中遇到 CSS 解析 CSS,遇到 JS 執(zhí)行 JS。為了提高解析效率,瀏覽器在開始解析前,會(huì)啟動(dòng)一個(gè)預(yù)解析的線程,率先下載 HTML 中的外部 CSS 文件和 外部的 JS 文件。

如果主線程解析到`link`位置,此時(shí)外部的 CSS 文件還沒(méi)有下載解析好,主線程不會(huì)等待,繼續(xù)解析后續(xù)的 HTML。這是因?yàn)橄螺d和解析 CSS 的工作是在預(yù)解析線程中進(jìn)行的。這就是 CSS 不會(huì)阻塞 HTML 解析的根本原因。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

如果主線程解析到`script`位置,會(huì)停止解析 HTML,轉(zhuǎn)而等待 JS 文件下載好,并將全局代碼解析執(zhí)行完成后,才能繼續(xù)解析 HTML。這是因?yàn)?JS 代碼的執(zhí)行過(guò)程可能會(huì)修改當(dāng)前的 DOM 樹,所以 DOM 樹的生成必須暫停。這就是 JS 會(huì)阻塞 HTML 解析的根本原因。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

第一步完成后,會(huì)得到 DOM 樹和 CSSOM 樹,瀏覽器的默認(rèn)樣式、內(nèi)部樣式、外部樣式、行內(nèi)樣式均會(huì)包含在 CSSOM 樹中。

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

主線程會(huì)遍歷得到的 DOM 樹,依次為樹中的每個(gè)節(jié)點(diǎn)計(jì)算出它最終的樣式,稱之為 Computed Style。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

在這一過(guò)程中,很多預(yù)設(shè)值會(huì)變成絕對(duì)值,比如`red`會(huì)變成`rgb(255,0,0)`;相對(duì)單位會(huì)變成絕對(duì)單位,比如`em`會(huì)變成`px`

這一步完成后,會(huì)得到一棵帶有樣式的 DOM 樹。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

3.布局(Layout)

接下來(lái)是布局,布局完成后會(huì)得到布局樹。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

布局階段會(huì)依次遍歷 DOM 樹的每一個(gè)節(jié)點(diǎn),計(jì)算每個(gè)節(jié)點(diǎn)的幾何信息。例如節(jié)點(diǎn)的寬高、相對(duì)包含塊的位置。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

大部分時(shí)候,DOM 樹和布局樹并非一一對(duì)應(yīng)。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

比如`display:none`的節(jié)點(diǎn)沒(méi)有幾何信息,因此不會(huì)生成到布局樹;又比如使用了偽元素選擇器,雖然 DOM 樹中不存在這些偽元素節(jié)點(diǎn),但它們擁有幾何信息,所以會(huì)生成到布局樹中。還有匿名行盒、匿名塊盒等等都會(huì)導(dǎo)致 DOM 樹和布局樹無(wú)法一一對(duì)應(yīng)。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

4.分層(Layer)

下一步是分層

主線程會(huì)使用一套復(fù)雜的策略對(duì)整個(gè)布局樹中進(jìn)行分層。

分層的好處在于,將來(lái)某一個(gè)層改變后,僅會(huì)對(duì)該層進(jìn)行后續(xù)處理,從而提升效率。

滾動(dòng)條、堆疊上下文、transform、opacity 等樣式都會(huì)或多或少的影響分層結(jié)果,也可以通過(guò)`will-change`屬性更大程度的影響分層結(jié)果。
前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

5. 繪制(Paint)

再下一步是繪制

主線程會(huì)為每個(gè)層單獨(dú)產(chǎn)生繪制指令集,用于描述這一層的內(nèi)容該如何畫出來(lái)。
前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

渲染主線程的工作到這里就結(jié)束了,剩下的工作交給其他線程來(lái)完成

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

6.分塊(Tiling)

完成繪制后,主線程將每個(gè)圖層的繪制信息提交給合成線程,剩余工作將由合成線程完成。

合成線程首先對(duì)每個(gè)圖層進(jìn)行分塊,將其劃分為更多的小區(qū)域。

它會(huì)從線程池中拿取多個(gè)線程來(lái)完成分塊工作。
前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

這是csdn網(wǎng)頁(yè)的分塊圖

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

分塊工程是交給多個(gè)線程同時(shí)進(jìn)行的

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

7. 光柵化(Raster)

分塊完成后,進(jìn)入光柵化階段。

優(yōu)先處理靠近視口的塊

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

合成線程會(huì)將塊信息交給 GPU 進(jìn)程,以極高的速度完成光柵化。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

GPU 進(jìn)程會(huì)開啟多個(gè)線程來(lái)完成光柵化,并且優(yōu)先處理靠近視口區(qū)域的塊。

光柵化的結(jié)果,就是一塊一塊的位圖

8. 畫(Draw)

最后一個(gè)階段就是畫了

合成線程拿到每個(gè)層、每個(gè)塊的位圖后,生成一個(gè)個(gè)「指引(quad)」信息。

指引會(huì)標(biāo)識(shí)出每個(gè)位圖應(yīng)該畫到屏幕的哪個(gè)位置,以及會(huì)考慮到旋轉(zhuǎn)、縮放等變形。

變形發(fā)生在合成線程,與渲染主線程無(wú)關(guān),這就是`transform`效率高的本質(zhì)原因。

合成線程會(huì)把 quad 提交給 GPU 進(jìn)程,由 GPU 進(jìn)程產(chǎn)生系統(tǒng)調(diào)用,提交給 GPU 硬件,完成最終的屏幕成像。

前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理),前端秘法,前端,javascript

四.附加面試題

1.什么是 reflow?

reflow 的本質(zhì)就是重新計(jì)算 layout 樹。

當(dāng)進(jìn)行了會(huì)影響布局樹的操作后,需要重新計(jì)算布局樹,會(huì)引發(fā) layout。

為了避免連續(xù)的多次操作導(dǎo)致布局樹反復(fù)計(jì)算,瀏覽器會(huì)合并這些操作,當(dāng) JS 代碼全部完成后再進(jìn)行統(tǒng)一計(jì)算。所以,改動(dòng)屬性造成的 reflow 是異步完成的。

也同樣因?yàn)槿绱?,?dāng) JS 獲取布局屬性時(shí),就可能造成無(wú)法獲取到最新的布局信息。

瀏覽器在反復(fù)權(quán)衡下,最終決定獲取屬性立即 reflow。

2.什么是 repaint?

repaint 的本質(zhì)就是重新根據(jù)分層信息計(jì)算了繪制指令。

當(dāng)改動(dòng)了可見樣式后,就需要重新計(jì)算,會(huì)引發(fā) repaint。

由于元素的布局信息也屬于可見樣式,所以 reflow 一定會(huì)引起 repaint。

3.為什么 transform 的效率高?

因?yàn)?transform 既不會(huì)影響布局也不會(huì)影響繪制指令,它影響的只是渲染流程的最后一個(gè)「draw」階段

由于 draw 階段在合成線程中,所以 transform 的變化幾乎不會(huì)影響渲染主線程。反之,渲染主線程無(wú)論如何忙碌,也不會(huì)影響 transform 的變化。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-831720.html

到了這里,關(guān)于前端秘法進(jìn)階篇----這還是我們熟悉的瀏覽器嗎?(瀏覽器的渲染原理)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Google play開發(fā)者賬號(hào)隔離用指紋瀏覽器還是vps?哪個(gè)防關(guān)聯(lián)效果更佳?

    Google play開發(fā)者賬號(hào)隔離用指紋瀏覽器還是vps?哪個(gè)防關(guān)聯(lián)效果更佳?

    很多谷歌安卓開發(fā)者會(huì)通過(guò)矩陣、馬甲包的方式,在Google play應(yīng)用商店上獲得更多的流量和收益,這需要多個(gè)開發(fā)者賬號(hào),因此開發(fā)者賬號(hào)隔離問(wèn)題的重要性不言而喻。 在Google play開發(fā)者賬號(hào)的隔離防關(guān)聯(lián)問(wèn)題上,使用vps和指紋瀏覽器是開發(fā)者們常用的兩種方式。這兩種方式

    2024年02月06日
    瀏覽(29)
  • 前端---需要了解瀏覽器相關(guān)知識(shí)--瀏覽器請(qǐng)求服務(wù)器資源---緩存

    前端---需要了解瀏覽器相關(guān)知識(shí)--瀏覽器請(qǐng)求服務(wù)器資源---緩存

    掘金1:瀏覽器緩存 掘金2 :瀏覽器緩存 跟別人怎么講,從大的說(shuō):緩存的原理是什么? 再說(shuō)什么是瀏覽器緩存? 瀏覽器緩存 請(qǐng)求(靜態(tài)資源 | 動(dòng)態(tài)資源) 一、緩存是什么? 二、為什么? 瀏覽器是如何判斷是否使用緩存的??第一次請(qǐng)求網(wǎng)頁(yè) 第二次請(qǐng)求相同網(wǎng)頁(yè): 三、怎

    2024年02月12日
    瀏覽(29)
  • 【小白慎入】還在手動(dòng)擼瀏覽器?教你一招分分鐘自動(dòng)化操作瀏覽器(Python進(jìn)階)

    【小白慎入】還在手動(dòng)擼瀏覽器?教你一招分分鐘自動(dòng)化操作瀏覽器(Python進(jìn)階)

    大家好啊,辣條哥又來(lái)猛貨了! 小白慎入! Puppeteer 是 Google 基于 Node.js 開發(fā)的一個(gè)工具,而 Pyppeteer 又是什么呢?它實(shí)際上是Puppeteer 的 Python 版本的實(shí)現(xiàn),但它不是Google 開發(fā)的,是一位來(lái)自于日本的工程師依據(jù)Puppeteer 的一些功能開發(fā)出來(lái)的非官方版本。 在 Pyppetter 中,實(shí)際

    2024年02月16日
    瀏覽(19)
  • 前端高級(jí)面試題-瀏覽器

    1 事件機(jī)制 事件觸發(fā)三階段 document 往事件觸發(fā)處傳播,遇到注冊(cè)的捕獲事件會(huì)觸發(fā) 傳播到事件觸發(fā)處時(shí)觸發(fā)注冊(cè)的事件 從事件觸發(fā)處往 document 傳播,遇到注冊(cè)的冒泡事件會(huì)觸發(fā) 注冊(cè)事件 通常我們使? addEventListener 注冊(cè)事件,該函數(shù)的第三個(gè)參數(shù)可以是布爾值,也可以是對(duì)

    2024年02月15日
    瀏覽(26)
  • 【前端】瀏覽器的渲染流程(完整)

    【前端】瀏覽器的渲染流程(完整)

    本文主要包含以下內(nèi)容: 瀏覽器渲染整體流程 解析 HTML 樣式計(jì)算 布局 分層 生成繪制指令 分塊 光柵化 繪制 常見面試題 瀏覽器,作為用戶瀏覽網(wǎng)頁(yè)最基本的一個(gè)入口,我們似乎認(rèn)為在地址欄輸入 URL 后網(wǎng)頁(yè)自動(dòng)就出來(lái)了。殊不知在用戶輸入網(wǎng)頁(yè)地址,敲下回車的那一刻,瀏

    2024年02月04日
    瀏覽(31)
  • 解決前端瀏覽器兼容性問(wèn)題

    解決前端瀏覽器兼容性問(wèn)題時(shí)前端開發(fā)中的一項(xiàng)重要任務(wù)。以下是一些常用的方法來(lái)解決這類問(wèn)題: 1、使用css前綴: 不同瀏覽器可能對(duì)某些CSS屬性有不同的前綴要求??梢允褂肅SS前綴來(lái)覆蓋不同瀏覽器的樣式需求。例如,使用 -webkit 前綴來(lái)適配WebKit(Chrome、Safari)瀏覽器

    2024年02月09日
    瀏覽(19)
  • 前端實(shí)現(xiàn)瀏覽器自定義滾動(dòng)條

    前端實(shí)現(xiàn)瀏覽器自定義滾動(dòng)條

    最近有個(gè)項(xiàng)目,產(chǎn)品覺得瀏覽器默認(rèn)滾動(dòng)條太丑了。想美化一下,比如自定義顏色,加上圓角,寬高都要更改一下。我查了資料和文檔總結(jié)了一下 寫法,特此記錄以便之后使用。 scrollbar-width scrollbar-width 屬性允許開發(fā)者在元素顯示滾動(dòng)條時(shí)設(shè)置滾動(dòng)條的最大寬度。 語(yǔ)法: 取值

    2024年04月10日
    瀏覽(20)
  • 前端性能優(yōu)化之瀏覽器渲染優(yōu)化

    在當(dāng)今互聯(lián)網(wǎng)高速發(fā)展的時(shí)代,用戶對(duì)于網(wǎng)頁(yè)加載速度和性能的要求越來(lái)越高。作為前端開發(fā)者,我們需要關(guān)注并致力于提升網(wǎng)頁(yè)的加載和渲染性能,以提供更好的用戶體驗(yàn)。而瀏覽器渲染優(yōu)化正是我們實(shí)現(xiàn)這個(gè)目標(biāo)的關(guān)鍵。在本文中,我們將探討一些關(guān)于瀏覽器渲染優(yōu)化的

    2024年02月11日
    瀏覽(24)
  • 前端瀏覽器滾動(dòng)條炫酷美化

    前端瀏覽器滾動(dòng)條炫酷美化

    ?? 博客首頁(yè): 春波petal ?? 文章摘要: 前端 ? 瀏覽器滾動(dòng)條美化 ?? 春波寄語(yǔ): 故木秀于林,風(fēng)必摧之;堆出于岸,流必湍之;行高于人,眾必非之。 廢話不多說(shuō),直接copy代碼使用 本篇博客文章模板唯一版權(quán)歸屬 ?春波petal

    2024年02月02日
    瀏覽(19)
  • AI 插件:未來(lái)的瀏覽器、前端與交互

    想象一下,你在瀏覽器中粘貼一個(gè) URL,這個(gè) URL 不僅僅是一個(gè)網(wǎng)址,而是一個(gè)功能強(qiáng)大、能執(zhí)行多種任務(wù)的 AI 插件。這聽起來(lái)像是未來(lái)的事情,但實(shí)際上,這種變革已經(jīng)悄悄進(jìn)行中。 1. 插件的魅力與局限性 當(dāng)我第一次接觸到 ChatGPT 插件時(shí),我被其簡(jiǎn)潔高效的設(shè)計(jì)所吸引。在

    2024年02月11日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包