CSS 優(yōu)化、提高性能的方法 匯總

NO1:鏈接:來源:知乎

CSS 優(yōu)化主要是四個方面:

  1. 加載性能
    這個方面相關(guān)的 best practice 太多了,網(wǎng)上隨便找一找就是一堆資料,比如不要用 import 啊,壓縮啊等等,主要是從減少文件體積、減少阻塞加載、提高并發(fā)方面入手的,任何 hint 都逃不出這幾個大方向。
  2. 選擇器性能
    可以參考 GitHub 的這個分享 https://speakerdeck.com/jonrohan/githubs-css-performance,但 selector 的對整體性能的影響可以忽略不計了,selector 的考察更多是規(guī)范化和可維護性、健壯性方面,很少有人在實際工作當中會把選擇器性能作為重點關(guān)注對象的,但也像 GitHub 這個分享里面說的一樣——知道總比不知道好。
  3. 渲染性能
    渲染性能是 CSS 優(yōu)化最重要的關(guān)注對象。頁面渲染 junky 過多?看看是不是大量使用了 text-shadow?是不是開了字體抗鋸齒?CSS 動畫怎么實現(xiàn)的?合理利用 GPU 加速了嗎?什么你用了 Flexible Box Model?有沒有測試換個 layout 策略對 render performance 的影響?這個方面搜索一下 CSS render performance 或者 CSS animation performance 也會有一堆一堆的資料可供參考。
  4. 可維護性、健壯性
    命名合理嗎?結(jié)構(gòu)層次設計是否足夠健壯?對樣式進行抽象復用了嗎?優(yōu)雅的 CSS 不僅僅會影響后期的維護成本,也會對加載性能等方面產(chǎn)生影響。這方面可以多找一些 OOCSS(不是說就要用 OOCSS,而是說多了解一下)等等不同 CSS Strategy 的信息,取長補短。

NO2:鏈接:

【CSS代碼重構(gòu)與優(yōu)化之路】

寫CSS的同學們往往會體會到,隨著項目規(guī)模的增加,項目中的CSS代碼也會越來越多,如果沒有及時對CSS代碼進行維護,CSS代碼不斷會越來越多。CSS代碼交錯復雜,像一張龐大的蜘蛛網(wǎng)分布在網(wǎng)站的各個位置,你不知道修改這行代碼會有什么影響,所以如果有修改或增加新功能時,開發(fā)人員往往不敢去刪除舊的冗余代碼,而保險地增加新代碼,最終壞處就是項目中的CSS會越來越多,最終陷入無底洞。

CSS代碼重構(gòu)的目的

我們寫CSS代碼時,不僅僅只是完成頁面設計的效果,還應該讓CSS代碼易于管理,維護。我們對CSS代碼重構(gòu)主要有兩個目的:

1、提高代碼性能

2、提高代碼的可維護性

提高代碼性能

提高CSS代碼性能主要有兩個點:

1、提高頁面的加載性能

提高頁面的加載性能,簡單說就是減小CSS文件的大小,提高頁面的加載速度,盡可以的利用http緩存

2、提高CSS代碼性能

不同的CSS代碼,瀏覽器對其解析的速度也是不一樣的,如何提高瀏覽器解析CSS代碼的速度也是我們要考慮的

提高代碼的可維護性

提高CSS代碼可維護性主要是體現(xiàn)在下面幾點:

1、可重用性

一般來說,一個項目的整體設計風格是一致的,頁面中肯定有幾個風格一致但有些許不同的模塊,如何在盡可能多地重用CSS代碼,盡可能少地增加新代碼,這是CSS代碼中非常重要的一點。如果CSS代碼的重用性高,我們可能只需要寫一些不一樣的地方,對頁面性能和可維護性、提高開發(fā)效率都有很大的幫助。

2、可擴展性

如果產(chǎn)品增加了某個功能,我們應該保證新增加的CSS代碼不會影響到舊的CSS代碼和頁面,并且盡可能少地增加新代碼而重用舊代碼。

3、可修改性

如果某個模塊產(chǎn)品經(jīng)理覺得要修改樣式,或者要刪掉它,如果沒有規(guī)劃好相應的CSS代碼,過了一段時間之后,開發(fā)人員可能已經(jīng)不記得這段代碼作用了幾個地方,不敢修改或刪除它,這樣下去CSS代碼也就越來越多,影響了頁面的性能,還造成了代碼的復雜度。

