寫了過久的css,歷來沒有總結過,全部有必要總結一下css的代碼優化方式。javascript
第一:在css外聯文件上傳到服務器前,壓縮css文件,可使用網上的一些css壓縮工具。這樣作的好處是,當咱們在css的時候,爲了代碼的可讀性跟可維護性,多出來了不少空格。這樣的話,瀏覽器解析css時候,會多一部分精力來去除這些空格,形成時間上的浪費,因此有必要用壓縮工具把這些空格去掉,最小化css文件。css
第二:使用簡寫方式。若是要同時改變字體大小,行高,粗體。各自的屬性有,font-size,font-weight,line-height.咱們可能爲每一個屬性去賦值,可是咱們能夠這樣作html
font:bold 12px/20px "微軟雅黑";這樣寫是最好,由於大大的減小了代碼量。一樣有margin、padding、border、background等...java
第三:儘可能使用css外聯文件,少使用內聯和內嵌樣式。若是使用內聯樣式的話,一方面有相一樣式的標籤都要加等量代碼的樣式,另一方面權重比較大,外聯樣式要覆蓋的話須要在屬性後面加important。內嵌樣式的話,我以爲對性能沒有什麼大礙,主要提到外聯文件裏是由於便於維護,若是有須要修改的地方,能夠去分類好的相應樣式表裏面修改,沒必要要總是在html文件裏面修改,另外多是由於html文件是最早加載的,提出去html代碼量減小了。(值得注意的是:不要把帶有style的內嵌樣式加在body標籤中,由於這樣的話style會被解析兩次,第一次是在構建dom時,第二次是渲染樣式時)。css3
第四:少使用hack。從網上看到,爲了避免同的瀏覽器寫不一樣的樣式,會添加更多的代碼量,讓css文件變得更加冗餘。有更好的解決方法就是,使用條件註釋方式,如:git
<!–[if IE 8]>
<link rel=」stylesheet」 type=」text/css」 href=」ie8.css」>
<![endif]–>
複製代碼
這樣寫的話,若是打開的瀏覽器不是ie或者不是ie8,由於不是識別註釋條件,因此會忽略這段代碼,從而不加載ie8.css。這樣就能夠正對ie8寫專屬代碼了。不過對於ie8來講,它須要犧牲的就是多了一個http請求。github
第五:使用雪碧圖。這個優化其實屬於圖片的優化,可是它也更css有關,把不少小圖標合併到一張圖片裏面,這樣減小了不少http請求,而後經過css來控制這張雪碧圖的哪一個座標定位在頁面上本身想要的位置。不過使用的是小圖標,也即頁面中裝飾的圖片。web
第六:css文件中代碼多註釋。爲了可讀性,可維護性,更之後能看的懂文件的組織邏輯,就要在代碼中多註釋。面試
第七:class跟id的合理使用。important > 內聯 > ID > 類 > 標籤 | 僞類 | 屬性選擇 > 僞對象 > 繼承,class的權重爲10,id的權重爲100,因此想要用class覆蓋id的話須要寫10個,並且還要放在id選擇器下面。當有共一樣式佈局的標籤時,儘量使用class,當要標誌一個標籤的獨一無二的時候,使用id。express
第八: 避免使用 expression 和 behavior。在頁面渲染的過程當中, expression 和 behavior 須要大量的計算,會大量地耗費客戶端資源。因此不到無可奈何,請不要使用 expression 和 behavior 。能夠式javascript代替處理相應的問題。
關於CSS重排和重繪的概念,最近看到很多這方面的文章,以爲挺有用,在製做中考慮瀏覽器的性能,減小重排可以節省瀏覽器對其子元素及父類元素的從新渲染;避免過度的重繪也能節省瀏覽器性能;優化動畫,使用3D啓用GPU硬件加速;慎重選擇高消耗的樣式,如box-shadow、border-radius、transform、css filters等。
瀏覽器渲染展現網頁的過程,大體分爲如下幾個步驟:
1.解析HTML(HTML Parser) 2.構建DOM樹(DOM Tree) 3.渲染樹構建(Render Tree) 4.繪製渲染樹(Painting)
什麼 CSS 屬性是高消耗的?就是那些繪製前須要瀏覽器進行大量計算的屬性。
瀏覽器爲了從新渲染部分或整個頁面,從新計算頁面元素位置和幾何結構的進程叫作reflow.
通俗點說就是當開發人員定義好了樣式後(也包括瀏覽器的默認樣式),瀏覽器根據這些來計算並根據結果將元素放到它應該出現的位置上,這個過程叫作reflow.
因爲reflow是一種瀏覽器中的用戶攔截操做,因此咱們瞭解如何減小reflow次數,及DOM的層級,css效率對refolw次數的影響是十分有必要的。
reflow(迴流)是致使DOM腳本執行效率低的關鍵因素之一,頁面上任何一個節點觸發了reflow,會致使它的子節點及祖先節點從新渲染。
簡單解釋一下 Reflow:當元素改變的時候,將會影響文檔內容或結構,或元素位置,此過程稱爲 Reflow。
<body>
<div class="hello">
<h4>hello</h4>
<p><strong>Name:</strong>BDing</p>
<h5>male</h5>
<ol>
<li>coding</li>
<li>loving</li>
</ol>
</div>
</body>
複製代碼
當p節點上發生reflow時,hello和body也會從新渲染,甚至h5和ol都會收到影響。
常見的重排元素 | |||
---|---|---|---|
width | height | padding | margin |
display | border-width | border | top |
position | font-size | float | text-align |
overflow-y | font-weight | overflow | left |
font-family | line-height | vertical-align | right |
clear | white-space | bottom | min-height |
repaint是在一個元素的外觀被改變,但沒有改變佈局的狀況下發生的,如改變了visibility、outline、background等。當repaint發生時,瀏覽器會驗證DOM樹上全部其餘節點的visibility屬性。
通俗來講,就是當各類盒子的位置、大小以及其餘屬性,例如顏色、字體都肯定下來後,瀏覽器便把這些元素都按照各自的特性繪製一遍,因而頁面的內容出現了,這個過程叫作repaint
當元素改變的時候,將不會影響元素在頁面當中的位置(好比 background-color, border-color, visibility),瀏覽器僅僅會應用新的樣式重繪此元素,此過程稱爲 Repaint。
常見的重繪元素 | |||
---|---|---|---|
color | border-style | visibility | background |
text-decoration | background-image | background-position | background-repeat |
outline-color | outline | outline-style | border-radius |
outline-width | box-shadow | background-size |
css3 動畫是優化的重中之重。除了作到上面兩點,減小 Reflow 和 Repaints 以外,還須要注意如下方面。
啓用 GPU 硬件加速
GPU(Graphics Processing Unit) 是圖像處理器。GPU 硬件加速是指應用 GPU 的圖形性能對瀏覽器中的一些圖形操做交給 GPU 來完成,由於 GPU 是專門爲處理圖形而設計,因此它在速度和能耗上更有效率。 GPU 加速能夠不只應用於3D,並且也能夠應用於2D。這裏, GPU 加速一般包括如下幾個部分:Canvas2D,佈局合成(Layout Compositing), CSS3轉換(transitions),CSS3 3D變換(transforms),WebGL和視頻(video)。
/*
* 根據上面的結論
* 將 2d transform 換成 3d
* 就能夠強制開啓 GPU 加速
* 提升動畫性能
*/
div {
transform: translate(10px, 10px);
}
div {
transform: translate3d(10px, 10px, 0);
}
複製代碼
須要注意的是,開啓硬件加速相應的也會有額外的開銷,參見這篇文章 CSS 硬件加速的好與壞
CSS的盒模型是CSS的基礎,同時也是難點,這個問題常常在面試中會被問到,屬於經典問題了。不少博客裏講得也很模糊不清,因而,我在這裏從新整理一下。
能夠認爲每一個html標籤都是一個方塊,而後這個方塊又包着幾個小方塊,如同盒子一層層的包裹着,這就是所謂的盒模型。
盒模型分爲IE盒模型和W3C標準盒模型。 IE盒模型和W3C標準盒模型的區別是什麼?
屬性width,height只包含內容content,不包含border和padding。
屬性width,height包含border和padding,指的是content+padding+border。
在ie8+瀏覽器中使用哪一個盒模型能夠由box-sizing(CSS新增的屬性)控制,默認值爲content-box,即標準盒模型;若是將box-sizing設爲border-box則用的是IE盒模型。若是在ie6,7,8中DOCTYPE缺失會觸發IE模式。在當前W3C標準中盒模型是能夠經過box-sizing自由的進行切換的。
content-box(標準盒模型)
width = 內容的寬度
height = 內容的高度
複製代碼
border-box(IE盒模型)
width = border + padding + 內容的寬度
height = border + padding + 內容的高度
複製代碼
谷歌瀏覽器,按下F12,而後把右邊欄的滾動條拉到最下面你就會看到一個東西:
資料來源: