⑴ 為什麼每個前端開發者都要理解網頁渲染
今天我要將關注點放到網頁渲染以及其重要性上。雖然已經有很多文章提到過這個主題了,但大部分信息都是零碎的片段。為了思考這件事情,我需要研究很多信息的來源。這也就是為什麼我覺得我應該寫這篇文章的原因。我相信這篇文章對新手會很有用,並且對想刷新和鞏固他們已經了解的東西的高手也同樣適用。
渲染應該從最開始當頁面布局被定義時就進行優化,樣式和腳本在頁面渲染中扮演著非常重要的角色。專業人員知道一些技巧以避免一些性能問題。
這篇文章不會深入研究瀏覽器的技術細節,而是提供一些通用的原則。不同瀏覽器引擎工作原理不同,這就使特定瀏覽器的學習更加復雜。
瀏覽器是怎樣渲染一個頁面的?
我們從瀏覽器渲染頁面的大概過程開始說起:
由從伺服器接收到的 HTML 形成DOM(文檔對象模型)。
樣式被載入和解析,形成 CSSOM(CSS 對象模型)。
緊接著 DOM 和 CSSOM 創建了一個渲染樹,這個渲染樹是一些被渲染對象的集合( Webkit 分別叫它們」renderer」和」render object」,而在Gecko 引擎中叫」frame」)。除了不可見的元素(比如 head 標簽和一些有 display:none 屬性的元素),渲染樹映射了 DOM 的結構。在渲染樹中,每一個文本字元串都被當做一個獨立的 renderer。每個渲染對象都包含了與之對應的計算過樣式的DOM 對象(或者一個文本塊)。換句話說,渲染樹描述了 DOM 的直觀的表現形式。
對每個渲染元素來說,它的坐標是經過計算的,這被叫做「布局(layout)」。瀏覽器使用一種只需要一次處理的「流方法」來布局所有元素(tables需要多次處理)。
最後,將布局顯示在瀏覽器窗口中,這個過程叫做「繪制(painting)」。
重繪
當在頁面上修改了一些不需要改變定位的樣式的時候(比如background-color,border-color,visibility),瀏覽器只會將新的樣式重新繪制給元素(這就叫一次「重繪」或者「重新定義樣式」)。
重排
當頁面上的改變影響了文檔內容、結構或者元素定位時,就會發生重排(或稱「重新布局」)。重排通常由以下改變觸發:
· DOM 操作(如元素增、刪、改或者改變元素順序)。
·內容的改變,包括 Form 表單中文字的變化。
·計算或改變 CSS 屬性。
·增加或刪除一個樣式表。
·改變」class」屬性。
·瀏覽器窗口的操作(改變大小、滾動窗口)。
·激活偽類(如:hover狀態)。
瀏覽器如何優化渲染?
瀏覽器盡最大努力限制重排的過程僅覆蓋已更改的元素的區域。舉個例子,一個 position 為 absolue 或 fixed 的元素的大小變化隻影響它自身和子孫元素,而對一個 position 為 static 的元素做同樣的操作就會引起所有它後面元素的重排。
另一個優化就是當運行一段Jjavascript 代碼的時候,瀏覽器會將一些修改緩存起來,然後當代碼執行的時候,一次性的將這些修改執行。
舉例來說,這段代碼會觸發一次重繪和一次重排:
var$body=$('body');
$body.css('padding','1px');//重排,重繪
$body.css('color','red');//重繪
$body.css('margin','2px');//重排,重繪
//實際上只有一次重排和重繪被執行。
如上面所說,訪問一個元素的屬性會進行一次強制重排。如果我們給上面的代碼加上一行讀取元素屬性的代碼,這個情況就會出現:
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開始:
.has-transition{
-webkit-transition:margin-left1sease-out;
-moz-transition:margin-left1sease-out;
-o-transition:margin-left1sease-out;
transition:margin-left1sease-out;
}
然後進行實現:
//我們的元素默認有"has-transition"屬性
var$targetElem=$('#targetElemId');
//刪除包含transition的class
$targetElem.removeClass('has-transition');
//當包含transition的class已經沒了的時候,改變元素屬性
$targetElem.css('margin-left',100);
//再將包含transition的class添加回來
$targetElem.addClass('has-transition');
//改變元素屬性
$targetElem.css('margin-left',50);
上面的實現沒有按照期望的運行。所有的修改都被瀏覽器緩存了,只在上面這段代碼的最後才會執行。我們需要的是一次強制重排,我們可以通過進行以下修改來實現:
//刪除包含transition的class
$(this).removeClass('has-transition');
//改變元素屬性
$(this).css('margin-left',100);
//觸發一次強制重排,從而使變化了的class或屬性能夠立即執行。
$(this)[0].offsetHeight; //offsetHeight僅僅是個例子,其他的屬性也可以奏效。
//再將包含transition的class添加回來
$(this).addClass('has-transition');
//改變元素屬性
$(this).css('margin-left',50);
現在這段代碼如我們所期望的運行了。
實際的優化建議
匯總了一些有用的信息,我建議以下幾點:
·創建合法的 HTML 和 CSS ,別忘了制定文件編碼,Style 應該寫在 head 標簽中,script 標簽應該載入 body 標簽結束的位置。
·試著簡化和優化 CSS 選擇器(這個優化點被大多數使用 CSS 預處理器的開發者忽略了)。將嵌套層數控制在最小。以下是 CSS 選擇器的性能排行(從最快的開始):
ID選擇器:#id
class選擇器:.class
標簽:div
相鄰的兄弟元素:a + i
父元素選擇器:ul > li
通配符選擇器:*
偽類和偽元素:a:hover,你應該記住瀏覽器處理選擇器是從右向左的,這也就是為什麼最右面的選擇器會更快——#id或.class。
div*{...}//bad
.listli{...}//bad
.list-item{...}//good
#list.list-item{...}//good
在你的腳本中,盡可能的減少 DOM 的操作。把所有東西都緩存起來,包括屬性和對象(如果它可被重復使用)。進行復雜的操作的時候,最好操作一個「離線」的元素(「離線」元素的意思是與 DOM 對象分開、僅存在內存中的元素),然後將這個元素插入到 DOM 中
如果你使用 jQuery,遵循jQuery 選擇器最佳實踐
要改變元素的樣式,修改「class」屬性是最高效的方式之一。你要改變 DOM 樹的層次越深,這一條就越高效(這也有助於將表現和邏輯分開)。
盡可能的只對 position 為 absolute 或 fix 的元素做動畫。
當滾動時禁用一些復雜的:hover動畫是一個很好的主意(例如,給 body 標簽加一個 no-hover 的 class)關於這個主題的文章。
想了解更多的細節,可以看一下這些文章:
1. How browsers work
2. Rendering: repaint, reflow/relayout, restyle
希望這篇文章能夠對你有所幫助!
原文鏈接:frontendbabel翻譯:伯樂在線-Moejser
譯文鏈接:http://blog.jobbole.com/72692/
⑵ 為什麼今年畢業,大三就從事web前端工作,大四一年就正式工作,現在辭職了,還不好找工作,一看是應屆
我才畢業找工作,也是被拒絕過,不過後來發現被拒絕的大部分真的是我不太合適,只是當時自己失望。假如有能力,會找到合適的。不過現在是淡季。 來自職Q用戶:匿名用戶
自己有能力終有伯樂能識君 來自職Q用戶:劉先生
⑶ web前端怎麼自學,有什麼好的網站,或者資料推薦嗎
隨著Web前端的風行於世,有許多小夥伴加入了前端開發行業,但是有很多小夥伴想學Web前端很久了
首先,Web工程師要入門必須要了解前端、後端、後台的基本概念,同時要了解基本的html、css和javascript語法,最後根據設計師的設計圖在不考慮兼容性的情況下把頁面做出來。
其次,你可以把html、css和javascript分成三個階段進行學習。
第一階段:HTML的學習
Html是超文本標記語言,英文全稱為HyperText Mark-up Language,這是一個網頁的骨架。靜態網頁還是動態網頁,最終返回到瀏覽器端的都是HTML代碼,瀏覽器將HTML代碼解釋渲染後呈現給用戶。
當然,學習html過程是比較枯燥乏味的,所以你需要更有效的學習策略。依w3cschool看來,你可以藉助Dreamweaver的「拆分」視圖輔助學習。在「設計」視圖中看效果,在「代碼」視圖中學本質,將各種視圖的優勢發揮到極致,想必會比單純記憶HTML標簽和屬性有趣、有用的多吧?
第二階段:CSS的學習
CSS是英文Cascading Style Sheets的縮寫,叫做層疊樣式表,是能夠真正做到網頁表現與內容分離的一種樣式設計語言。
學習css建議可以看相關的一些書籍,如《CSS權威指南》(很詳細、很經典!)、《CSS揭秘》 《精通CSS:高級Web標准解決方案》,博客和專欄等也可以瀏覽。
第三階段:JavaScript的學習
JavaScript是一種在客戶端廣泛使用的腳步語言,在JavaScript當中為我們提供了一些內置函數、對象和DOM操作,進而實現客戶端的特效、驗證、交互等。
建議可以看《javascript語言精粹》,js是一門很混亂的語言,這本書能夠幫助你區分哪些是語言的精華,哪些是糟粕。如果是精華部分,我們在後續進階部分可以深入研究,而如果是糟粕部分,那麼只要大概看懂別人寫的渣代碼就可以,自己還是不要嘗試為妙。
通過這三個階段的學習,我們就可以往更高級的web前端工程師進階了!
這里給你推薦5個網站供你學習
博客園
一個面向開發者的知識分享社區,一個IT技術人員想為IT技術人員們提供一個純凈的技術交流空間,博客園很長時間只有一個不能再簡單的博客,近四年,博客園僅靠一個人幾年工作的積蓄在維持。
芯晴素材網-網頁特效代碼
是一個集各種網頁素材以及網頁源碼為一體的面向開發人員的一個網頁素材網站,如果你想要學習前端頁面開發,這里,將是一個很好的起點。
jquery中文網
前端所能涉及領域的干貨文章,包括:Jquery、腳本編程、資料庫、伺服器技術、操作系統、建站教程。
菜鳥教程
網站HTML、CSS、Javascript、PHP、C、Python等基礎編程教程,同一個知識點有多篇不同角度的文章可供參考學習,資源免費,會實時更新站內文章。
jquery插件庫
各種前端程序員能用到的插件,喜歡研究新東西的自學者可以在這個網站里挖掘各種小插件。
以上的回答希望對你有所幫助
⑷ 作為前端開發招進公司,兩個月了沒接觸什麼開發工作,公司說是招來儲備
一般應聘都是相互選擇的過程,不只是公司選擇你,你也可以選擇公司。
當你通過公司的選擇後,你就可以問清楚當前所開發的項目及你所處的崗位、職責等,如果一開始就沒講清楚,那隻能怨你自己,如果一開始說明了,而現在卻沒給到相同的待遇,你就可以反映,不行就跳槽吧,就算你是一匹千里馬,也要有好的伯樂!
⑸ 2018年3月8日在網上投的簡歷,到今天,網上投了很多,一點消息都沒有,工作年限2.5年,應聘we
我也在西安,我銷售工作,大都是3000到4000底薪,要的公司倒是不少,不過有的是人海戰術,30歲的我已經搞不了掃大街的活了,正在找個伯樂收了我吧 來自職Q用戶:賀先生
我跟你一樣前端的,現在在西安。工作年限1年,投的簡歷沒人看,我都開始懷疑人生了。考慮要不要換行。 來自職Q用戶:王女士
⑹ 有哪個網站可以自學web前端
我也在W3Cschool學過HTML,總感覺缺了點什麼,然後就去報了培訓班,跟老師說我要學用HTML做出好看的EDM設計,於是老師就讓我照著EDM案例模仿學習,很快我就拿到了網頁設計師的認證,賣給客戶$100一個,很快就賺回了培訓費。這算不算最早期的知識付費,還賺了?
學習需要動力,總是停留在理論層面是沒有價值的,所謂的實操也不是一場考試認證,而是做出商業化項目作品,看客戶是否願意為你付費?正好有一個機會,讓你做屬於自己的3D可視化項目,這里了解一下什麼是3D可視化?就是帶有基礎數據的3D效果圖,根據需求不同進行更多效果開發,天貓雙十一倒數大屏也算一種!
⑺ web前端看哪些書籍好,前端開發書籍大全
1、HTML/HTML5基礎:
《HTML5秘籍》
2、CSS
推薦書籍:
1、《圖靈程序設計叢書:HTML5與CSS3設計模式》
2、《Web開發技術叢書:深入理解Bootstrap》
3、《高流量網站CSS開發技術》
4、《CSS設計徹底研究》 這個一定要
5、《Web開發技術叢書:深入理解Bootstrap》
6、可以找一些專門講SASS的書,但是我沒找到
7、《CSS權威指南(第3版)》
3、深入學習JS
推薦書籍:
1、《單頁Web應用:JavaScript從前端到後端 》
2、《Web 2.0界面設計模式》
3、《響應式Web設計:HTML5和CSS3實戰》
5、工具
學會使用grunt進行JS、CSS、HTML 壓縮,特別是模塊化js開發時候的壓縮
會用PS進行切圖、保存icon
入手sublime、webstorm
學會使用chrome調試面板,特別是:console、network、profile、element
進階:
4、性能
推薦書籍:
1、《Web性能權威指南》
2、雅虎網站頁面性能優化的34條黃金守則
5、HTTP及TCP協議族
推薦書籍:
1、《HTTP權威指南》
2、《TCP/IP詳解》
3、《圖解TCP/IP(第5版)》
請使用手機"掃一掃"x
⑻ 可以通過什麼途徑了解前端研發的最新資訊
我覺得,前端的技術動態主要有以下幾個方向:
1、各種 tips,前端的思考、總結與觀察,新技術的介紹和技術經驗(多類似網站上的專欄,或者是會議上的一個 talk)
2、新玩具的教程,新項目的介紹(最好有 Github 鏈接)
3、新標準的發布與制定動態,各大瀏覽器團隊發布動態
4、知名開發者/團隊博客,或者一些零散的優秀博文
國外有很多很好的資訊網站,
前提, 英語要好!如果英語不好也沒關系,現在很多瀏覽器都帶翻譯功能。
先說說國外
JS-頭條-伯樂在線 :更新速度很一般,質量層次不齊,但不影響伯樂是盛產好的翻譯文章的事實。
最新最熱-極客頭條:時間多的就看看這里吧。
Hacker News : HN很多人都清楚,基本上你的story在上面站幾個小時,就可以陸續幫你帶來上萬流量。但是由於上面各種信息都有,如果只是前端資訊的話,你就得認真分辨了。 好在用戶活躍度極高,可以幫你甄別出信息量大到爆炸的資訊。
這些信息來源質量很多是參差不齊的,不過看多了一般就會有辨別能力了。
不管是什麼東西最好都抱著批判性的思維去看,不要說什麼就信什麼,多一些思考和質疑,被坑的幾率就會低很多。
⑼ Web前端開發比較好的技術類資源網站有哪些
github 程序員的天堂
W3CPlus | css3教程-css3實例-css3動畫
W3CPLUS是一個前端愛好者的家園,W3CPLUS努力打造最優秀的web 前端學習的站點。W3CPLUS力求原創,以一起學習,一起進步,共同分享為原則。W3CPLUS站提供了有關於css,css3,html,html5,jQuery,手機移動端的技術文檔、DEMO、資源,與前端愛好者一起共勉。
W3Help - W3help是由國內多家關注Web標準的公司、團體、標准組織,及科研單位等共同創立的Web標准推廣網站。我們創辦該網站的目的是為了促進Web標准技術在國內業界的應用和推廣,提供跨瀏覽器開發資源,推動國內Web環境與國際標準的接軌,最終實現國內Web的標准化。我們真誠歡迎國內業界同仁一起加入到推廣Web標準的事業中來。
Can I use... Support tables for HTML5, CSS3, etc 查看主流瀏覽器對css、css3等兼容性,很強大。
奇舞周刊 領略前端技術 閱讀奇舞周刊。收集每周前端精華文章,集結成冊,每周五發送給您
碼農周刊 碼農周刊是一份專為程序員打造的IT技術周刊。我們會為你精選一周IT技術干貨,每周三發送,完全免費。