CSS代碼重構(gòu)的基本方法

前面說到CSS代碼重構(gòu)的目的,現(xiàn)在來說一些如何達到這些目的的基本方法,這些方法都是易于理解,容易實施的一些手段,大家平時可能也不知不覺地在使用它。

提高CSS性能的手段

首先說說如何提高CSS性能,根據(jù)頁面的加載性能和CSS代碼性能,主要總結(jié)有下面幾點:

1、盡量將樣式寫在單獨的css文件里面,在head元素中引用

有時候為了圖方便或者快速搞定功能,我們可能會直接將樣式寫在頁面的style標簽或者直接內(nèi)聯(lián)在元素上,這樣雖然簡單方便,但是非常不利于日后的維護。將代碼寫成單獨的css文件有幾點好處:

(1)內(nèi)容和樣式分離,易于管理和維護

(2)減少頁面體積

(3)css文件可以被緩存、重用,維護成本降低

2、不使用@import

這條手段已經(jīng)是眾所周知,這里簡單提一下,@import影響css文件的加載速度

3、避免使用復雜的選擇器,層級越少越好

有時候項目的模塊越來越多,功能越來越復雜,我們寫的CSS選擇器會內(nèi)套多層,越來越復雜。

建議選擇器的嵌套最好不要超過三層,比如:

.header .logo .text{}

可以優(yōu)化成

.haeder .logo-text{}

簡潔的選擇器不僅可以減少css文件大小,提高頁面的加載性能,瀏覽器解析時也會更加高效,也會提高開發(fā)人員的開發(fā)效率,降低了維護成本。

4、精簡頁面的樣式文件,去掉不用的樣式

很多時候,我們會把所有的樣式文件合并成一個文件,但是這樣有一個問題:很多其他頁面的CSS同時引用到當前頁面中,而當前頁面并沒有用到它們,這種情況會造成兩個問題:

(1)樣式文件偏大,影響加載速度

(2)瀏覽器會進行多余的樣式匹配,影響渲染時間。

正確的處理方法是根據(jù)當前頁面需要的css去合并那些當前頁面用到的CSS文件。

PS:合并成一個文件有一個優(yōu)點:樣式文件會被瀏覽器緩存,進入到其他頁面樣式文件不用再去下載。這條規(guī)則應根據(jù)場景來區(qū)別對待,如果是大項目,應該合并成不同的樣式文件,如果是簡單的項目,建議合并成一個文件即可。如果無法確認項目規(guī)模,建議分開成不同的樣式文件,日后要合并也比較方便。

5、利用CSS繼承減少代碼量

我們知道有一部分CSS代碼是可以繼承的,如果父元素已經(jīng)設置了該樣式,子元素就不需要去設置該樣式,這個也是提高性能的行之有效的方法。

常見的可以繼承的屬性比如:

color,font-size,font-family等等

不可繼承的比如:

position,display,float等

提高可維護性的方法

提高CSS代碼的可維護性,簡單說就是要讓開發(fā)人員易于理解CSS代碼,容易去修改它,不會破壞原有功能。下面說說一些常用手段。

1、命名與備注

命名是提高代碼可讀性的第一步,也是及其重要的一步。很多人都有這樣的體會:命名是寫代碼中最讓程序員頭疼的事情之一,尤其是對母語非英語的開發(fā)人員來說,要找一個合適貼切的名字并不容易。提高自己命名的能力,可以多看看別人的代碼。下面是CSS中的一些命名相關(guān)的建議:

頭:header

  內(nèi)容:content/container

  尾:footer

  導航:nav

  側(cè)欄:sidebar

  欄目:column

  頁面外圍控制整體佈局寬度:wrapper

  左右中:left right center

  登錄條:loginbar

  標志:logo

  廣告:banner

  頁面主體:main

  熱點:hot

  新聞:news

  下載:download

  子導航:subnav

  菜單:menu

  子菜單:submenu

  搜索:search

  友情鏈接:friendlink

  頁腳:footer

  版權(quán):copyright

  滾動:scroll

  內(nèi)容:content

  標簽:tags

  文章列表:list

  提示信息:msg

  小技巧:tips

  欄目標題:title

  加入:joinus

  指南:guide

  服務:service

  注冊:regsiter

  狀態(tài):status

  投票:vote

  合作伙伴:partner

  導航:nav

  主導航:mainnav

  子導航:subnav

  頂導航:topnav

  邊導航:sidebar

  左導航:leftsidebar

  右導航:rightsidebar

  菜單:menu

  子菜單:submenu

  標題: title

  摘要: summary

