20條書寫 CSS 代碼的建議

`在這篇文章中颤专,我想跟你分享 20 條由CSS
社區(qū)推薦的約定和最佳實(shí)踐孽锥。 有些建議可能比較適合新手概行,而有些則更高級一些,但我希望每個(gè)人都可以在本篇文章中收獲自己不知道的知識儒鹿。


1. 謹(jǐn)慎使用外邊距屬性

與其它的屬性不同化撕,垂直方向上的外邊距相遇時(shí)將會發(fā)生折疊。這意味著如果一個(gè)元素的下邊距遇到了另一個(gè)元素的上邊距约炎,那么二者中較大的一個(gè)將被留下侯谁。下面是一個(gè)簡單的例子。

<div class="square red"></div>
<div class="square blue"></div> 

.square { 
    width: 80px; 
    height: 80px;
 } 
.red { 
    background-color: #F44336; 
    margin-bottom: 40px; 
} 
.blue { 
    background-color: #2196F3; 
    margin-top: 30px;
 }

其實(shí)上述兩個(gè)元素在垂直方向上的距離并不是 70px, 而是 40px墙贱, 藍(lán)色正方形的margin沒有被計(jì)算在內(nèi)热芹。 有很多的方法消除這種默認(rèn)的行為,但最好的方法是只使用一個(gè)方向上的margin屬性惨撇,比如說margin-bottom伊脓。


2. 利用盒子模型布局

盒子模型自然有其存在的理由。floatinline-block當(dāng)然也可以工作魁衙,但它們都是樣式化文檔的基礎(chǔ)工具报腔,而不是整個(gè)網(wǎng)站。從某種意義來說剖淀,Flexbox是為更容易更精確創(chuàng)建我們想要的布局而設(shè)計(jì)的纯蛾。

Flexbox模型提供的一系列屬性給了開發(fā)者更大的靈活性,而且你一旦熟悉了它們纵隔,那創(chuàng)建任何響應(yīng)式布局都是輕而易舉的事翻诉。瀏覽器對Flexbox的支持也已經(jīng)接近完美,所以已經(jīng)沒有什么理由能夠阻止你使用Flexbox了捌刮。

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

3. 執(zhí)行 CSS 重置

盡管這些年來情形已經(jīng)有所好轉(zhuǎn)碰煌,但是各瀏覽器的默認(rèn)行為還是存在很多分歧。解決這個(gè)問題最好的辦法就是使用一個(gè)CSS重置文件為所有元素重新設(shè)置默認(rèn)樣式绅作。這可以讓你在一個(gè)純凈的樣式環(huán)境下工作芦圾,并且在所有瀏覽器中產(chǎn)生相同的結(jié)果。

有很多的庫做這個(gè)工作做的非常不錯(cuò)俄认,比如 normalize.css, minireset, 和 ress个少, 糾正了瀏覽器間的不一致。如果你不想使用庫眯杏,你也可以自己制作一個(gè)簡單的CSS重置稍算,像下面這樣。

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

這可能看上去比較苛刻役拴,但是消除了默認(rèn)的marginpadding我們將更容易的擺放我們的元素糊探,而不用擔(dān)心它會占用額外的空間。`box-sizing: border-box是一個(gè)很受用的屬性河闰,我們將在下面介紹這個(gè)屬性科平。


4. 為所有元素使用 Border-box

許多初學(xué)者不知道box-sizing屬性,但它的確很重要姜性。了解它的最好辦法就是看看它的兩個(gè)可選值瞪慧。

  • content-box(default) - 當(dāng)我們?yōu)樵卦O(shè)置了寬度和高度,但那只是內(nèi)容的尺寸部念。所有的paddingborder都在不包含在內(nèi)容當(dāng)中弃酌,也就是在內(nèi)容的外部氨菇。舉例來說,如果我們有一個(gè)div它的寬度為 100px妓湘,padding為 10px, 那么它的實(shí)際寬度為 120px查蓉。

  • border-box-paddingborder被包含在 寬度和高度當(dāng)中。 如果一個(gè)div的寬度為100px榜贴,而被設(shè)置了box-sizing: border-box豌研, 那么它的寬度將始終是100px, 無論你添加多少paddingborder唬党。

為所有元素設(shè)置border-box將有利于樣式化鹃共,而且你在也不用做乏味的數(shù)學(xué)運(yùn)算了。

5. 圖像作為背景

當(dāng)你為自己的站點(diǎn)添加圖片時(shí)驶拱,尤其是你想做響應(yīng)式設(shè)計(jì)的時(shí)候霜浴,利用一個(gè)div
標(biāo)簽并為其設(shè)置background屬性,而不是使用<img>元素蓝纲。

