在前端開發中,頁面渲染指什麼?
網頁加速中經常提到的
廢話少說,先來看個圖:
從上面這個圖中,我們可以看到那麼幾個事:1)瀏覽器會解析三個東西:
一個是HTML/SVG/XHTML,事實上,Webkit有三個C++的類對應這三類文檔。解析這三種文件會產生一個DOM Tree。
CSS,解析CSS會產生CSS規則樹。Javascript,腳本,主要是通過DOM API和CSSOM API來操作DOM Tree和CSS Rule Tree.2)解析完成後,瀏覽器引擎會通過DOM Tree 和 CSS Rule Tree 來構造 Rendering Tree。注意:
Rendering Tree 渲染樹並不等同於DOM樹,因為一些像Header或display:none的東西就沒必要放在渲染樹中了。CSS 的 Rule Tree主要是為了完成匹配並把CSS Rule附加上Rendering Tree上的每個Element。也就是DOM結點。也就是所謂的Frame。然後,計算每個Frame(也就是每個Element)的位置,這又叫layout和reflow過程。3)最後通過調用操作系統Native GUI的API繪製。
DOM解析
HTML的DOM Tree解析如下:
&
&& &Web page parsing&
&This is an example Web page.&
&
上面這段HTML會解析成這樣:
下面是另一個有SVG標籤的情況。
CSS解析
CSS的解析大概是下面這個樣子(下面主要說的是Gecko也就是Firefox的玩法),假設我們有下面的HTML文檔:
&
&
"A penny saved is a penny earned."&&& FDR said &
"We have nothing to fear but &fear itself.&"&&&
於是DOM Tree是這個樣子:
然後我們的CSS文檔是這樣的:
/* rule 1 */ doc { display: block; text-indent: 1em; }
/* rule 2 */ title { display: block; font-size: 3em; }/* rule 3 */ para { display: block; }/* rule 4 */ [class="emph"] { font-style: italic; }於是我們的CSS Rule Tree會是這個樣子:
注意,圖中的第4條規則出現了兩次,一次是獨立的,一次是在規則3的子結點。所以,我們可以知道,建立CSS Rule Tree是需要比照著DOM Tree來的。CSS匹配DOM Tree主要是從右到左解析CSS的Selector,好多人以為這個事會比較快,其實並不一定。關鍵還看我們的CSS的Selector怎麼寫了。
注意:CSS匹配HTML元素是一個相當複雜和有性能問題的事情。所以,你就會在N多地方看到很多人都告訴你,DOM樹要小,CSS盡量用id和class,千萬不要過渡層疊下去,……
通過這兩個樹,我們可以得到一個叫Style Context Tree,也就是下面這樣(把CSS Rule結點Attach到DOM Tree上):
所以,Firefox基本上來說是通過CSS 解析 生成 CSS Rule Tree,然後,通過比對DOM生成Style Context Tree,然後Firefox通過把Style Context Tree和其Render Tree(Frame Tree)關聯上,就完成了。注意:Render Tree會把一些不可見的結點去除掉。而Firefox中所謂的Frame就是一個DOM結點,不要被其名字所迷惑了。
註:Webkit不像Firefox要用兩個樹來干這個,Webkit也有Style對象,它直接把這個Style對象存在了相應的DOM結點上了。
渲染
渲染的流程基本上如下(黃色的四個步驟):
計算CSS樣式構建Render TreeLayout – 定位坐標和大小,是否換行,各種position, overflow, z-index屬性 ……正式開畫選自:http://coolshell.cn/articles/9666.html
來源:CSS森林(CSS Forest): 瀏覽器工作原理淺析
瀏覽器這邊做的工作大致分為以下幾步:
載入:根據請求的URL進行域名解析,向伺服器發起請求,接收文件(HTML、JS、CSS、圖象等)。
解析:對載入到的資源(HTML、JS、CSS等)進行語法解析,建議相應的內部數據結構(比如HTML的DOM樹,JS的(對象)屬性表,CSS的樣式規則等等)
渲染:構建渲染樹,對各個元素進行位置計算、樣式計算等等,然後根據渲染樹對頁面進行渲染(可以理解為「畫」元素)
這幾個過程不是完全孤立的,會有交叉,比如HTML載入後就會進行解析,然後拉取HTML中指定的CSS、JS等。頁面渲染就是瀏覽器將HTML變成人眼看到的圖像的全過程。
通常開發的時候說的render,就是產生HTML並把它塞進DOM的過程,有時候也專指通過一些代碼邏輯生成想要的HTML的過程。
從瀏覽器底層的角度來說,Render其實是指paiting的過程,也就是解析DOM並把它在屏幕上打出來的過程。
當xhtml,css,js文件被載入進瀏覽器後,執行的就是頁面渲染,瀏覽器會讓這些代碼能夠變成你看到的那個樣子。
同意前面陳遠航的回答
舉例子:你要吃個菜,你找到廚師說,我要尖椒肉絲。廚師就去翻菜譜,炒給你吃。你是瀏覽者菜是你將看到的頁面廚師是瀏覽器菜譜是程序員寫的頁面代碼炒菜的過程,就是頁面渲染。渲染大致分為兩部分,一部分是排版,一部分是繪製。排版就是根據文檔流,加上浮動、定位等屬性,確定各個盒子的位置還有尺寸。繪製就是將css的屬性例如字體、背景色、圓角等等按照給定的方式呈現出來。各個瀏覽器的渲染效率不一樣。
頁面渲染,就是瀏覽器將請求返回的頁面資源(HTML文本,圖像,動畫,視頻,音頻等)基於一定的規則(CSS語句,JS語句,瀏覽器本身的一些規則等)完成頁面布局及繪製的過程。
瀏覽器有自己的渲染器,當瀏覽網頁時,瀏覽器會載入HTML,CSS,JAVASCRIPT到本地,然後根據自己的渲染器渲染出頁面效果,各個瀏覽器的渲染機制不完全相同,這也是同樣的代碼在不同瀏覽器有時會有不同的效果的原因。
直接看這邊blog,有點長,也有中文版的,但是建議看英文版,最好有一點點的編譯基礎什麼的http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#The_browsers_we_will_talk_about 不用謝!!!!PS:好吧,我沒有看過中文版的~~
頁面載入資源原理http://www.douban.com/note/153864670/http://gent.ilcore.com/2011/05/how-web-page-loads.html
將JSON數據生成DOM的過程
前段時間學習了這篇博客
前端必讀:瀏覽器內部工作原理說得非常詳細,看完對於內部工作原理只能理解個大概,不過至於渲染還是比較好理解的,大致就是將代碼構解析某個結構然後展示在瀏覽器頁面的過程,包括HTML代碼構造成dom樹啊,css的樣式構造renders樹啊,就是瀏覽器一步步畫圖的過程。我覺得前端中的渲染和別的領域中的渲染核心上的意思是差不多的。對於開發人員來說,就是修改dom,不同的做法對執行效率有很大影響
推薦閱讀:
※關於 CSS 設計,有什麼書比較好?
※一個從未接觸過前端框架的人如何學習bootstrap?
※前端項目中有簡潔的z-index的約束規則(管理方案)嗎?
※前端常用的幾種在線代碼編輯器各有什麼優勢?
※前端實習的基本要求?