2、提取重復樣式

這一個方法很容易理解,簡單說就是提取相同的樣式成為一個單獨的類再引用,這樣不僅可以精簡CSS文件大小,而且CSS代碼變少,更易于重用和維護。例如下面的例子:

原來的代碼是這樣:

.about-title{

  margin: 0 auto 6rem; color: #333; text-align: center; letter-spacing: 4px; font-size: 2rem;

  }

  .achieve-title{

  margin: 0 auto 6rem; color: #fff; text-align: center; letter-spacing: 4px; font-size: 2rem;

  }

這兩個樣式的區(qū)別在于文字顏色的不同,我們可以將其公共的樣式提取出來,然后再分別設置其不同的樣式

.column-title{

  margin: 0 auto 6rem; text-align: center; letter-spacing: 4px; font-size: 2rem;

  }

  .about{

  color: #333;

  }

  .achieve{

  color:#fff;

  }

提取公用的部分,然后在頁面上分別引用column-title和about等,這樣代碼更簡潔,維護起來也更方便了。這個例子非常簡單,實際上項目中可能有更復雜的情況,總之就要要盡可能的DRY,盡可能的提取重復的東西。

3、書寫順序

這個書寫順序指的是各個樣式的書寫順序,下面是推薦的CSS書寫順序

(1)位置屬性(position, top, right, z-index, display, float等)

  (2)大小(width, height, padding, margin)

  (3)文字系列(font, line-height, letter-spacing, color- text-align等)

  (4)背景(background, border等)

  (5)其他(animation, transition等)

書寫順序不一定非得按照上面的推薦來進行,而是根據(jù)你自己的習慣,但是最好能保證前后的習慣一致的,或者團隊應該有一個共同的代碼規(guī)范去遵守,這樣后期維護起來也會方便許多。

以上是我個人總結(jié)的一些簡單的寫好和重構(gòu)CSS代碼的方法,大家當然不必拘泥于此,有不同的意見和建議歡迎進行交流!

CSS方法論

什么是CSS方法論呢?簡單地說就是一些同行為了提高CSS可維護性、提出的一些編寫CSS代碼的規(guī)范和方法。他們提出了一些概念,這些概念可能聽起來很高大上,但是實際你平時可能不知不覺也會用到這些所謂的CSS方法論。下面我簡單地介紹下幾個比較常見的CSS方法論。

###OOCSS

OOCSS是(Object Oriented CSS),顧名思義就是面向?qū)ο蟮腃SS。

OOCSS主要有兩個原則:

1、結(jié)構(gòu)和樣式分離

我們平時一定遇到過這種情況,比如一個頁面存在著多個不同功能的按鈕,這些按鈕的形狀大小都差不多,但是根據(jù)不同的功能會有不同的顏色或背景來加以區(qū)分。如果不進行結(jié)構(gòu)和樣式分離,我們的CSS代碼可能是這樣的

 .btn-primary{

  width:100px;

  height:50px;

  padding:5px 3px;

  background:#ccc;

  color:#000;

  }

  .btn-delete{

  width:100px;

  height:50px;

  padding:5px 3px;

  background:red;

  color:#fff;

  }

這兩個或者可能更多的按鈕擁有一些不同的樣式,但是它們同時擁有相同的大小樣式等,我們將其抽象的部分提取出來,結(jié)果如下:

 .btn{

  width:100px;

  height:50px;

  padding:5px 3px;

  }

  .primary{

  background:red;

  color:#fff;

  }

  .delete{

  background:red;

  color:#fff;

  }

這樣提取公用的樣式出來,然后按鈕同時引用btn和primary等。這種做法除了減少重復的代碼精簡CSS之外,還有一個好處是復用性,如果需要增加其他額外的按鈕,只需要編寫不同的樣式,和btn配合使用即可。

