[FE] Browser Render

閱讀時間約 11 分鐘
介紹 Box, Reflow, Render pipeline 等

Box Element

首先瀏覽器上每個元素都是 Box,而每個 Box 分成了 4 個部分,包含了:

  1. Content Box 內容的區域
  2. Padding Box 內部的 Spacing
  3. Border Box 內容和 Padding 間的區域
  4. Margin Box 外部的空間
raw-image

Box  有 2 種屬性 Size 以及 Generation,Size 可以分為:

  1. Intrinsic
  2. Extrinsic


當 Box Size 是 Intrinsic 時,Box 會使用內容當作該 Box 的空間,不考慮外部環境影響;當 Box Size 是 Extrinsic 時,Box 會透過 CSS 設定空間或是被父元素控制空間


Intrinsic Size 的範例:

如 <span>  就是一個很好的 Intrinsic Size 的元素,他是個 inline 的元素,所以設定寬高都不會影響到他,只會根據文字的長度決定寬,文字的 line-height 決定此元素的高。

<span>Hello</span>


如果要設定一個元素是最小的 Intrinsic Size,可以使用 width: min-content ,此時會盡可能地進行換行,最後的寬度會由最長的詞為寬度。

<div class="min-intrinsic-size">This is a long long long long sentence</div>

<style>
.min-intrinsic-size {
width: min-content;
}
</style>


另外像是圖片,如果有一張長寬爲 800x600 的圖片,在未進行設定的情況下,它就會以 800x600 的方式自然呈現。

<img src="photo800x600.jpg">

Extrinsic 的範例:

例如 CSS 使用了 aspect-ratio ,定義了寬高比,內容大小被父原素限定住了,就是 Extrinsic Size

.box {
width: 100%;
aspect-ratio: 16 / 9;
}


或是由父元素去設定寬高,決定內容的空間

<div class="box">
<p>Content Content Content</p>
</div>
<style>
width: 200px; height: 100px; overflow: auto;
</style>

Box  Generation 可以分為以下 3 種:

  1. Block
  2. Anonymous
  3. Inline


首先 Block 會 100% 的填滿父元素的寬,高是 Intrinsic 由內容決定高度,然後會由上至下進行 Render,並且會加入 BFC 排版,常見的元素有 div , p , address , articale 等。


Anonymous 則是未被元素包起來的內容例如:

<div>Hello</div>
Hello <--- anonymouse box

Anonymous 是由瀏覽器自動生成的,沒辦法透果 CSS 選擇器選到。


下一個是 Inline 它的渲染方式是像是字串,並且會加入 IFC 排版,它的特性是會不生效所設定的寬高和垂直的 margin (水平的仍然是生效的),它的高度會受到 line-height 所影響,但 padding 不會真的影響到它的高,常見的元素有 button , a , i , label  等。


Browser Formatting Context

Formatting Context 是一個區塊、範圍,當 Element 進入 Formatting Context,Element 就會依照它的規則進行呈現。


例如以 BFC(Block Formatting Context) 來說,在內的元素會填滿父元素,並由上到下進行排列。


IFC(Inline Formatting Context) 中的元素會依照由右至左進行排列,寬度則是 Intrinsic 的。


Formatting Context 有著:

  1. Isolation:外部和內部的規則不會互相進行影響
  2. Scalability:可以通過建立新的 Formatting Context 實現特定的佈局
  3. Predictability:擁有明確的規則,元素是可以被控制的


Browser Position

在預設的情況下,瀏覽器的定位會依照 Normal Flow 進行排列(RTL, LTR),在建立元素的時候預設是 static 此時是無法透過設定 leftrightbottomtop 去進行設定。


relative 元素仍然是在 Normal Flow 中,會建立新的 Stacking Content,可以相對於 Containing Block 去進行相對的定位(使用 leftright 等定位,預設是左上角)。


absolute 會完全脫離 Normal Flow 中,會建立新的 Stacking Content,其他的元素會忽略此元素進行排列,會依照 Containing Block 進行定位。


How the browser render the website

首先瀏覽器在渲染時,會透過 HTML 產生 DOM Tree,以及 Style 的 CSSOM(CSS Object Model),之後會將 2 者結合爲 Render Tree 。

Render Tree 會由 Root 開始進行渲染,遇到不顯示的會忽略 (display: none , meta , link ),之後會和 CSSOM 的規則應用在各 node 上。


其中當 DOM 改變(新增、移除、改變位置)發生時,會產生 Reflow :

raw-image

Reflow 的示意影片:


在 Style 以及 Layout 的部分會使用 CPU 去執行,會阻塞到 main thread,所以當執行過多次的 Reflow 就有可能造成畫面卡的現象。

例如:

@keyframes moving-down-slow {
from {
margin-top: 0;
}
to {
margin-top: 500px;
}
}
@keyframes moving-down-fast {
from {
transform: translateY(0px);
}
to {
transform: translateY(500px);
}
}


這 2 個 style 動畫所做的事是相同的,但在第一個使用了 margin 會導致 Reflow 的產生,若是使用下方的 transform  則不會影響到 Layout。

哪些 CSS 會觸發 Layout 可以參考 https://css-triggers.com/ 會顯示哪些屬性 Trigger 了不同的 Step 。


Layer

Layer 的存在是為了優化網頁的渲染,如果每個 Render Tree 都需要透過 CPU 進行一個個的渲染效率非常差,若可以一起進行則效率會變得更好。


Layer 有分成 2 種類型,一是一般的 Render Layer,另一個是 Composition Layer


Render Layer 會在以下以時候建立:

  1. position: relative 或是 absolute 並使用了 transform 
  2. transparent 
  3. CSS Filter
  4. etc


<div class="filter">Filter Render Layer</div>

<style>
.filter {
will-change: filter;
filter: blur(5px);   
}
</style>

當該層 Layer 做出不影響 Layout 的更新時,不會影響到整體頁面的更新,減少不必要的重繪。


Composition Layer 則適用於 3D 或是動畫的狀況,它會使用到 GPU 加速繪製,在 Render Layer 滿足以下狀況會變成 Composition Layer:

  1. 帶有使用 3D 的屬性或是 transform 有 perspective 
  2. vido or canvas
  3. animation opacity
  4. etc


Composition Layer 會建立 thread 並使用 GPU 加速,所以可以一邊進行動畫一邊執行複雜的任務也不會造成卡頓的問題。


References

https://webperf.tips/tip/layers-and-compositing/

https://developer.mozilla.org/en-US/docs/Glossary/Intrinsic_Size

https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg?__readwiseLocation=

avatar-img
2會員
5內容數
FE Developer
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Hello Todd 的其他內容
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
Thumbnail
在這一章節中,我們介紹了 Flexbox 這個 CSS 模型及其用法,重點講解了 Flex 容器和項目的各種屬性。通過具體的示例,展示了如何使用 Flexbox 進行一維佈局設計,並且通過實踐案例,展示了多行 Flex 項目和不同對齊方式的應用。
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
在這篇教學中,我們會介紹Renpy框框 (Box)的各種造型特性,包括水平框 (hbox)、垂直框 (vbox) 和固定框 (fixed),以及常見特性如spacing、box_reverse和box_wrap。透過這份教學,您將能更瞭解Renpy框框的運作原理和應用,進一步提升Renpy的應用能力
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ Javascript和HTML的關係 當我們輸入新的網址或按下重新整理時,從解析檔案到畫面顯示出來,瀏覽器會進行以下流程: 解析 HTML / CSS 檔案,建立物件模型: HTML → DOM (Document Object Model)。 CSS → CSSOM (CSS Obje
Thumbnail
如何透過 CSS 來美化和增強文本的可讀性,對於提升用戶體驗至關重要。本文將介紹如何使用 CSS 來處理網頁上的文本,包括字型設定、文本排列、裝飾等多方面。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
Thumbnail
在這一章節中,我們介紹了 Flexbox 這個 CSS 模型及其用法,重點講解了 Flex 容器和項目的各種屬性。通過具體的示例,展示了如何使用 Flexbox 進行一維佈局設計,並且通過實踐案例,展示了多行 Flex 項目和不同對齊方式的應用。
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
在這篇教學中,我們會介紹Renpy框框 (Box)的各種造型特性,包括水平框 (hbox)、垂直框 (vbox) 和固定框 (fixed),以及常見特性如spacing、box_reverse和box_wrap。透過這份教學,您將能更瞭解Renpy框框的運作原理和應用,進一步提升Renpy的應用能力
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ Javascript和HTML的關係 當我們輸入新的網址或按下重新整理時,從解析檔案到畫面顯示出來,瀏覽器會進行以下流程: 解析 HTML / CSS 檔案,建立物件模型: HTML → DOM (Document Object Model)。 CSS → CSSOM (CSS Obje
Thumbnail
如何透過 CSS 來美化和增強文本的可讀性,對於提升用戶體驗至關重要。本文將介紹如何使用 CSS 來處理網頁上的文本,包括字型設定、文本排列、裝飾等多方面。