(譯)單類CSS和多類CSS對(duì)比

原文作者:Jonathan Lehman
原文地址:http://technology.customink.com/blog/2014/09/19/single-class-vs-multi-class-css/

像我之前在有關(guān)模塊化CSS文章中提到的那樣,寫Sass/CSS很困難餐茵。檢查項(xiàng)目里用到的標(biāo)簽,是判斷項(xiàng)目中結(jié)果代碼是否簡潔并且結(jié)構(gòu)良好的最好的方法之一。過度嵌套的元素導(dǎo)致過度嵌套的CSS并且當(dāng)你發(fā)現(xiàn)很難明白類名的意思谍椅,那么CSS本身很可能缺乏語義批狱。隨著我們?cè)诿總€(gè)元素上增加越來越多的類,代碼可讀性越來越差,簡直是雪上加霜。如果我們可以只寫一個(gè)類就能實(shí)現(xiàn)元素需要的所有樣式的話呢?

單類CSS

讓我們?cè)囈辉噯晤惖姆椒ㄆ锶摺榱俗尷雍喢魑覀冑x予一個(gè)按鈕樣式(為了達(dá)到這個(gè)例子的目的我們將使用SUITCSS來讓我們的CSS語義化)。我們假設(shè)有不同類型的按鈕先煎,或者一個(gè)相同按鈕的變形贼涩,讓我們給每個(gè)想要類型的按鈕寫一個(gè)單類。

首先我們構(gòu)建想要生成的HTML模型薯蝎,然后在模型基礎(chǔ)上構(gòu)造CSS遥倦。

    <button class="Btn">Just a Button</button>
    <button class="Btn--disabled">Disabled Button</button>
    <button class="Btn-secondary">Secondary Button</button>
    <button class="Btn-secondary--disabled">Secondary Disabled Button</button>

哇,這讓DOM樹非常簡潔占锯,通過使用SUIT袒哥,我們的類名非常語義化并且易于理解缩筛。

    .Btn {
      background-color: blue;
      border-radius: 5px;
      color: white;
      padding: 0.5rem;
    }
    
    .Btn--disabled {
      background-color: grey;
      border-radius: 5px;
      color: white;
      padding: 0.5rem;
    }
    
    .Btn-secondary {
      background-color: white;
      border-radius: 5px;
      color: blue;
      padding: 0.5rem;
    }
    
    .Btn-secondary--disabled {
      background-color: light-grey;
      border-radius: 5px;
      color: blue;
      padding: 0.5rem;
    }


<a  class="sb-Btn sb-Btn--secondary sb-Btn--responsive">Play with this example in Sassmeister</a>

我們寫的CSS很繁復(fù)。我們可以通過Sass之類的預(yù)處理器進(jìn)行改進(jìn)堡称。

    %Btn-base {
      border-radius: 5px;
      padding: 0.5rem;
    }
    
    @mixin ColoredBtn($color, $background-color) {
      @extend %Btn-base;
      color: $color;
      background-color: $background-color;
    }
    
    .Btn {
      @include ColoredBtn(white, blue);
      // .Btn--disabled
      &--disabled {
        @include ColoredBtn(white, grey);
      }
      // .Btn-secondary
      &-secondary {
        @include ColoredBtn(blue, white);
      }
      // .Btn-secondary--disabled
      &-secondary--disabled {
        @include ColoredBtn(blue, light-grey);
      }
    }


<a  class="sb-Btn sb-Btn--secondary sb-Btn--responsive">Play with this example in Sassmeister</a>

Sass一般比等價(jià)的CSS更加簡潔瞎抛,讓我們更一進(jìn)步評(píng)估這個(gè)單類方法。到現(xiàn)在為止它很吸引人却紧,但是它在不同尋常的例子中表現(xiàn)如何呢桐臊?

你也許已經(jīng)注意到了單類存在的隱患,.Btn-secondary--disabled啄寡。一開始也許你很滿意,甚至覺得可以如此簡單得通過Sass構(gòu)建樣式便于打包使用單類的想法非常聰明哩照。潛在的問題是如果我們有更多可以組合的類挺物?我們需要?jiǎng)?chuàng)建一個(gè)單類來代表每一個(gè)構(gòu)造。如果我們想要增加一個(gè)修飾符來控制按鈕的尺寸飘弧,我們會(huì)使用這樣的排列例如.Btn-secondary--small--disabled以及.Btn-secondary--large--disabled识藤。或者也許是.Btn-secondary--disabled--large?我們既不需要記住所有修飾符的順序次伶,也不需要為相同的CSS生成更多CSS來代表每個(gè)順序痴昧。單類方法開始失去它的吸引力」谕酰可選的方法是通過多類方法中的多類來構(gòu)建我們的樣式赶撰。

多類CSS