似乎額外的工作并沒有起到任何作用阴孟,但實(shí)際上這更利于你對圖片設(shè)置樣式,保持它們原有的尺寸或者根據(jù)比例變化驻龟,這需要借助background-size温眉,background-size還有一些其它的屬性缸匪。

<section> 
    <p>Img element</p> 
    <img src="" alt="bicycle"> 
</section> 
<section> 
    <p>Div with background image</p> 
    <div></div> 
</section> 
img { 
    width: 300px; 
    height: 200px; 
} 
div {
    width: 300px; 
    height: 200px; 
    background: url(''); 
    background-position: center center; 
    background-size: cover; 
} 
section{ 
    float: left; 
    margin: 15px; 
}

這種技術(shù)的一個(gè)缺點(diǎn)是你頁面的可訪問性可能略有打擊翁狐,因?yàn)槟愕膱D片不會被屏幕閱讀器和引擎正確抓取。 這個(gè)問題可以被 object-fit 解決凌蔬,但它還不被所有瀏覽器支持露懒。


6. 更好的 Table 邊框

HTML中的table沒什么意思。它們非常古怪砂心,難以設(shè)計(jì)成響應(yīng)式的流码,而且很難與整體風(fēng)格一致冤留。比如說,你想為table和其中的元素添加上邊框,你可能會得到下面的結(jié)果审编。


正如你所見到的,它有很多重復(fù)的邊框而且看起來不是很好乍惊,有一個(gè)非衬璧ⅲ快速且簡單的去除雙邊框的方法,就是將border-collapse: collapse添加到table.

這樣看起來就好多了外永。


7. 更好的注釋方式

CSS可能不是一門編程語言但它的代碼仍然需要被記錄崎脉,所以一些簡單的注釋將會對你的同事或者未來的自己很有幫助!
對于CSS中的一些比較大的模塊伯顶,比如主要模塊或者媒體查詢囚灼,使用風(fēng)格化的注釋并且在其后留下一些空行骆膝。

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

設(shè)計(jì)中的一些細(xì)節(jié)或那些不是特別重要的模塊,可以用單行注釋灶体。

/* Footer Buttons */ 
.footer button { } 

.footer button:hover { }

另外阅签,值得注意的是,CSS中沒有//注釋赃春,所以當(dāng)你需要注釋的時(shí)候你需要使用/* */符號愉择。

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

8. 命名連接

當(dāng)class或者id不止一個(gè)單詞的時(shí)候,需要使用-符號連接织中,CSS對大小寫不敏感锥涕,所以駱駝命名法不是一個(gè)好的選擇。很久以前狭吼,下劃線不被支持所以破折號成為了默認(rèn)約定层坠。

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

9. 不要重復(fù)設(shè)置

CSS的許多屬性值都是從DOM樹中的上一級繼承下來的,因此命名為層疊樣式表刁笙。讓我們以font為例 - 它幾乎總是繼承自父節(jié)點(diǎn)破花,你不需要為頁面中的每一個(gè)元素設(shè)置該屬性。
你只需要為<html>或者<body>設(shè)置font樣式疲吸,然后讓它一級一級流傳下去就可以了座每。 下面是一個(gè)很好的例
子。

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

當(dāng)然摘悴,在任何一個(gè)子元素中你都可以按照自己的需求改變這一樣式峭梳。我要說的就是能使用繼承獲得的屬性就不要再去一一指定了。


10. CSS 動畫與變換

不要通過直接更改元素的寬度和高度去動畫元素蹂喻,或者是更改left/right/top/bottom葱椭。最好的辦法是使用transform()屬性因?yàn)樗峁┝烁訄A滑的過渡效果而且可以讓你的意圖在閱讀代碼時(shí)更加易于理解。下面是一個(gè)例子口四,我們想動畫一個(gè)ball孵运,讓它往右滑動。 不要去改變left的值蔓彩,最好是使用translateX()治笨。

.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. 不要 DIY, 使用庫

CSS社區(qū)非常的龐大而且不斷出現(xiàn)新的庫旷赖。 庫被提供于各種用途,從小片段到完善的框架探膊,用于構(gòu)建響應(yīng)式程序杠愧,而且它們當(dāng)中大部分都是開源的。

所以下次當(dāng)你碰到CSS問題的時(shí)候逞壁,在你想自己動手去解決問題的時(shí)候流济,最好先去Github或者CodePen找找是否已經(jīng)存在可用的解決方案锐锣。


12. 保持選擇器的特指度低

不是所有CSS選擇器都是生而相等的,當(dāng)新手開發(fā)者書寫CSS代碼的時(shí)候通常期望它們寫的選擇器能夠覆蓋之前所有已存在的樣式绳瘟。 但是事情并不總像我們想的那樣雕憔,就像下面這個(gè)例子:

