摘要:如下區(qū)塊標(biāo)題前綴可以讓我們使用命令查找標(biāo)題名時(shí)將搜索范圍限制在區(qū)塊標(biāo)題中。
在參與規(guī)模龐大、歷時(shí)漫長(zhǎng)且參與人數(shù)眾多的項(xiàng)目時(shí),所有開發(fā)者遵守如下規(guī)則極為重要:
保持 CSS 易于維護(hù)
保持代碼清晰易懂
保持 CSS 的可拓展性
為了實(shí)現(xiàn)這一目標(biāo),我們要采用諸多方法。
本文檔第一部分將探討語(yǔ)法、格式以及分析 CSS 結(jié)構(gòu);第二部分將圍繞方法論、思維框架以及編寫與規(guī)劃 CSS 的看法。
CSS 文檔分析無(wú)論編寫什么文檔,我們都應(yīng)當(dāng)維持統(tǒng)一的風(fēng)格,包括統(tǒng)一的注釋、統(tǒng)一的語(yǔ)法與統(tǒng)一的命名規(guī)范。
將行寬控制在 80 字節(jié)以下。漸變(gradient)相關(guān)的語(yǔ)法以及注釋中的 URL 等可以算作例外,畢竟這部分我們也無(wú)能為力。
我傾向于用 4 個(gè)空格而非 Tab 縮進(jìn),并且將聲明拆分成多行。
單一文件與多文件有人喜歡在一份文件文件中編寫所有的內(nèi)容,而我在遷移至 Sass 之后開始將樣式拆分成多個(gè)小文件。這都是很好的做法。無(wú)論你選擇哪種,下文的規(guī)則都將適用,而且如果你遵守這些規(guī)則的話你也不會(huì)遇到什么問題。這兩種寫法的區(qū)別僅僅在于目錄以及區(qū)塊標(biāo)題:
目錄在 CSS 的開頭,我會(huì)維護(hù)一份目錄,就像這樣:
/*------------------------------------* $CONTENTS *------------------------------------*/ /** * CONTENTS............You’re reading it! * RESET...............Set our reset defaults * FONT-FACE...........Import brand font files */
這份目錄可以告訴其他開發(fā)者這個(gè)文件中具體含有哪些內(nèi)容。這份目錄中的每一項(xiàng)都與其對(duì)應(yīng)的區(qū)塊標(biāo)題相同。
如果你在維護(hù)一份單文件 CSS,對(duì)應(yīng)的區(qū)塊將也在同一文件中。如果你是在編寫一組小文件,那么目錄中的每一項(xiàng)應(yīng)當(dāng)對(duì)應(yīng)相應(yīng)的 @include 語(yǔ)句。
區(qū)塊標(biāo)題目錄應(yīng)當(dāng)對(duì)應(yīng)區(qū)塊的標(biāo)題。如下:
/*------------------------------------* $RESET *------------------------------------*/
區(qū)塊標(biāo)題前綴 $ 可以讓我們使用 Cmd|Ctrl + F 命令查找標(biāo)題名時(shí)將搜索范圍限制在區(qū)塊標(biāo)題中。
如果你在維護(hù)一份大文件,那么在區(qū)塊之間空 5 行,如下:
/*------------------------------------* $RESET *------------------------------------*/ [Our reset styles] /*------------------------------------* $FONT-FACE *------------------------------------*/
在大文件中快速翻動(dòng)時(shí)這些大塊的空檔有助于區(qū)分區(qū)塊。
如果你在維護(hù)多份以 include 連接的 CSS 的話,在每份文件頭加上標(biāo)題即可,不必這樣空行。
盡量按照特定順序編寫規(guī)則,這將確保你充分發(fā)揮 CSS 中第一個(gè) C 的意義:cascade,層疊。
一份規(guī)劃良好的 CSS 應(yīng)當(dāng)按照如下排列:
Reset 萬(wàn)物之根源
元素類型 沒有 class 的 h1、ul 等
對(duì)象以及抽象內(nèi)容 最一般、最基礎(chǔ)的設(shè)計(jì)模式
子元素 由對(duì)象延伸出來(lái)的所有拓展及其子元素
修補(bǔ) 針對(duì)異常狀態(tài)
如此一來(lái),當(dāng)你依次編寫 CSS 時(shí),每個(gè)區(qū)塊都可以自動(dòng)繼承在它之前區(qū)塊的屬性。這樣就可以減少代碼相互抵消的部分,減少某些特殊的問題,組成更理想的 CSS 結(jié)構(gòu)。
關(guān)于這方面的更多信息,強(qiáng)烈推薦 Jonathan Snook 的 SMACSS。
[selector]{ [property]:[value]; [<- Declaration ->] } [選擇器]{ [屬性]:[值]; [<- 聲明 ->] }
編寫 CSS 樣式時(shí),我習(xí)慣遵守這些規(guī)則:
class 名稱以連字符(-)連接,除了下文提到的 BEM 命名法;
縮進(jìn) 4 空格;
聲明拆分成多行;
聲明以相關(guān)性順序排列,而非字母順序;
有前綴的聲明適當(dāng)縮進(jìn),從而對(duì)齊其值;
縮進(jìn)樣式集從而反映 DOM;
保留最后一條聲明結(jié)尾的分號(hào)。
例如:
.widget{ padding:10px; border:1px solid #BADA55; background-color:#C0FFEE; -webkit-border-radius:4px; -moz-border-radius:4px; border-radius:4px; } .widget-heading{ font-size:1.5rem; line-height:1; font-weight:bold; color:#BADA55; margin-right:-10px; margin-left: -10px; padding:0.25em; }
我們可以發(fā)現(xiàn),.widget-heading 是 .widget 的子元素,因?yàn)榍罢叩臉邮郊群笳叨嗫s進(jìn)了一級(jí)。這樣通過縮進(jìn)就可以讓開發(fā)者在閱讀代碼時(shí)快速獲取這樣的重要信息。
我們還可以發(fā)現(xiàn) .widget-heading 的聲明是根據(jù)其相關(guān)性排列的:.widget-heading 是行間元素,所以我們先添加字體相關(guān)的樣式聲明,接下來(lái)是其它的。
以下是一個(gè)沒有拆分成多行的例子:
.t10 { width:10% } .t20 { width:20% } .t25 { width:25% } /* 1/4 */ .t30 { width:30% } .t33 { width:33.333% } /* 1/3 */ .t40 { width:40% } .t50 { width:50% } /* 1/2 */ .t60 { width:60% } .t66 { width:66.666% } /* 2/3 */ .t70 { width:70% } .t75 { width:75% } /* 3/4*/ .t80 { width:80% } .t90 { width:90% }
在這個(gè)例子(來(lái)自inuit.css’s table grid system)中,將 CSS 放在一行內(nèi)可以使得代碼更緊湊。
一般情況下我都是以連字符(-)連接 class 的名字(例如 .foo-bar 而非 .foo_bar 或 .fooBar),不過在某些特定的時(shí)候我會(huì)用 BEM(Block, Element, Modifier)命名法。
BEM 命名法可以使得選擇器更規(guī)范,更清晰,更具語(yǔ)義。
該命名法按照如下格式:
.block{} .block__element{} .block--modifier{}
其中:
.block 代表某個(gè)基本的抽象元素;
.block__element 代表構(gòu)成 .block 的一個(gè)子元素;
.block--modifier 代表 .block 的某個(gè)不同狀態(tài)或版本。
打個(gè)比方:
.person{} .person--woman{} .person__hand{} .person__hand--left{} .person__hand--right{}
這個(gè)例子中我們描述的基本元素是一個(gè)人,然后這個(gè)人可能是一個(gè)女人。我們還知道人擁有手,這些是人體的一部分,而手也有不同的狀態(tài),如同左手與右手。
這樣我們就可以根據(jù)親元素來(lái)劃定選擇器的命名空間并傳達(dá)該選擇器的職能,例如根據(jù)這個(gè)選擇器是一個(gè)子元素(__)還是其親元素的不同狀態(tài)(--)。
由此,.page-wrapper 是一個(gè)獨(dú)立的選擇器。這是一個(gè)符合規(guī)范的命名,因?yàn)樗皇瞧渌氐淖釉鼗蚱渌鼱顟B(tài);然而 .widget-heading 則與其它對(duì)象有關(guān)聯(lián),它應(yīng)當(dāng)是 .widget 的子元素,所以我們應(yīng)當(dāng)將其重命名為 .widget__heading。
BEM 命名法雖然不太好看,而且相當(dāng)冗長(zhǎng),但是它使得我們可以通過名稱快速獲知元素的功能和元素之間的關(guān)系。與此同時(shí),BEM 語(yǔ)法中的重復(fù)部分非常有利于 gzip 的壓縮算法。
無(wú)論你是否使用 BEM 命名法,你都應(yīng)當(dāng)確保 class 命名得當(dāng),力保一字不多、一字不少;將元素命名抽象化以提高復(fù)用性(例如 .ui-list,.media)。子元素的命名則要盡量精準(zhǔn)(例如 .user-avatar-link)。不用擔(dān)心 class 名的數(shù)量或長(zhǎng)度,因?yàn)閷懙煤玫拇a gzip 也能有效壓縮。
HTML 中的 class為了確保易讀性,在 HTML 標(biāo)記中用兩個(gè)空格隔開 class 名,例如:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110928.html
摘要:廣義的南向協(xié)議主要分為三種類型。狹義南向協(xié)議原理交換機(jī)交換機(jī)可以分成流表和安全通道兩部分。表表用于計(jì)量和限速,可以針對(duì)流制定對(duì)應(yīng)的限速規(guī)則,從而實(shí)現(xiàn)豐富的功能,注意不是針對(duì)端口的。協(xié)議可以看作是協(xié)議的一種補(bǔ)充。 SDN 什么是SDN SDN是一種框架和思想,核心訴求是通過軟件控制網(wǎng)絡(luò),實(shí)現(xiàn)業(yè)務(wù)的自動(dòng)化部署,為方便軟件來(lái)控制網(wǎng)絡(luò),希望控制面和轉(zhuǎn)發(fā)面是分離的。 例如,傳統(tǒng)的交換機(jī)內(nèi)部,由交...
摘要:國(guó)內(nèi)各大公司都已經(jīng)投入使用,在一些常見的網(wǎng)站,如淘寶騰訊小米等移動(dòng)站點(diǎn),隨處可見其蹤影。變革之騰訊手機(jī)淘寶的設(shè)計(jì)與實(shí)現(xiàn)前端亂燉適配總結(jié)樣式重置上文已提及,這里推薦閱讀同學(xué)寫的專題文章。 前言 CSS代碼難維護(hù)眾所皆知。 為一個(gè)元素設(shè)置樣式的方式可以通過定義的class、定義的id、元素的標(biāo)簽名、元素的屬性等選擇器以及這些選擇器的組合來(lái)實(shí)現(xiàn); 作用于某個(gè)元素上的樣式又可能來(lái)自單個(gè)樣式規(guī)...
摘要:國(guó)內(nèi)各大公司都已經(jīng)投入使用,在一些常見的網(wǎng)站,如淘寶騰訊小米等移動(dòng)站點(diǎn),隨處可見其蹤影。變革之騰訊手機(jī)淘寶的設(shè)計(jì)與實(shí)現(xiàn)前端亂燉適配總結(jié)樣式重置上文已提及,這里推薦閱讀同學(xué)寫的專題文章。 前言 CSS代碼難維護(hù)眾所皆知。 為一個(gè)元素設(shè)置樣式的方式可以通過定義的class、定義的id、元素的標(biāo)簽名、元素的屬性等選擇器以及這些選擇器的組合來(lái)實(shí)現(xiàn); 作用于某個(gè)元素上的樣式又可能來(lái)自單個(gè)樣式規(guī)...
摘要:它通過數(shù)據(jù)模型進(jìn)行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來(lái)進(jìn)行事件處理及與現(xiàn)有的通過接口進(jìn)行交互。 本人兼職前端付費(fèi)技術(shù)顧問,如需幫助請(qǐng)加本人微信hawx1993或QQ345823102,非誠(chéng)勿擾 1.為初學(xué)前端而不知道怎么做項(xiàng)目的你指導(dǎo) 2.指導(dǎo)并扎實(shí)你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見 4.為你的前端之路提供極具建設(shè)性的...
閱讀 3794·2021-09-02 09:53
閱讀 2777·2021-07-30 14:57
閱讀 3518·2019-08-30 13:09
閱讀 1229·2019-08-29 13:25
閱讀 837·2019-08-29 12:28
閱讀 1476·2019-08-29 12:26
閱讀 1159·2019-08-28 17:58
閱讀 3330·2019-08-26 13:28