比起用單類來表示每個(gè)元素的所有狀態(tài),我們可以考慮使用多類來達(dá)到想要的效果柱彻。我們依然使用上面按鈕的例子豪娜。再一次,首先我們從HTML開始哟楷,可以用來當(dāng)CSS的模板瘤载。

    <button class="Btn">Just a Button</button>
    <button class="Btn Btn--disabled">Disabled Button</button>
    <button class="Btn Btn-secondary">Secondary Button</button>
    <button class="Btn Btn-secondary Btn--disabled">Secondary Disabled Button</button>

基于這個(gè)HTML結(jié)構(gòu),多類Sass寫法如下卖擅。

    .Btn {
      background-color: blue;
      border-radius: 5px;
      color: white;
      padding: 0.5rem;
      // .Btn-secondary
      &-secondary {
        background-color: white;
        color: blue;
      }
      // .Btn--disabled
      &--disabled {
        background-color: grey;
      }
    }


<a  class="sb-Btn sb-Btn--secondary">Play with this example in Sassmeister</a>

關(guān)于多類方法你會(huì)注意到的第一件事是需要的Sass代碼明顯更少鸣奔。這是因?yàn)槲覀儾恍枰獙?duì)每個(gè)可能需要的樣式組合生成CSS。取而代之我們可以創(chuàng)建最小塊并且用它們構(gòu)建我們期望的任何樣式組合惩阶。

多類CSS很好得增添了寫語義化模塊化CSS的特性挎狸。如果可組合性沒有讓你心動(dòng)那么只要看一下我們兩個(gè)Sass例子生成代碼的區(qū)別。

單類生成的CSS

    .Btn, .Btn--disabled, .Btn-secondary, .Btn-secondary--disabled {
      border-radius: 5px;
      padding: 0.5rem;
    }
    
    .Btn {
      color: white;
      background-color: blue;
    }
    .Btn--disabled {
      color: white;
      background-color: grey;
    }
    .Btn-secondary {
      color: blue;
      background-color: white;
    }
    .Btn-secondary--disabled {
      color: blue;
      background-color: light-grey;
    }

多類生成的CSS

    .Btn {
      background-color: blue;
      border-radius: 5px;
      color: white;
      padding: 0.5rem;
    }
    .Btn-secondary {
      background-color: white;
      color: blue;
    }
    .Btn--disabled {
      background-color: grey;
    }

結(jié)論

這個(gè)平凡例子中的Sass以及生成的CSS都更簡潔精煉断楷。想象下對(duì)于一個(gè)大型網(wǎng)頁應(yīng)用需要生成多少的單類伟叛,每個(gè)可能樣式組的組合都有一個(gè)類。這會(huì)以指數(shù)增長脐嫂,很快會(huì)變得不可管理统刮。等價(jià)的多類會(huì)生成極小塊并允許用戶在DOM上通過多種方法結(jié)合這些類紊遵,這是一個(gè)更加靈活的方法。單類同樣難以擴(kuò)展侥蒙,這在任何應(yīng)用中都是很糟糕的更不要說在CSS框架里暗膜。

雖然單類方法一眼看上去很吸引人,但請(qǐng)?jiān)跊_動(dòng)之前好好考慮一下鞭衩。長遠(yuǎn)來看用多類方法會(huì)有收益并且能幫助你編寫簡潔而強(qiáng)大的類來完成任何可能有的樣式需求学搜。

后續(xù)閱讀

我非常推薦這篇Nicolas Gallagher寫的關(guān)于HTML語義化的文章,這篇文章研究了語義化css论衍,包括多類vs單類的問題瑞佩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坯台,隨后出現(xiàn)的幾起案子炬丸,更是在濱河造成了極大的恐慌,老刑警劉巖蜒蕾,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠炬,死亡現(xiàn)場離奇詭異,居然都是意外死亡咪啡,警方通過查閱死者的電腦和手機(jī)首启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撤摸,“玉大人毅桃,你說我怎么就攤上這事∽家模” “怎么了疾嗅?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冕象。 經(jīng)常有香客問我代承,道長,這世上最難降的妖魔是什么渐扮? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任论悴,我火速辦了婚禮,結(jié)果婚禮上墓律,老公的妹妹穿的比我還像新娘膀估。我一直安慰自己,他們只是感情好耻讽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布察纯。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饼记。 梳的紋絲不亂的頭發(fā)上香伴,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音具则,去河邊找鬼即纲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛博肋,可吹牛的內(nèi)容都是我干的低斋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼匪凡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼膊畴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起病游,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤唇跨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后礁遵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轻绞,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡采记,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年佣耐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唧龄。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兼砖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出既棺,到底是詐尸還是另有隱情讽挟,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布丸冕,位于F島的核電站耽梅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胖烛。R本人自食惡果不足惜眼姐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佩番。 院中可真熱鬧众旗,春花似錦、人聲如沸趟畏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至利朵,卻和暖如春律想,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哗咆。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工蜘欲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晌柬。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓姥份,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年碘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澈歉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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