chrome瀏覽器渲染白屏問題剖析


剛截圖十幾次,終於捕捉到了這個白屏現象,hiahia~~

大家可以很清晰地看到下邊還木有渲染完畢的透明層,這是一個十分普遍的問題,經常遇到。我的瀏覽器版本是

到目前為止應該是最新版(release版本),之前的版本應該也存在類似的問題。只要處理好代碼,這種體驗相當不好的白屏問題是可以避免的,Qzone的頁面貌似就沒有這個現象。首先我們來聊一聊這個問題是怎么產生的,這涉及到chrome瀏覽器對網頁的解析和渲染。

渲染引擎首先通過網絡獲得所請求文檔的內容,通常以8K分塊的方式完成。
下面是渲染引擎在取得內容之后的基本流程:
解析html以構建dom樹->構建render樹->布局render樹->繪制render樹

 

  渲染引擎開始解析html,並將標簽轉化為內容樹中的dom節點。接着,它解析外部CSS文件及style標簽中的樣式信息。這些樣式信息以及html中的可見性指令將被用來構建另一棵樹——render樹。

  Render樹由一些包含有顏色和大小等屬性的矩形組成,它們將被按照正確的順序顯示到屏幕上。

  Render樹構建好了之后,將會執行布局過程,它將確定每個節點在屏幕上的確切坐標。再下一步就是繪制,即遍歷render樹,並使用UI后端層繪制每個節點。

  值得注意的是,這個過程是逐步完成的,為了更好的用戶體驗,渲染引擎將會盡可能早的將內容呈現到屏幕上,並不會等到所有的html都解析完成之后再去構建和布局render樹。它是解析完一部分內容就顯示一部分內容,同時,可能還在通過網絡下載其余內容。

  如果我們在Render樹未完全繪制並渲染之前,向下快速拖動滾動條會看到上圖所示的白屏現象。那這種現象可以通過什么方式來處理呢?應該說這是避免不了的,我們能做的就是:

  • 遵循XHTML編碼規則,錯誤的標簽在解析的過程中,瀏覽器需要花費很多時間去進行容錯處理(一些push和pop操作),會在構建DOM樹的時間花掉額外的時間。
  • 優化HTML代碼,減少代碼層次(有些網站堆砌一二十層標簽的做法實在是沒法不讓人吐槽)

  • 優化css,減少樣式計算所需要的時間,div div div div{…},盡量不要出現這么復雜的選擇符。
  • 盡量不要使用 document.write,html不能被自頂向下或自底向上地被解析,一種重要的原因也是因為腳本標簽中含有這個所導致的,他可能會添加標簽。
  • 縮短第一屏的內容,后幾屏的內容用js異步+判斷滾動條動作載入,減少構建Render樹和布局render樹的時間

關於瀏覽器的工作原理,有興趣的可以上網搜搜

本文同步自我的github博客。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM