1. 程式人生 > >為什麼每個前端開發者都要理解頁面的渲染?

為什麼每個前端開發者都要理解頁面的渲染?

今天我要將關注點放到頁面渲染以及其重要性上。雖然已經有很多文章提到過這個主題了,但大部分資訊都是零碎的片段。為了思考這件事情,我需要研究很多資訊的來源。這也就是為什麼我覺得我應該寫這篇文章的原因。我相信這篇文章對新手會很有用,並且對想重新整理和鞏固他們已經瞭解的東西的高手也同樣適用。

渲染應該從最開始當頁面佈局被定義時就進行優化,樣式和指令碼在頁面渲染中扮演著非常重要的角色。專業人員知道一些技巧以避免一些效能問題。

這篇文章不會深入研究瀏覽器的技術細節,而是提供一些通用的原則。不同瀏覽器引擎工作原理不同,這就使特定瀏覽器的學習更加複雜。

瀏覽器是怎樣渲染一個頁面的?

我們從瀏覽器渲染頁面的大概過程開始說起:

  1. 由從伺服器接收到的 HTML 形成 DOM(文件物件模型)。
  2. 樣式被載入和解析,形成 CSSOM(CSS 物件模型)。
  3. 緊接著 DOM 和 CSSOM 建立了一個渲染樹,這個渲染樹是一些被渲染物件的集合( Webkit 分別叫它們”renderer”和”render object”,而在Gecko 引擎中叫”frame”)。除了不可見的元素(比如 head 標籤和一些有 display:none 屬性的元素),渲染樹映射了 DOM 的結構。在渲染樹中,每一個文字字串都被當做一個獨立的 renderer。每個渲染物件都包含了與之對應的計算過樣式的DOM 物件(或者一個文字塊)。換句話說,渲染樹描述了 DOM 的直觀的表現形式。
  4. 對每個渲染元素來說,它的座標是經過計算的,這被叫做“佈局(layout)”。瀏覽器使用一種只需要一次處理的“流方法”來佈局所有元素(tables需要多次處理)。
  5. 最後,將佈局顯示在瀏覽器視窗中,這個過程叫做“繪製(painting)”。

重繪

當在頁面上修改了一些不需要改變定位的樣式的時候(比如background-color,border-color,visibility),瀏覽器只會將新的樣式重新繪製給元素(這就叫一次“重繪”或者“重新定義樣式”)。

重排

當頁面上的改變影響了文件內容、結構或者元素定位時,就會發生重排(或稱“重新佈局”)。重排通常由以下改變觸發:

  • DOM 操作(如元素增、刪、改或者改變元素順序)。
  • 內容的改變,包括 Form 表單中文字變化。
  • 計算或改變 CSS 屬性。
  • 增加或刪除一個樣式表。
  • 改變”class”屬性。
  • 瀏覽器視窗的操作(改變大小、滾動視窗)。
  • 啟用偽類(如:hover狀態)。

瀏覽器如何優化渲染?

瀏覽器盡最大努力限制重排的過程僅覆蓋已更改的元素的區域。舉個例子,一個 position 為 absolue 或 fixed 的元素的大小變化隻影響它自身和子孫元素,而對一個 position 為 static 的元素做同樣的操作就會引起所有它後面元素的重排。

另一個優化就是當執行一段Jjavascript 程式碼的時候,瀏覽器會將一些修改快取起來,然後當代碼執行的時候,一次性的將這些修改執行。舉例來說,這段程式碼會觸發一次重繪和一次重排:

1 2 3 4 5 var $body = $('body'); $body.css('padding', '1px'); // 重排, 重繪 $body.css('color', 'red'); // 重繪 $body.css('margin', '2px'); // 重排, 重繪 // 實際上只有一次重排和重繪被執行。

如上面所說,訪問一個元素的屬性會進行一次強制重排。如果我們給上面的程式碼加上一行讀取元素屬性的程式碼,這個情況就會出現:

1 2 3 4 5 var $body = $('body'); $body.css('padding', '1px'); $body.css('padding'); // 這裡讀取了一次元素的屬性,一次強制重排就會發生。 $body.css('color', 'red'); $body.css('margin', '2px');

上面這段程式碼的結果就是,進行了兩次重排。因此,為了提高效能,你應該講讀取元素屬性的程式碼組織在一起(細節的例子可以看JSBin上的程式碼)。

有一種情況是必須觸發一次強制重排的。例如:給元素改變同一個屬性兩次(比如margin-left),一開始設定100px,沒有動畫,然後通過動畫的形式將值改為50px。具體可以看例子,當然,我在這裡會講更多的細節。

我們從一個有transition的CSS class開始:

1 2 3 4 5 6 .has-transition { -webkit-transition: margin-left 1s ease-out; -moz-transition: margin-

相關推薦

為什麼每個前端開發者理解頁面渲染

今天我要將關注點放到頁面渲染以及其重要性上。雖然已經有很多文章提到過這個主題了,但大部分資訊都是零碎的片段。為了思考這件事情,我需要研究很多資訊的來源。這也就是為什麼我覺得我應該寫這篇文章的原因。我相信這篇文章對新手會很有用,並且對想重新整理和鞏固他們已經瞭解的東西的

學習web前端開發學什麼?

有很多初學前端的同學問我,web前端開發需要學什麼?web前端開發需要學哪些軟體? 關於第一個問題,很好回答。簡單來說,html、css、js、html5這些是前端開發初學者必須學習會的,沒有學會這些,也是找不到工作的。 需要提醒一下的是,這些基礎知識看上去簡單,很多人以為自學就可以掌

為什麼 那麼多 前端開發者想學 Vue.js

根據JavaScript 2017 前端庫狀況調查 Vue.js是開發者最想學的前端庫。我在這裡說明一下我為什麼認為這也是和你一起通過使用 Vue 構建一個簡單的 App 應用程式的原因。 我最近曾與 Evan You,Chris Fritz,Sarah Drasner,和 Adam

為什麼修復每個 bug 後問這 3 個問題?

你是否曾經修復了一個 bug ,隨後又發現了一個跟剛修復 bug 有關的 bug ,又或是修復 bug 的方式引起了另一個 bug ?當我修改 bug 時,我會問自己三個問題,以確保我已經仔細考慮了它的意義。每次你認為發現並修改了一個 bug 時,可以使用這些問題來提高生產力和程式碼質量。 這些問

小黃鴨除錯法,每個程式設計師知道的

花了一下午(或一天)在試圖解決某個 Bug,後來才知道解決方案很簡單,當時就是沒有想到。 有個同事正好路過,看到你愁眉苦臉的,問你“怎麼了呀?” “噢,是這樣的。我遇到了一個問題,點選這個控制元件的時……” 當你正準備和同事詳細解釋的時候,突然靈光一現,你話都沒說完

修復每個 bug 後問這 3 個問題

你是否曾經修復了一個 bug ,隨後又發現了一個跟剛修復 bug 有關的 bug ,又或是修復 bug 的方式引起了另一個 bug ?當我修改 bug 時,我會問自己三個問題,以確保我已經仔細考慮了它的意義。每次你認為發現並修改了一個 bug 時,可以使用這些問題來

每個系統管理員知道的 30 個 Linux 系統監控工具

11. netstat - Linux 網路統計監控工具netstat 命令顯示網路連線、路由表、介面統計、偽裝連線和多播連線等資訊。# netstat -tulpn # netstat -nat12. ss - 網路統計ss 命令用於獲取套接字統計資訊。它可以顯示類似於 netstat 的資訊。不過 net

每個 Java 開發者應該知道的 5 個註解

自 JDK5 推出以來,註解已成為Java生態系統不可缺少的一部分。雖然開發者為Java框架(例如Spring的@Autowired)開發了無數的自定義註解,但編譯器認可的一些註解非常重要。在本文中,我們將看到5個Java編譯器支援的註解,並瞭解其期望用途。順便,我們將探索其

每個Web開發者該瞭解的12條命令列

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://tutorialzine.com/2017/08/12-terminal-commands-every-web-developer-should-know   在開

愛創課堂----Web前端開發的工資如何?學習哪些技術?

node 互聯網 前端 今天來和大家講講Web前端開發需要學習什麽?前端開發又需要用到哪些開發工具?然後分享一些前端開發的免費課程給大家,然後也簡單的和大家介紹下前端開發的前景和薪水工資情況,下面就簡單和大家介紹一下。1. Web前端的職能Web前端工程師其實在不同的公司,有不同的職能,但是稱呼都

每個類聲明之後、每個函數定義結束之後加空行。

user run main oat this 空行 getch ram str 在每個類聲明之後、每個函數定義結束之後都要加空行。 1 #include <iostream> 2 3 /* run this program using the co

郭士強:一直強調打團隊籃球 每個站出來

@央廣軍事11月10日訊息,2018中國航展上首次公開展出的“瞭望者Ⅱ”察打一體導彈無人艇,是剛剛成功進行首發導彈飛行試驗命中靶心的實艇,試驗成功後隨即吊裝到展位與公眾見面。據媒體此前報道,該艇是中國第一艘導彈無人艇,也是繼以色列拉斐爾海上騎士後全球第二個成功發射導彈的無人艇,填補了國內導彈無人艇這一技術空白

前端階段性總結(二):頁面渲染機制與效能優化

引言: 轉前端一年了,期間工作較忙,也沒時間整理一些知識體系,此係列文章是對前端基礎的一些回顧與總結。本文主要介紹瀏覽器工作的原理以及一些優化手段。 一、瀏覽器渲染過程 1. 瀏覽器的主要結構: 2. 瀏覽器的多程序模型: 以chorme為例: Browser

前端開發中,頁面渲染指什麼

從上面這個圖中,我們可以看到那麼幾個事: 1)瀏覽器會解析三個東西: 一個是HTML/SVG/XHTML,事實上,Webkit有三個C++的類對應這三類文件。解析這三種檔案會產生一個DOM Tree。 CSS,解析CSS會產生CSS規則樹。 Javascript,指令碼,主

第六十二條 每個方法丟擲的異常有文件

每個方法,都要有文件註釋,這樣便於後期自己回顧當初的功能以及便於他人的閱讀理解,同樣的,每個方法丟擲的異常,也需要文件註釋。因此,花費時間為每個方法丟擲的異常文件是特別重要的。我們要記住,需要宣告受檢的異常,用Javadoc的@throws標記,並記錄每個異常的條件。如果一個

第六十二條 每個方法丟擲的異常有文件

每個方法,都要有文件註釋,這樣便於後期自己回顧當初的功能以及便於他人的閱讀理解,同樣的,每個方法丟擲的異常,也需要文件註釋。因此,花費時間為每個方法丟擲的異常文件是特別重要的。我們要記住,需要宣告受檢的異常,用Javadoc的@throws標記,並記錄每個異常的條件。如果一個方法會丟擲多個異常類,不

Web前端面試指導(四十五):頁面渲染原理是什麼?

題目點評 這是一道純理論的題目,只要能夠將瀏覽器的渲染過程很專業的表述出來,一定會得到面試官的青睞,作為一枚前端人員確實有必要了解一下瀏覽器的渲染過程是怎樣的,對於頁面效能的提升是有幫助的。 解題思路 渲染引擎是幹什麼的 渲染引擎可以顯示html、xml文件及圖片,它也可以

動態ip代理教你:如何用爬蟲實現前端頁面渲染

end 元素 當前 dea 渲染 用法 ans 方案 quest 在很早以前,幾乎絕大多數網站全全都是利用後端渲染的,即在服務器端組裝形成完整的HTML頁面,隨後再將完整頁面返回給前端進行展現。而近期,隨著AJAX技術的不斷普及,和AngularJS這類SPA框架的廣泛應用

每個開發者應該擁有一款的 GitHub Trending 客戶端,GitHub 最受歡迎的開源專案瀏覽器

這是一個用來檢視GitHub最受歡迎與最熱專案的App,它基於React Native支援Android和iOS雙平臺。專案原始碼 目錄 功能與特性 下載安裝 預覽圖 執行除錯 T

社會猶如一條船,每個有掌舵的準備

今天給大家分享一段迷你播放器的呼叫程式碼。使用這段程式碼,可以避免廣告,避免點選跳轉到優酷網站。 <embed src="http://static.youku.com/v/swf/qplayer.swf?winType=adshow&amp;VideoIDS