前端面試題學習筆記

2021-10-20 22:12:39 字數 2044 閱讀 9123

html頁面進行重繪和重排(回流)

瀏覽器的執行機制:

構建dom樹(parse):渲染引擎解析html文件,首先將標籤轉換成dom樹中的dom node(包括js生成的標籤)生成內容樹(content tree/dom tree);

構建渲染樹(construct):解析對應的css樣式檔案資訊。(包括js生成的樣式和外部css檔案),而這些檔案資訊以及html中可見的指令,構建渲染樹(rendering tree/frame tree);render tree中每個node都有自己的style,而且render tree不包含隱藏的節點(比如display:none的節點,還有head節點),因為這些節點不會用於呈現;

布局渲染樹(reflow/layout):從根節點遞迴呼叫,計算每乙個元素的大小、位置等,給出每個節點所應該在螢幕上出現的精確座標;

繪製渲染樹(paint/repaint):遍歷渲染樹,使用ui層來繪製每個節點。

重繪(repaint):當盒子的位置、大小以及其他屬性,例如顏色、字型大小等確定下來之後,瀏覽器便把這些原色都按照各自的特色繪製一遍,將內容呈現在頁面上。重繪是指乙個元素外觀的改變所觸發的瀏覽器行為,瀏覽器會根據元素的新屬性重新繪製,使元素呈現新的外觀。

觸發重繪的條件:改變元素外觀屬性。如:color,background-color等。

重排(重構/回流/reflow):當渲染樹中的一部分(或全部)因為元素的規模尺寸,布局,隱藏等改變而需要重新構建,這就稱為回流。任何頁面布局和幾何屬性的改變都會觸發重排。而且每個頁面至少需要一次回流,就是在頁面第一次載入的時候。

觸發重排的條件:任何頁面布局和幾何屬性的改變都會觸發重排。比如:

頁面渲染初始化;(無法避免)

新增或刪除可見的dom元素;

元素位置的改變,或者使用動畫;

元素尺寸的改變——大小,外邊距,邊框;

瀏覽器視窗尺寸的變化(resize事件發生時);

填充內容的改變,比如文字的改變或大小改變而引起的計算值寬度和高度的改變;

讀取某些元素屬性:(offsetleft/top/height/width,clienttop/left/width/height,scrolltop/left/width/height,width/height,getcomputedstyle(),currentstyle(ie) )

重繪與重排的關係:

在回流的時候,瀏覽器會使渲染樹中受到影響的部分失效,並重新構造這部分渲染樹,完成回流後,瀏覽器會重新繪製受影響的部分到螢幕中,該過程稱為重繪。也就是說,重排必定會引發重繪,但重繪不一定會引發重排。

重繪重排的代價:耗時,導致瀏覽器卡慢。

瀏覽器自己的優化:瀏覽器會維護1個佇列,把所有會引起回流、重繪的操作放入這個佇列,等佇列中的操作到了一定的數量或者到了一定的時間間隔,瀏覽器就會flush佇列,進行乙個批處理。這樣就會讓多次的回流、重繪變成一次回流重繪。

我們要注意的優化:我們要減少重繪和重排就是要減少對渲染樹的操作,則我們可以合併多次的dom和樣式的修改,並減少對style樣式的請求。

(1)直接改變元素的classname

(2)display: none:先設定元素為display: none;然後進行頁面布局等操作;設定完成後將元素設定為display: block;這樣的話就只引發兩次重繪和重排;

(3)使用clonenode(true or false)和replacechild技術,引發一次回流和重繪;

(4)將需要多次重排的元素,position屬性設定為absolute或fixed,元素脫離了文件流,它的變化就不會影響到其他元素;

(5)如果需要建立多個dom節點,可以使用documentfragment建立完成後一次性的加入document;

前端面試題

sprites是什麼和為什麼要使用他們?css 精靈 把一堆小的整合到一張大的上,減輕伺服器對的請求數量 有可能替代sprites的方法是什麼?svg圖示,字型圖示,字元編碼等等。1 在div排版的時候,假設現在是100px的寬,我在盒子左側用padding left留個10px的白,div就撐開了...

前端面試題

行內元素有哪些?塊級元素有哪些?空 void 元素有哪些?link和 import的區別是?常見相容性問題?含移動端 html5的離線儲存?描寫一段語義化的html 吧 html5的form如何關閉自動完成功能?什麼是閉包 closure 為什麼要用?localstorage和sessionstor...

前端面試題

朋友碰到的筆試題,在此記錄一下,並且記下碰到的有難點但是自己沒注意的到的面試題!function isnumber x else sum 2,3 5 sum 2 3 5 請寫出sum函式的具體實現。function sum a,c return a c 該題考查的是乙個以前沒接觸過的東西,叫做柯里化...