摘要:布局完成后,瀏覽器會(huì)返回,解析尚未解決的所有基于或基于百分比的值。為了確保瀏覽器遵循標(biāo)準(zhǔn),并且內(nèi)容圍繞浮動(dòng),瀏覽器更改了的的幾何形狀。
想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!
解析
一旦 CSS 被瀏覽器下載,CSS 解析器就會(huì)被打開來處理它遇到的任何CSS。這可以是單個(gè)文檔內(nèi)的CSS、
瀏覽器從 body 元素開始,生成它的主盒(principal box),它的寬度為50px,默認(rèn)高度為auto。
現(xiàn)在移動(dòng)到 p 標(biāo)簽并生成其主盒(principal box),并且由于 p 標(biāo)簽?zāi)J(rèn)有邊距(margin),這將影響正文的高度,如下所示:
現(xiàn)在瀏覽器移動(dòng)到 “Hello world” 文本,這是 DOM 中的文本節(jié)點(diǎn)。因此,我們在布局中生成一個(gè) 行內(nèi)盒(line box) 。請注意,文本溢出了正文,我們將在下一步處理這個(gè)問題。
因?yàn)榧由稀皐orld”長度后實(shí)際長度比較設(shè)置大并且我們沒有設(shè)置 overflow 屬性,所以引擎會(huì)向其父級(jí)報(bào)告它在布局文本時(shí)停止的位置。
由于父級(jí)已收到其子級(jí)無法完成所有內(nèi)容布局的指令,因此它會(huì)克隆包含所有樣式的 行內(nèi)盒(line box),并傳遞該框的信息以完成布局。
布局完成后,瀏覽器會(huì)返回 box tree,解析尚未解決的所有基于 auto 或基于百分比的值。 在圖中,可以看到正文和段落現(xiàn)在包含所有 “Hello world”,因?yàn)樗?height 設(shè)置為 auto。
處理浮動(dòng) float
現(xiàn)在讓布局變得更復(fù)雜一點(diǎn)。我們將使用一個(gè)普通布局,其中有一個(gè)按鈕,內(nèi)容為 “Share It”,并將其浮動(dòng)到一段文本的左側(cè)。浮動(dòng)本身被認(rèn)為是“shrink-to-fit” 上下文。之所以將其稱為“shrink-to-fit”,是因?yàn)槿绻叽缡亲詣?dòng)的,則該框?qū)@其內(nèi)容進(jìn)行收縮。
浮動(dòng)盒子是與這種布局類型匹配的盒子的一種類型,但是還有許多其他的盒子,例如絕對定位盒子(包括 position: fixed)和基于自動(dòng)調(diào)整大小的表格單元格,如下代碼:
SHARE IT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pellentesq
該過程開始時(shí)遵循與“Hello world”示例相同的模式,因此我將跳到我們開始處理浮動(dòng)按鈕的位置。
由于浮動(dòng)創(chuàng)建了一個(gè)新的塊格式化上下文(BFC),并且是一個(gè) shrink-to-fit 上下文,因此瀏覽器執(zhí)行一種稱為內(nèi)容度量的特定布局類型。
在這種模式下,它看起來與其他布局相同,但有一個(gè)重要的區(qū)別,即它是在無限空間中完成的。在此階段,瀏覽器所做的就是以 BFC 的最大和最小寬度布局 BFC 樹。
在本例中,它使用文本布局一個(gè)按鈕,因此其最窄的大小(包括所有其他CSS框)將是最長單詞的大小。在最寬的地方,它將是一行的所有文本,加上 CSS Box。注意:這里按鈕的顏色不是文字的顏色。這只是為了說明問題。
現(xiàn)在我們知道最小寬度是86px,最大寬度是115px,我們將此信息傳遞回父類的box,讓它決定寬度并適當(dāng)?shù)胤胖冒粹o。在這個(gè)場景中,有足夠的空間來適應(yīng)浮動(dòng)的最大大小,這就是按鈕的布局方式。
為了確保瀏覽器遵循標(biāo)準(zhǔn),并且內(nèi)容圍繞浮動(dòng),瀏覽器更改了 article 的 BFC 的幾何形狀。這個(gè)幾何圖形被傳遞給段落,以便在段落布局期間使用。
從這里開始,瀏覽器遵循與第一個(gè)示例相同的布局過程——但是它確保任何內(nèi)聯(lián)內(nèi)容的內(nèi)聯(lián)和塊的起始位置都位于浮動(dòng)所占用的約束空間之外。
當(dāng)瀏覽器繼續(xù)沿著樹向下移動(dòng)并克隆節(jié)點(diǎn)時(shí),它將越過約束空間的塊位置。這允許最后一行文本(以及它之前的一行)以內(nèi)聯(lián)方向開始于content box 的開頭。然后瀏覽器返回到樹中,根據(jù)需要解析 auto 和百分?jǐn)?shù)。
了解片段(UNDERSTANDING FRAGMENTATION
關(guān)于布局如何工作的最后一個(gè)方面是碎片化。 如果你曾經(jīng)打印過網(wǎng)頁或使用過CSS多列,那么你已經(jīng)利用了碎片。 碎片化是將內(nèi)容分開以使其適合不同幾何形狀的邏輯。 讓我們來看看同一個(gè)例子,利用 CSS 多列情況:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nibh orci, tincidunt eget enim et, pellentesque condimentum risus. Aenean sollicitudin risus velit, quis tempor leo malesuada vel. Donec consequat aliquet mauris. Vestibulum ante ipsum primis in faucibus
一旦瀏覽器到達(dá) multicol 格式化上下文盒子,它就會(huì)看到它有一組設(shè)定的列。
它遵循以前類似的克隆模型,并創(chuàng)建了一個(gè)具有正確維度的碎片處理程序,以滿足作者對其列的要求。
然后瀏覽器按照與之前相同的模式盡可能多地布局行,然后瀏覽器創(chuàng)建另一個(gè)碎片管理器,并繼續(xù)完成布局。
繪畫(Painting)
來回顧一下我們現(xiàn)在的情況,我們?nèi)〕鏊械?CSS 內(nèi)容,對其進(jìn)行解析,將其級(jí)聯(lián)到DOM 樹中,并完成布局。但是我們還沒有對布圖應(yīng)用顏色、邊框、陰影和類似的設(shè)計(jì)處理——處理這些過程被稱為繪畫。
繪畫基本上是由CSS標(biāo)準(zhǔn)化的,簡單地說,你可以按照以下順序繪畫:
background;
border;
and content.
更多繪畫的順序可查看 CSS 2.2 Appendix E。
因此,如果我們從前面的“SHARE IT”按鈕開始,并遵循這個(gè)過程,它繪制過程大致如下:
完成后,它將轉(zhuǎn)換為位圖,最終每個(gè)布局元素(甚至文本)都成為引擎中的圖像。
關(guān)于 Z-INDEX
現(xiàn)在,我們大多數(shù)的網(wǎng)站都不是由單一的元素組成的。此外,我們經(jīng)常希望某些元素出現(xiàn)在其他元素之上。為了實(shí)現(xiàn)這一點(diǎn),我們可以利用 z-index 的特性將一個(gè)元素疊加到另一個(gè)元素上。
這可能感覺就像我們在設(shè)計(jì)軟件中使用圖層一樣,但是唯一存在的圖層是在瀏覽器的合成器中??雌饋砗孟裎覀冊谑褂?z-index 創(chuàng)建新層,但實(shí)際上并不是這樣,那么到底是怎么樣呢?
我們要做的是創(chuàng)建一個(gè)新的堆棧上下文。創(chuàng)建一個(gè)新的堆疊上下文可以有效地改變你繪制元素的順序。讓我們來看一個(gè)例子:
Item 1
Item 2
如果沒有使用 z-index,上面的文檔將按照文檔順序繪制,這將把 “Item 2” 置于 “Item 1” 之上。但由于 z-index 的影響,繪畫順序發(fā)生了變化。讓我們逐步完成每個(gè)階段,類似于我們之前完成布局的方式。
瀏覽器以根框開頭,我們在后臺(tái)畫畫。
然后瀏覽器按照文檔順序遍歷較低層次的堆棧上下文(在本例中是“Item 2”),并開始按照上面的規(guī)則繪制該元素。
然后它遍歷到下一個(gè)最高的堆棧上下文(在本例中是“Item 1”),并按照 CSS 2.2中定義的順序繪制它。
z-index 不影響顏色,只影響哪些元素對用戶可見,因此也不影響哪些文本和顏色可見。
組成(COMPOSITION)
在這個(gè)階段,我們至少有一個(gè)位圖從繪畫傳遞到合成。合成程序的工作是創(chuàng)建一個(gè)或多個(gè)層,并將位圖呈現(xiàn)到屏幕上供最終用戶查看。
此時(shí)一個(gè)合理的問題是,“為什么任何站點(diǎn)都需要不止一個(gè)位圖或合成層?”,根據(jù)我們目前看到的例子,我們真的不會(huì)這么做。我們來看一個(gè)稍微復(fù)雜一點(diǎn)的例子。假設(shè)在一個(gè)假設(shè)的世界中,Office 團(tuán)隊(duì)想讓 Clippy 重新上線,他們想通過 CS S轉(zhuǎn)換讓Clippy 跳動(dòng)來吸引人們對他的注意。
動(dòng)畫 Clippy 的代碼可以是這樣的:
當(dāng)瀏覽器讀取 web 開發(fā)人員希望在無限循環(huán)中為 Clippy 添加動(dòng)畫時(shí),它有兩個(gè)選項(xiàng):
它可以返回到動(dòng)畫的每一幀的重繪階段,并生成一個(gè)新的位圖以返回合成器。
或者它可以生成兩個(gè)不同的位圖,并允許合成程序僅在應(yīng)用了該動(dòng)畫的層上執(zhí)行動(dòng)畫本身。
在大多數(shù)情況下,瀏覽器將選擇選項(xiàng)2并生成以下內(nèi)容(我有意簡化了Word Online為此示例生成的圖層數(shù)量):
然后,它將重新組合剪輯位圖在正確的位置,并處理脈動(dòng)動(dòng)畫。這對于性能來說是一個(gè)很好的優(yōu)勢,因?yàn)樵谠S多引擎中,合成程序是在它自己的線程上的,這樣就可以解除主線程的阻塞。如果瀏覽器選擇上面的選項(xiàng)1,它將不得不阻塞每一幀以完成相同的結(jié)果,這將對最終用戶的性能和響應(yīng)能力產(chǎn)生負(fù)面影響。
創(chuàng)造互動(dòng)的視覺
正如我們剛剛了解到的,我們使用了所有的樣式和DOM,并生成了一個(gè)呈現(xiàn)給最終用戶的圖像。那么瀏覽器如何創(chuàng)建交互性的假象呢?嗯,我相信你現(xiàn)在已經(jīng)學(xué)過了,所以讓我們看一個(gè)例子,用我們的 “SHARE IT” 按鈕作為類比:
button {
float: left;
background: rgb(210, 32, 79);
padding: 3px 10px;
border: 2px solid black;
}
button:hover {
background: teal;
color: black;
}
我們在這里添加的是一個(gè)偽類,它告訴瀏覽器在用戶懸停在按鈕上時(shí)更改按鈕的背景和文本顏色。這就引出了一個(gè)問題,瀏覽器如何處理這個(gè)問題?
瀏覽器不斷跟蹤各種輸入,當(dāng)這些輸入正在移動(dòng)時(shí),它會(huì)經(jīng)歷稱為命中測試的過程。 對于此示例,該過程如下所示:
用戶將鼠標(biāo)移到按鈕上。
瀏覽器觸發(fā)鼠標(biāo)已移動(dòng)的事件,并進(jìn)入命中測試算法,該算法本質(zhì)上是問“鼠標(biāo)正在觸摸哪個(gè) box”
該算法返回鏈接到我們的 “SHARE IT” 按鈕。
瀏覽器會(huì)問這個(gè)問題:“既然有鼠標(biāo)在你上方盤旋,我應(yīng)該做什么?”。
它快速運(yùn)行此框及其子框的樣式/級(jí)聯(lián),并確定:hover 在聲明塊內(nèi)部有一個(gè)僅使用繪制樣式調(diào)整的偽類。
它將這些樣式掛起 DOM 元素(正如我們在級(jí)聯(lián)階段所學(xué)到的),在這種情況下是按鈕。
它跳過布局,直接繪制一個(gè)新的位圖。
新的位圖被傳遞給合成程序,然后傳遞給用戶。
總結(jié)
希望這部分對你關(guān)于css 解析過程多多少少有點(diǎn)幫助,共進(jìn)步!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109261.html
摘要:對應(yīng)多種語法規(guī)則可以為指定樣式。渲染頁面繪制到屏幕后,頁面結(jié)構(gòu)的改變也有可能導(dǎo)致渲染樹重新計(jì)算,其中重排和重繪是最耗時(shí)的部分。 寫了這么多class,color,background,display...; 也許有時(shí)候會(huì)疑惑,怎么就顯示在頁面上,改變元素的樣式。 本文簡明介紹整個(gè)解析,匹配,渲染過程 css 描述 css 是Cascading Style Sheets的簡寫,是一種樣式...
摘要:由一道面試題引發(fā)的思考從用戶輸入瀏覽器輸入到頁面最后呈現(xiàn)有哪些過程一道很常規(guī)的題目,考的是基本網(wǎng)絡(luò)原理,和瀏覽器加載,過程。所以抽出時(shí)間研究下瀏覽器渲染頁面的過程。 由一道面試題引發(fā)的思考: 從用戶輸入瀏覽器輸入url到頁面最后呈現(xiàn) 有哪些過程?一道很常規(guī)的題目,考的是基本網(wǎng)絡(luò)原理,和瀏覽器加載css,js過程。 答案大致如下: 用戶輸入U(xiǎn)RL地址 瀏覽器解析URL解析出主機(jī)名 瀏覽...
摘要:也有的元素被完全無視,比如的元素。對于每個(gè)元素,必須在所有中找到符合的并將對應(yīng)的規(guī)則進(jìn)行合并。這樣做是為了減少無效匹配次數(shù),從而匹配快性能更優(yōu)。識(shí)別屬性值,創(chuàng)建對象,并將對象存入解釋器堆棧。數(shù)組中的每一項(xiàng)紀(jì)錄了這個(gè)的,的值,權(quán)重層疊規(guī)則。 作為前端,我們每天都在與CSS打交道,那么CSS的原理是什么呢? 一、瀏覽器渲染 開篇,我們還是不厭其煩的回顧一下瀏覽器的渲染過程,先上圖:show...
摘要:也有的元素被完全無視,比如的元素。對于每個(gè)元素,必須在所有中找到符合的并將對應(yīng)的規(guī)則進(jìn)行合并。這樣做是為了減少無效匹配次數(shù),從而匹配快性能更優(yōu)。識(shí)別屬性值,創(chuàng)建對象,并將對象存入解釋器堆棧。數(shù)組中的每一項(xiàng)紀(jì)錄了這個(gè)的,的值,權(quán)重層疊規(guī)則。 作為前端,我們每天都在與CSS打交道,那么CSS的原理是什么呢? 一、瀏覽器渲染 開篇,我們還是不厭其煩的回顧一下瀏覽器的渲染過程,先上圖:show...
摘要:和渲染過程一個(gè)簡單的頁面如上所示。的主要是為了完成匹配并把附加上上的每個(gè)。然后,計(jì)算每個(gè)也就是每個(gè)的位置,這又叫和過程。將與合并成一個(gè)渲染樹。優(yōu)化關(guān)鍵渲染路徑就是指最大限度縮短執(zhí)行上述第步至第步耗費(fèi)的總時(shí)間 DOM和CSS渲染過程 DOM Document 一個(gè)簡單的html頁面如上所示。 DOM有兩個(gè)概念: 解析 渲染...
閱讀 1762·2021-10-12 10:12
閱讀 2530·2021-09-29 09:42
閱讀 2711·2021-09-03 10:28
閱讀 2249·2019-08-30 15:54
閱讀 1153·2019-08-30 15:53
閱讀 1388·2019-08-30 11:26
閱讀 3357·2019-08-30 11:02
閱讀 2134·2019-08-30 11:02