您好,登錄后才能下訂單哦!
這篇文章主要講解了“HTML、CSS、JavaScript是怎么變成頁面的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“HTML、CSS、JavaScript是怎么變成頁面的”吧!
從輸入HTML、CSS、JavaScript到瀏覽器渲染出我們預期的效果,渲染流程分為這幾個子階段:構建DOM樹、樣式計算、布局階段、分層、繪制、分塊、光柵化和合成。
以下面這段html舉例講解這幾個過程:
//aa.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="./aa.css"> </head> <body> <p id="p-one" style="color:red">hello</p> <p id="p-two">hi</p> <button id="p-three">ok</button> </body> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <script src="./aa.js"></script> </html>
//aa.css #p-two { font-size:2rem; }
//aa.js $("#p-three").bind("click", function() { $("#p-three").css("color", "blue"); });
構建DOM樹
因為瀏覽器?法直接理解和使?HTML,所以需要將HTML轉換為瀏覽器能夠理解的結構——DOM樹。
樣式計算
樣式計算的?的是為了計算出DOM節(jié)點中每個元素的具體樣式,分為三個步驟:
1. 把CSS轉換為瀏覽器能夠理解的結構—styleSheets
2. 轉換樣式表中的屬性值,使其標準化,如:
font-size:2em->font-size:32px p{color:blue}->p{color:rgb(0,0,255)} div{font-weight:bold}->div{font-weight:700}
3.計算出DOM樹中每個節(jié)點的具體樣式,最終輸出的內容是每個DOM節(jié)點的樣式,并被保存在ComputedStyle的結構內。
布局階段
現在,以及有了DOM樹和DOM樹中元素的樣式,但還不足以顯示頁面,因為還不知道DOM元素的幾何位置信息,布局階段就是需要計算出DOM樹中元素的幾何位置,包括以下幾個步驟:
創(chuàng)建布局樹
DOM樹中包含很多不可見的標簽,比如某個標簽使用了屬性"display:none"。所以在顯示之前,還要額外地構建一棵只包含可見元素的布局樹,瀏覽器創(chuàng)建布局樹的大致流程為:遍歷DOM樹中所有可見節(jié)點,并加入布局樹中,忽略不可見節(jié)點。
布局計算
計算每個元素的幾何坐標位置,并將這些信息保存在布局樹中。
小結前三個階段:在HTML頁面內容被提交給瀏覽器渲染引擎后,渲染引擎首先將HTML解析為瀏覽器可以理解的DOM;然后根據CSS樣式表,計算出DOM數所有節(jié)點的樣式;接著又計算每個元素的幾何坐標位置,并將這些信息保存在布局樹中。
分層
有了每個元素的樣式和位置信息,但還是不能開始著手繪制頁面,因為頁面中還有很多復雜的效果,如3D變化、頁面滾動等,為了實現這些效果,渲染引擎還需要為特定節(jié)點生成專門的圖層,并生成一顆對應的圖層樹,即有些元素實際上是被分成了很多層,這些圖層疊加后合成了最終的頁面。只要滿足下面兩個條件之一的元素就會可以生成一個對應的圖層:
擁有層疊上下文屬性的元素會被提升為單獨的一層
從圖中可以看出,明確定位屬性的元素、定義透明屬性的元素、使用CSS濾鏡的元素等,都擁有層疊上下文屬性。
需要裁減的地方也會被創(chuàng)建為圖層
舉例:在css中指定了一個div大width和height屬性后,如果div子元素p標簽的文字內容超過了widthheight大小,就會只把能在widthheight面積內能顯示的內容顯示出來,其他內容被裁減掉了。
圖層繪制
有了圖層樹之后,渲染引擎會對圖層樹中的每個圖層進行繪制。圖層繪制階段,就是輸入各種繪制指令組成的列表(注意,這個階段還不是真正地著手繪制)。
在原aa.html文件中添加代碼<div style="width:300px;height:300px;background: green;">pp</div>下圖中,紅色區(qū)域就是繪制列表,粉色區(qū)域顯示的是繪制過程,可點擊任何一個繪制過程查看。
分塊和柵格化操作
繪制列表只是用來記錄繪制順序和繪制指令,而實際繪制操作是由渲染引擎中的合成線程來完成的。當圖層的繪制列表準備好之后,主線程就會把繪制列表提交給合成線程。合成線程會將圖層劃分為圖塊,視口(就是當前窗口可見的區(qū)域)附近的圖塊優(yōu)先生產位圖,生產位圖的操作實際由柵格化來執(zhí)行(柵格化的具體含義可自行百度)。渲染進維護了一個柵格化線程池,所有的圖塊柵格化都是在線程池內執(zhí)行的,該過程會使用GPU來加速,生產的位圖被保存在GPU內存中。
合成和顯示
當所有圖塊都被光柵化(柵格化)后,合成線程就會生成繪制圖塊的命令,然后該命令提交給瀏覽器進程(這里簡單說下Chrome瀏覽器多進程架構,其將瀏覽器分為:渲染進程、插件進程、GPU進程和瀏覽器主進程,瀏覽器主進程包含UI模塊、網絡模塊、文件模塊等),瀏覽器進程將其頁面內容繪制到內存中,最后再將內存內容顯示在屏幕上。
至此,HTML+CSS+JavaScript就能生成我們所看見的頁面了。
感謝各位的閱讀,以上就是“HTML、CSS、JavaScript是怎么變成頁面的”的內容了,經過本文的學習后,相信大家對HTML、CSS、JavaScript是怎么變成頁面的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。