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

01、明白何謂Margin Collapse
.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屬性,這樣就顯得和諧多了。
02、使用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;}
03、使用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ī)則看起來沒啥用,不過如果不同的瀏覽器在默認情況下為你設置了不同的外邊距/內邊距的默認值,還是會挺麻煩的。
04、一切應為Border-box
雖然很多初學者并不了解box-sizing這個屬性,但是它確實相當?shù)闹匾?。而最好的理解它的方式就是看看它的兩種取值:
默認值為content-box,即當我們設置某個元素的heght/width屬性時,僅僅會作用于其內容尺寸。而所有的內邊距與邊都是在其之上的累加,譬如某個<div>標簽設置為寬100,內邊距為10,那么最終元素會占用120(100 + 2*10)的像素。
border-box:內邊距與邊是包含在了width/height之內,譬如設置了width:100px的<div>無論其內邊距或者邊長設置為多少,其占有的大小都是100px。
將元素設置為border-box會很方便你進行樣式布局,這樣的話你就可以在父元素設置高寬限制而不擔心子元素的內邊距或者邊打破了這種限制。
05、以背景圖方式使用Images
如果需要在響應式的環(huán)境下展示圖片,有個簡單的小技巧就是使用該圖片作為某個<div>的背景圖而不是直接使用img標簽。基于這種方式配合上background-size與background-position這兩個屬性,可以很方便地按比例縮放:
img {width: 300px;height: 200px;}div {width: 300px;height: 200px;background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg');background-position: center center;background-size: cover;}section{float: left;margin: 15px;}
不過這種方式也是存在缺陷的,譬如你無法設置圖片的懶加載、圖片無法被搜索引擎或者其他類似的工具抓取到,有個不錯的屬性叫object-fit可以解決這個問題,不過該屬性目前的瀏覽器支持并不是很完善。
06、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;}
07、注釋格式優(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;}
08、使用Kebab-case命名變量
對于樣式類名或者ID名的命名都需要在多個單詞之間添加-符號,CSS本身是大小寫不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下劃線,所以現(xiàn)在的默認的命名方式就是使用-:
/* Do */.footer-column-left { }/* Don't */.footerColumnLeft { }.footer_column_left { }
而涉及到具體的變量命名規(guī)范時,建議是使用BEM規(guī)范,只要遵循一些簡單的原則即可以保證基于組件風格的命名一致性。你也可以參考CSS Tricks來獲得更多的細節(jié)描述。
09、避免重復代碼
大部分元素的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ū)已經(jīng)非常龐大,并且不斷地有新的各式各樣的庫開源出來。這些庫可以幫助我們解決從小的代碼片到用于構建完整的響應式應用的全框架。所以如果下次你再碰到什么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已經(jīng)以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
已經(jīng)有很多關于人們應該如何使用em,rem,以及px作為元素尺寸與文本尺寸的討論,而筆者認為,這三個尺寸單位都有其適用與不適用的地方。不同的開發(fā)與項目都有其特定的設置,因此并沒有通用的規(guī)則來決定應該使用哪個單位,這里是我總結的幾個考慮:
em – 其基本單位即為當前元素的font-size值,經(jīng)常適用于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來提升瀏覽器兼容性
Online tools: Autoprefixer Text editor plugins: Sublime Text, Atom Libraries: Autoprefixer (PostCSS)
18、在生產(chǎn)環(huán)境下使用Minified代碼
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
20、Validate:校驗