(2)容器和內(nèi)容分離

我們平時寫代碼一定寫過這樣代碼

.content h3{

  font-size:20px;

  color:#333;

  }

這樣的代碼就是內(nèi)容依賴于容器,沒有分離的代碼,也就是說h3的樣式依賴于.content容器,如果其他地方要用到相同的樣式,但是它的容器卻不是.content,那你可能就是要再寫一遍.something h3。

所以OOCSS推薦分離容器和內(nèi)容,可以修改成:

 .title{

  font-size:20px;

  color:#333;

  }

關(guān)于這一點,我個人建議要分情況來看,像前面這個例子,它適合樣式和容器分離。但是比如下面這種情況:

 .menu li{

  font-size:12px;

  }

這種ul,li列表的樣式,我覺的就按照我們原先的做法就可以,不一定非得給一個類給li來設定樣式,即

.menu-item{

  font-size:12px;

  }

這樣頁面的li標簽需要引用menu-item類。

當然采用哪一種方式更好我也不卻確定,我自己比較喜歡.menu li的寫法,大家自行思考。

這就是OOCSS的兩個基本原則,這里只是簡單介紹OOCSS,各位如果有興趣的話請自行Google查找相關(guān)資料。

SMACSS

SMACSS是什么呢,它的全稱是Scalable and Modular Architecture forCSS。簡單說就是可擴展和模塊化的CSS架構(gòu)。

SMACSS將樣式分成5種類型:Base,Layout,Module,State,Theme,我們簡單來說說每一種類型分別指什么。

1、Base

基礎樣式表,定義了基本的樣式,我們平時寫CSS比如reset.css就是屬于基礎樣式表,另外我認為清除浮動,一些動畫也可以歸類為基礎樣式。

2、Layout

布局樣式,用于實現(xiàn)網(wǎng)頁的基本布局,搭起整個網(wǎng)頁的基本骨架。

3、Module

網(wǎng)頁中不同的區(qū)域有這個不同的功能,這些功能是相對獨立的,我們可以稱其為模塊。模塊是獨立的,可重用的組件,它們不依賴于布局組件,可以安全的刪除修改而不影響其他模塊。

4、State

狀態(tài)樣式,通常和js一起配合使用,表示某個組件或功能不同的狀態(tài),比如菜單選中狀態(tài),按鈕不可用狀態(tài)等。

關(guān)于狀態(tài)樣式,我個人覺得要分情況進行討論:

(1)不同組件的同一狀態(tài)的樣式是一樣的,比如頭部的導航菜單的選中狀態(tài)樣式和側(cè)欄的菜單選中狀態(tài)樣式是一樣的,我認為這部分狀態(tài)樣式可以歸類為State

(2)不同組件的統(tǒng)一狀態(tài)的樣式是不一樣的,即兩個地方的菜單雖然都是選中狀態(tài),但是他們卻又不同的選中樣式,這部分樣式不應該被認為是State類型,而是應該放在其組件對應的Module中。

5、Theme

皮膚樣式,對于可更換皮膚的站點來說,這個是很有必要的,分離了結(jié)構(gòu)和皮膚,根據(jù)不同的皮膚應用不同的樣式文件。

BEM

BEM是Block,Element,Modifier的縮寫。下面分別來介紹一下這三個概念:

(1)Block:在BEM的理論中,一個網(wǎng)頁是由block組成的,比如頭部是個block,內(nèi)容是block,logo也是block,一個block可能由幾個子block組成。

(2)Element:element是block的一部分,具有某種功能,element依賴于block,比如在logo中,img是logo的一個element,在菜單中,菜單項是菜單的一個element

(3)Modifier:modifier是用來修飾block或者element的,它表示block或者element在外觀或行為上的改變

我們通過BEM命名法寫樣式如下:

        .block{}

  .block-element{}

  .block-modifier{}

  .block-element-modifier{}

BEM將頁面解析為block和element,然后根據(jù)不同的狀態(tài)使用modifier來設置樣式。

我對BEM的思想理解可能不到位,對BEM的看法主要是由兩點:

(1)頁面CSS模塊化,每個block就是一個模塊,模塊間相互獨立