a{ 
    color: #fff; 
    padding: 15px; 
} 
a#blue-btn { 
    background-color: blue; 
} 
a.active { 
    background-color: red; 
}

我們想為所有按鈕添加.active類使其變?yōu)榧t色,但這是不起作用的糖声,因?yàn)榘粹o已經(jīng)被一個(gè)id選擇器設(shè)置了background-color斤彼,而id選擇器具有更高的特指度。它們之間的規(guī)則就像下面這樣:
ID (#id) > Class (.class) > Type (比如header)蘸泻。
特指度是可以堆疊的琉苇,所以a#button.active的特指度是高于a#button的。 使用特指度高的選擇器將使你不斷的使用更高的去覆蓋那些原本存在的選擇器悦施,這將最終導(dǎo)致!important
效果并扇。


13. 不要使用 !important

很認(rèn)真的告訴你,不要使用!important抡诞。 即時(shí)的一個(gè)快速修復(fù)在將來可能導(dǎo)致大量的重寫穷蛹。相反,找出你CSS選擇器不工作的原因昼汗,并且嘗試去修復(fù)它肴熏。
只有在一種情景中使用!important是可以接受的,那就是你想覆蓋那些在HTML中定義的行內(nèi)樣式顷窒。而且書寫行內(nèi)樣式也是一種非常糟糕的方式蛙吏,建議停止使用。


14. 使用 text-transform

HTML中蹋肮,當(dāng)你使用大寫字母的時(shí)候可能是出于某種語義目的出刷,比如說你想強(qiáng)調(diào)一個(gè)單詞的重要性璧疗。

<h3>Employees MUST wear a helmet!</h3>

如果出于某種目的你將一組文本都設(shè)置成大寫坯辩,可以在HTML中正常書寫文本,然后利用CSS轉(zhuǎn)換其大小寫崩侠。 它們看起來都是一樣的漆魔,但是如果不在上下文中,你的內(nèi)容將更有意義却音。

<div class="movie-poster">Star Wars: The Force Awakens</div> 
.movie-poster { text-transform: uppercase;}

這同樣適用于大寫或者小寫的字符串 -text-transform屬性可以將它們處理的很好改抡。


15. Em, Rem 和 Pixel

人們在對元素和文本設(shè)置尺寸應(yīng)該用em系瓢,rem還是px有很多的爭論阿纤。事實(shí)是,這三者都是可行的夷陋,有自己的優(yōu)點(diǎn)和缺點(diǎn)欠拾。

所有的開發(fā)者和項(xiàng)目都是不同的胰锌,所以不應(yīng)該有什么嚴(yán)格的規(guī)則說明什么時(shí)候該用哪一種。下面是一些提示和良好的做法:

  • em- 1em的大小與直接父元素的字體大小有關(guān)藐窄。 通常用于媒體查詢资昧,em對響應(yīng)式設(shè)計(jì)而言是非常棒的 ,但是將每個(gè)元素的em值轉(zhuǎn)換為p的比例是非常難以計(jì)算的荆忍,因?yàn)槟憧赡芤?code>DOM樹上逐級跟蹤元素格带。

  • rem- 以<html>元素中的font-size為基準(zhǔn),rem將比例化頁面中的標(biāo)題和段落變得很容易刹枉。保持<html>中默認(rèn)的font-size并且為其它的元素設(shè)置rem是一種非常棒的方法叽唱。

  • px- 像素是最精確的控制方式,但是在 響應(yīng)式設(shè)計(jì)中它并不友好微宝,因?yàn)樗粫S屏幕大小變化而自動縮放尔觉。它們是可靠的,易于理解的芥吟,并且在值和實(shí)際結(jié)果之間呈現(xiàn)出良好的視覺聯(lián)系侦铜。

下面我要說的是,不要害怕嘗試钟鸵。去使用它們并且找出哪一種是你最喜歡的钉稍。 有時(shí)候emrem很省事,尤其對于響應(yīng)式界面棺耍。


16. 在大項(xiàng)目中使用預(yù)處理器

你可能已經(jīng)聽說過它們了 - Sass, Less, PostCSS, Stylus 贡未。預(yù)處理器是CSS發(fā)展的下一階段。 它們提供的功能諸如變量蒙袍,CSS函數(shù)俊卤,選擇器嵌套以及其它一些非常酷的東西害幅。這使得CSS代碼非常易于管理消恍,尤其在大項(xiàng)目中。

舉個(gè)簡單的例子以现,下面是使用了CSS變量和函數(shù)的Sass代碼片段狠怨。

  $accent-color: #2196F3;
  a { padding: 10px 15px; background-color: $accent-color; }
  a:hover { background-color: darken($accent-color,10%); }

