20個編寫現(xiàn)代CSS代碼的建議

1.明白何謂Margin Collapse

不同于其他很多屬性蔽莱,盒模型中垂直方向上的Margin會在相遇時發(fā)生崩塌荸恕,也就是說當某個元素的底部Margin與另一個元素的頂部Margin相鄰時,只有二者中的較大值會被保留下來,可以從下面這個簡單的例子來學習:

.square {
    width: 80px;
    height: 80px;
}

.red {
    background-color: #F44336;
    margin-bottom: 40px;
}

.blue {
    background-color: #2196F3;
    margin-top: 30px;
}

在上述例子中我們會發(fā)現(xiàn),紅色和藍色方塊的外邊距并沒有相加得到70px,而是只有紅色的下外邊距保留了下來椭豫。我們可以使用一些方法來避免這種行為,不過建議來說還是盡量統(tǒng)一使用margin-bottom屬性,這樣就顯得和諧多了捻悯。

2.使用Flexbox進行布局

在傳統(tǒng)的布局中我們習慣使用Floats或者inline-blocks匆赃,不過它們更適合于格式化文檔,而不是整個網(wǎng)站今缚。而Flexbox則是專門的用于進行布局的工具算柳。Flexbox模型允許開發(fā)者使用很多便捷可擴展的屬性來進行布局,估計你一旦用上就舍不得了:

.container {
    display: flex;
    /* Don't forget to add prefixes for Safari */display: -webkit-flex;
}

3.使用CSS Reset

雖然這些年來隨著瀏覽器的迅速發(fā)展與規(guī)范的統(tǒng)一姓言,瀏覽器特性碎片化的情況有所改善瞬项,但是在不同的瀏覽器之間仍然存在著很多的行為差異。而解決這種問題的最好的辦法就是使用某個CSS Reset來為所有的元素設置統(tǒng)一的樣式何荚,保證你能在相對統(tǒng)一干凈的樣式表的基礎上開始工作囱淋。目前流行的Reset庫有 normalize.css, minireset以及 ress ,它們都可以修正很多已知的瀏覽器之間的差異性餐塘。而如果你不打算用某個外在的庫妥衣,那么建議可以使用如下的基本規(guī)則:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

上面的規(guī)則看起來沒啥用,不過如果不同的瀏覽器在默認情況下為你設置了不同的外邊距/內邊距的默認值戒傻,還是會挺麻煩的税手。

4.一切應為Border-box

雖然很多初學者并不了解box-sizing這個屬性,但是它確實相當?shù)闹匾枘伞6詈玫睦斫馑姆绞骄褪强纯此膬煞N取值:

** · *默認值為content-box芦倒,即當我們設置某個元素的heght/width屬性時,僅僅會作用于其內容尺寸不翩。而所有的內邊距與邊都是在其之上的累加兵扬,譬如某個<div>標簽設置為寬100,內邊距為10口蝠,那么最終元素會占用120(100 + 210)的像素器钟。

** · **border-box:內邊距與邊是包含在了width/height之內,譬如設置了width:100px的<div>無論其內邊距或者邊長設置為多少亚皂,其占有的大小都是100px俱箱。

將元素設置為border-box會很方便你進行樣式布局,這樣的話你就可以在父元素設置高寬限制而不擔心子元素的內邊距或者邊打破了這種限制灭必。

5.以背景圖方式使用Images

如果需要在響應式的環(huán)境下展示圖片狞谱,有個簡單的小技巧就是使用該圖片作為某個<div>的背景圖而不是直接使用img標簽〗欤基于這種方式配合上background-size與background-position這兩個屬性跟衅,可以很方便地按比例縮放:

img {
    width: 300px;
    height: 200px;
}

div {
    width: 300px;
    height: 200px;
    background: url('img/1.jpg');
    background-position: center center;
    background-size: cover;
}

section{
    float: left;
    margin: 15px;
}

不過這種方式也是存在缺陷的,譬如你無法設置圖片的懶加載播歼、圖片無法被搜索引擎或者其他類似的工具抓取到伶跷,有個不錯的屬性叫object-fit可以解決這個問題掰读,不過該屬性目前的瀏覽器支持并不是很完善。

6.Better Table Borders

HTML中使用Tables進行布局一直是個很頭疼的問題叭莫,它們使用起來很簡單蹈集,但是無法進行響應式操作,并且也不方便進行全局樣式設置雇初。譬如拢肆,如果你打算為Table的邊與單元的邊添加樣式,可能得到的結果如下:

table {
    width: 600px;
    border: 1px solid #505050;
    margin-bottom: 15px;
    color:#505050;
}

td{
    border: 1px solid #505050;
    padding: 10px;
}

這里存在的問題是出現(xiàn)了很多的重復的邊靖诗,會導致視覺上不協(xié)調的情況郭怪,那么我們可以通過設置border-collapse:collapse來進行處理。

7.注釋格式優(yōu)化

CSS雖然談不上一門編程語言但是其仍然需要添加注釋以保障整體代碼的可讀性刊橘,只要添加些簡單的注釋不僅可以方便你更好地組織整個樣式表還能夠讓你的同事或者未來的自己更好地理解鄙才。對于CSS中整塊的注釋或者使用在Media-Query中的注釋,建議是使用如下形式:

/*--------------- #Header---------------*/
header { }header nav { }
/*--------------- #Slideshow---------------*/
.slideshow { }

而設計的細節(jié)說明或者一些不重要的組件可以用如下單行注釋的方式:

/* Footer Buttons */.footer button { }.footer button:hover { }

同時促绵,不要忘了CSS中是沒有//
這種注釋方式的:

/* Do */
p { 
  padding: 15px; 
  /*border: 1px solid #222;*/
}
/* Don't */
p {
   padding: 15px; 
// border: 1px solid #222; 
}

8.使用Kebab-case命名變量

對于樣式類名或者ID名的命名都需要在多個單詞之間添加-
符號攒庵,CSS本身是大小寫不敏感的因此你是用不了camelCase的,另一方面绞愚,很久之前也不支持下劃線叙甸,所以現(xiàn)在的默認的命名方式就是使用-
:

/* Do */
.footer-column-left { }
/* Don't */
.footerColumnLeft { }
.footer_column_left { }

而涉及到具體的變量命名規(guī)范時,建議是使用BEM規(guī)范位衩,只要遵循一些簡單的原則即可以保證基于組件風格的命名一致性。你也可以參考CSS Tricks來獲得更多的細節(jié)描述熔萧。

9.避免重復代碼

大部分元素的CSS屬性都是從DOM樹根部繼承而來糖驴,這也是其命名為級聯(lián)樣式表的由來。我們以font屬性為例佛致,該屬性往往是繼承自父屬性贮缕,因此我們并不需要再單獨地為元素設置該屬性。我們只需要在html或者body中添加該屬性然后使其層次傳遞下去即可:

html { 
  font: normal 16px/1.4 sans-serif;
}

10.使用transform添加CSS Animations

不建議直接改變元素的width與height屬性或者left/top/bottom/right這些屬性來達到動畫效果俺榆,而應該優(yōu)先使用transform()屬性來提供更平滑的變換效果感昼,并且能使得代碼的可讀性會更好:

.ball { 
  left: 50px; 
  transition: 0.4s ease-out;
}
/* Not Cool*/
.ball.slide-out { 
   left: 500px;
}
/* Cool*/
.ball.slide-out {
   transform: translateX(450px);
}

Transform的幾個屬性translate、rotate罐脊、scale都具有比較好的瀏覽器兼容性可以放心使用定嗓。

11.不要重復造輪子

現(xiàn)在CSS社區(qū)已經非常龐大,并且不斷地有新的各式各樣的庫開源出來萍桌。這些庫可以幫助我們解決從小的代碼片到用于構建完整的響應式應用的全框架宵溅。所以如果下次你再碰到什么CSS問題的時候,在打算擼起袖子自己上之前可以嘗試在GitHUB或者CodePen上搜索可行方案上炎。

12.盡可能使用低優(yōu)先級的選擇器

并不是所有的CSS選擇器的優(yōu)先級都一樣恃逻,很多初學者在使用CSS選擇器的時候都是考慮以新的特性去復寫全部的繼承特性,不過這一點在某個元素多狀態(tài)時就麻煩了,譬如下面這個例子:

a {
    color: #fff;
    padding: 15px;
}

a#blue-btn {
    background-color: blue;
}

a.active {
    background-color: red;
}

我們本來希望將.active類添加到按鈕上然后使其顯示為紅色寇损,不過在上面這個例子中很明顯起不了作用凸郑,因為button已經以ID選擇器設置過了背景色,也就是所謂的Higher Selector Specificity矛市。一般來說线椰,選擇器的優(yōu)先級順序為:ID(#id) > Class(.class) > Type(header)

13.避免使用!important

認真的說,千萬要避免使用!important尘盼,這可能會導致你在未來的開發(fā)中無盡的屬性重寫憨愉,你應該選擇更合適的CSS選擇器。而唯一的可以使用!important
屬性的場景就是當你想去復寫某些行內樣式的時候卿捎,不過行內樣式本身也是需要避免的配紫。

14.使用text-transform屬性設置文本大寫

<div class="movie-poster">Star Wars: The Force Awakens</div>

.movie-poster {
    text-transform: uppercase;
}

15.Em, Rem, 以及 Pixel

已經有很多關于人們應該如何使用em,rem午阵,以及px作為元素尺寸與文本尺寸的討論躺孝,而筆者認為,這三個尺寸單位都有其適用與不適用的地方底桂。不同的開發(fā)與項目都有其特定的設置植袍,因此并沒有通用的規(guī)則來決定應該使用哪個單位,這里是我總結的幾個考慮:
  **· em – 其基本單位即為當前元素的font-size
值籽懦,經常適用于media-queries中于个,em是特別適用于響應式開發(fā)中。
  
· rem – 其是相對于html
屬性的單位暮顺,可以保證文本段落真正的響應式尺寸特性厅篓。
  
· **px – Pixels 并沒有任何的動態(tài)擴展性,它們往往用于描述絕對單位捶码,并且可以在設置值與最終的顯示效果之間保留一定的一致性羽氮。

16.在大型項目中使用預處理器

估計你肯定聽說過 Sass, Less, PostCSS, Stylus這些預處理器與對應的語法。Preprocessors可以允許我們將未來的CSS特性應用在當前的代碼開發(fā)中惫恼,譬如變量支持档押、函數(shù)、嵌套式的選擇器以及很多其他的特性祈纯,這里我們以Sass為例:

$accent-color: #2196F3;

a {
    padding: 10px 15px;
    background-color: $accent-color;
}

a:hover {
    background-color: darken($accent-color,10%);
}

17.使用Autoprefixers來提升瀏覽器兼容性

使用特定的瀏覽器前綴是CSS開發(fā)中常見的工作之一令宿,不同的瀏覽器、不同的屬性對于前綴的要求也不一樣盆繁,這就使得我們無法在編碼過程中記住所有的前綴規(guī)則掀淘。并且在寫樣式代碼的時候還需要加上特定的瀏覽器前綴支持也是個麻煩活,幸虧現(xiàn)在也是有很多工具可以輔助我們進行這樣的開發(fā):
  **· Online tools: Autoprefixer
  
· Text editor plugins: Sublime Text, Atom
  
· **Libraries: Autoprefixer (PostCSS)

18.在生產環(huán)境下使用Minified代碼

為了提升頁面的加載速度油昂,在生產環(huán)境下我們應該默認使用壓縮之后的資源代碼革娄。在壓縮的過程中倾贰,會將所有的空白與重復剔除掉從而減少整個文件的體積大小。當然拦惋,經過壓縮之后的代碼毫無可讀性匆浙,因此在開發(fā)階段我們還是應該使用普通的版本。對于CSS的壓縮有很多的現(xiàn)行工具:
  **· Online tools – CSS Minifier (API included), CSS Compressor
  
· Text editor plugins: Sublime Text, Atom
  
· **Libraries: Minfiy (PHP), CSSO and CSSNano (PostCSS, Grunt, Gulp)

選擇哪個工具肯定是依賴于你自己的工作流啦~

19.多參閱Caniuse

不同的瀏覽器在兼容性上差異很大厕妖,因此如果我們可以針對我們所需要適配的瀏覽器首尼,在caniuse上我們可以查詢某個特性的瀏覽器版本適配性,是否需要添加特定的前綴或者在某個平臺上是否存在Bug等等言秸。不過光光使用caniuse肯定是不夠的软能,我們還需要使用些額外的服務來進行檢測。

20.Validate:校驗

對于CSS的校驗可能不如HTML校驗或者JavaScript校驗那么重要举畸,不過在正式發(fā)布之前用Lint工具校驗一波你的CSS代碼還是很有意義的查排。它會告訴你代碼中潛在的錯誤,提示你一些不符合最佳實踐的代碼以及給你一些提升代碼性能的建議抄沮。就像Minifers與Autoprefixers跋核,也有很多可用的工具:
  **· Online tools: W3 Validator, CSS Lint
  
· Text editor plugins: Sublime Text, Atom
  
· **Libraries: stylelint (Node.js, PostCSS), css-validator (Node.js)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叛买,隨后出現(xiàn)的幾起案子砂代,更是在濱河造成了極大的恐慌,老刑警劉巖率挣,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻伊,死亡現(xiàn)場離奇詭異,居然都是意外死亡难礼,警方通過查閱死者的電腦和手機娃圆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛾茉,“玉大人,你說我怎么就攤上這事撩鹿∏妫” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵节沦,是天一觀的道長键思。 經常有香客問我,道長甫贯,這世上最難降的妖魔是什么吼鳞? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮叫搁,結果婚禮上赔桌,老公的妹妹穿的比我還像新娘供炎。我一直安慰自己,他們只是感情好疾党,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布音诫。 她就那樣靜靜地躺著,像睡著了一般雪位。 火紅的嫁衣襯著肌膚如雪竭钝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天雹洗,我揣著相機與錄音香罐,去河邊找鬼。 笑死时肿,一個胖子當著我的面吹牛庇茫,可吹牛的內容都是我干的。 我是一名探鬼主播嗜侮,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼港令,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锈颗?” 一聲冷哼從身側響起顷霹,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎击吱,沒想到半個月后淋淀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡覆醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年朵纷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片永脓。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡袍辞,死狀恐怖,靈堂內的尸體忽然破棺而出常摧,到底是詐尸還是另有隱情搅吁,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布落午,位于F島的核電站谎懦,受9級特大地震影響,放射性物質發(fā)生泄漏溃斋。R本人自食惡果不足惜界拦,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梗劫。 院中可真熱鬧享甸,春花似錦截碴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓷翻,卻和暖如春聚凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齐帚。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工妒牙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人对妄。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓湘今,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剪菱。 傳聞我的和親對象是個殘疾皇子摩瞎,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容