(2)多級的class命名,避免選擇器的嵌套結(jié)構(gòu)

關(guān)于CSS方法論

上面提到的這些CSS方法論,大家看了就會發(fā)現(xiàn),它們其實有很多思想是相同的,比如:

1、選擇器的嵌套的優(yōu)化

2、CSS代碼模塊化

3、抽象CSS代碼

這些方法論,我們學習的時候,最重要的是去理解其思想,不一定非得照搬它的實現(xiàn)形式,多種方法結(jié)合使用。

總結(jié)

談了這么多,下面來說說我自己總結(jié)的寫CSS代碼的一些關(guān)鍵點。

1、寫代碼之前:從PSD文件出發(fā)

當我們拿到設計師給的PSD時,首先不要急于寫CSS代碼,首先對整個頁面進行分析,主要關(guān)注點是下面幾個:

(1)頁面分成了幾個模塊,哪些模塊是公用的,常見的比如頭部和底部,還有一些菜單欄等等

(2)分析每一個模塊都有什么樣式,提取出公用的樣式,注意公用樣式是全局公用(整個頁面公用)還是局部公用(模塊內(nèi)公用),公用樣式包括公用的狀態(tài)樣式,比如公用的選中狀態(tài),禁用狀態(tài)等等。

2、開始寫代碼

根據(jù)對PSD文件的分析,我們就可以開始著手寫代碼,我比較推薦SMACSS將樣式分成不同類型的做法:

(1)第一步是搭好頁面的骨架,也就是base樣式,layout樣式。

(2)第二步就是依次實現(xiàn)不同的模塊,在這里我推薦BEM的命名思想,但是可以嵌套一到兩層的選擇器結(jié)構(gòu)

3、優(yōu)化代碼

我相信當我們完成基本的頁面效果后,還是會存在著一些重復的或者不夠簡潔的代碼,這時候就是要去優(yōu)化這些代碼,主要是在提取重復代碼,盡可能地精簡代碼。

NO3:鏈接:

css性能優(yōu)化的地方很多,結(jié)合以上幾位大神的回答,總結(jié)如下:
1.慎重使用高性能屬性:浮動、定位;
2.盡量減少頁面重排、重繪
重排按照css的書寫順序:
位置:positon、top、left、z-index、float、dispay
大?。簑idth、height、margin、padding
文字系列: font、line-height、color、letter-spacing
背景邊框:background、 border
其它:anmation、transition
重繪:border、outline、background、box-shadow,能使用background-color,就盡量不要使用background;
3.去除空規(guī)則:{};
4.屬性值為0時,不加單位;
5.屬性值為浮動小數(shù)0.**,可以省略小數(shù)點之前的0;
6.標準化各種瀏覽器前綴:帶瀏覽器前綴的在前。標準屬性在后;
7.不使用@import前綴,它會影響css的加載速度;
8.充分利用css繼承屬性,減少代碼量;
9.抽象提取公共樣式,減少代碼量;
10.選擇器優(yōu)化嵌套,盡量避免層級過深;
11.css雪碧圖,同一頁面相近部分的小圖標,方便使用,減少頁面的請求次數(shù),但是同時圖片本身會變大,使用時,優(yōu)劣考慮清楚,再使用;
12.將css文件放在頁面最上面

.....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:狼狼的藍胖子原文地址:http://luopq.com/2016/01/05/css-optimize/ 寫...
    IT程序獅閱讀 1,849評論 2 51
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 14,206評論 1 92
  • 1.前言 之前寫過 JS 的寫作建議和技巧,那么今天就來聊聊 CSS 吧! 說到 CSS,每一個網(wǎng)頁都離不開 CS...
    美洋洋_4f15閱讀 433評論 0 2
  • 親愛的燕姿,你好,我喜歡了你12年,聽了你所有的歌,買了唱片,看了演唱會,這么多年過去,從學生變成了上班族,好多事...
    左岸的流年是美少女閱讀 838評論 1 3
  • 臨睡了 該道一聲:晚安! 這個時候 總會驚覺 原來 沒有人在等著我的問安 仍然道一聲:晚安! 給自己。
    浣秋閱讀 159評論 0 0

友情鏈接更多精彩內(nèi)容