使用CSS預(yù)處理器的唯一缺點(diǎn)是,它們需要編譯成真正的CSS代碼邑遏,但是如果你已經(jīng)決定在你的項(xiàng)目中使用一個(gè)構(gòu)建腳本佣赖,那么這就不再是你應(yīng)該煩惱的問題了。
如果你想了解更多關(guān)于預(yù)處理器的知識记盒,請查看目前最受歡迎的兩個(gè)系統(tǒng)的教程 - SassLess.


17. Autoprefixers

為各個(gè)瀏覽器添加前綴算得上是書寫CSS代碼最惱人的問題了憎蛤。它們不一致,你永遠(yuǎn)無法精確的你需要哪一個(gè)纪吮,而且如果你真的去一個(gè)個(gè)適配并將它們都放到樣式表中俩檬,你會發(fā)現(xiàn)這是一場噩夢栏豺。

感謝上天,有很多工具可以自動的幫你實(shí)現(xiàn)這一過程豆胸,甚至可以讓你指定你需要支持的瀏覽器 :


18. 在項(xiàng)目中使用精簡代碼

為了提高網(wǎng)站或app的頁面加載速度我們需要總是使用精簡代碼 . 代碼的精簡版本會移除掉空白和重復(fù)的部分,這樣會削減文件的大小. 當(dāng)然,這樣的話你的CSS代碼將會變得非常難以閱讀,所以最好總是提供一個(gè).min的精簡版本和一個(gè)常規(guī)的發(fā)展版本.

有很多不同的方法去精簡CSS代碼 :

根據(jù)你的工作流程,你可以選用上述一個(gè)選項(xiàng),但是建議你總是使用某種方式自動執(zhí)行此過程.


19. Can I Use

不同的瀏覽器仍然存在著很多不一致的兼容性問題, 利用 caniuse 或者其它類似的服務(wù)檢測你正在使用的屬性是否被廣泛支持, 是否需要添加前綴, 或者說是否會在某平臺下出現(xiàn)bug.

僅僅檢測是否仍然是不夠的, 你仍然需要測試布局是否會無緣無故的崩潰. 充分了解用戶經(jīng)常使用的瀏覽器也會提供很大的幫助, 因此你可以看到好的支持是非常關(guān)鍵的.


20. Validate

驗(yàn)證CSS代碼可能沒有驗(yàn)證HTML或者JavaScript代碼重要, 但是在一個(gè)CSS驗(yàn)證器上運(yùn)行你的代碼還是有幫助的, 它會提示你是否書寫了錯(cuò)誤或者比較糟糕的代碼, 甚至?xí)o出一些比較中肯的建議幫助你改進(jìn)代碼.
有很多的工具可以完成這一工作.


當(dāng)然,你可以 查看原文

Ending...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奥洼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晚胡,更是在濱河造成了極大的恐慌灵奖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件估盘,死亡現(xiàn)場離奇詭異瓷患,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遣妥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門擅编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箫踩,你說我怎么就攤上這事爱态。” “怎么了境钟?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵锦担,是天一觀的道長。 經(jīng)常有香客問我慨削,道長洞渔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任缚态,我火速辦了婚禮磁椒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玫芦。我一直安慰自己浆熔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布姨俩。 她就那樣靜靜地躺著蘸拔,像睡著了一般师郑。 火紅的嫁衣襯著肌膚如雪环葵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天宝冕,我揣著相機(jī)與錄音张遭,去河邊找鬼。 笑死地梨,一個(gè)胖子當(dāng)著我的面吹牛菊卷,可吹牛的內(nèi)容都是我干的缔恳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洁闰,長吁一口氣:“原來是場噩夢啊……” “哼歉甚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扑眉,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纸泄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腰素,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聘裁,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年弓千,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衡便。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洋访,死狀恐怖镣陕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻政,我是刑警寧澤茁彭,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扶歪,受9級特大地震影響理肺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜善镰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一妹萨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炫欺,春花似錦乎完、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桥状,卻和暖如春帽揪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辅斟。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工转晰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓查邢,卻偏偏與公主長得像蔗崎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扰藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在這篇文章中缓苛,我想跟你分享 20 條由 CSS 社區(qū)推薦的約定和最佳實(shí)踐。 有些建議可能比較適合新手邓深,而有些則更高...
    ghwaphon閱讀 4,124評論 26 72
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案他嫡? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評論 1 92
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font庐完,text-align钢属,li...
    wzhiq896閱讀 1,755評論 0 2
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font门躯,text-align淆党,li...
    love2013閱讀 2,315評論 0 11
  • 今天在安裝office2016 破解版時(shí)發(fā)現(xiàn)安全與隱私?jīng)]有允許任何來源的選項(xiàng)了0.0這應(yīng)該是更新到macOS10....
    簡聞閱讀 1,408評論 0 0