網(wǎng)頁重構(gòu)應該避免的10大 CSS 糟糕用法

今天在回廣州的火車上看到一篇"10 CSS mistakes every web designer must avoid"更胖,想著還不錯,就翻譯給大家隔显。

對于網(wǎng)頁重構(gòu)來說却妨,CSS禪意花園 是網(wǎng)頁布局從 table 表格轉(zhuǎn)到了 html +css 的標志 。這些年來括眠,隨著我們的網(wǎng)站越來越復雜:html5彪标,css3,新的技術(shù)掷豺、新的屬性捞烟,越來越多的開發(fā)者開始思考和嘗試提高他們的 CSS 技能账锹。那么我們從哪里著手呢?對于網(wǎng)頁重構(gòu)工作來說坷襟,我們應該養(yǎng)成什么樣的開發(fā)習慣?一個糟糕的 css 用法是怎樣的生年?我們應該怎么處理這些糟糕的 css婴程。今天這篇文章,我將談一談10個我們應該避免的 css 糟糕用法抱婉,當然档叔,我們也會分享怎么才是正確的用法。

為了方便大家理解蒸绩,我將這10個糟糕用法歸為三大類:權(quán)重衙四、工作流、自以為是患亿。

權(quán)重传蹈!權(quán)重!泌枪!權(quán)重0O式洹!

正所謂馬太效應沾歪,如果你寫了很爛的 css,這段爛代碼的不好之處是他會導致更多和更爛的代碼雾消。如果你需要解決一個 css bug灾搏,發(fā)現(xiàn)唯一的解決方法是:使用更多層級的選擇器、 id 選擇器立润;甚至更糟糕:使用內(nèi)聯(lián)樣式( inline-style )狂窑,直到使用最后的大殺器!important。以上提到的所有用法歸根到期他們犯了「過多權(quán)重」的錯誤范删。

CSS 中的權(quán)重取決于你如何使用具體的css 規(guī)則蕾域。

#layout #header #title .logo a { display: block; }

看看上面這串 CSS 選擇器,你可能覺得這是一段符合語義化的「好」選擇器:簡單明了到旦。如果你依照習慣從左往右讀旨巷,你可能是這么理解:「先找到主要布局區(qū)域,再找頭部區(qū)域添忘,再找到 title 標題區(qū)域采呐,再找到 logo 標志區(qū)域,再找到這里面的所有 a 錨點」搁骑,對于 css 來說斧吐,這是一個很具體的精確定位又固,但是,實際上我們很少有機會需要這么精確的定位煤率。過大的css權(quán)重會造成你的樣式表更加難以維護(你考慮過接你班的同事的感受木有Q龉凇),也更加難以閱讀和理解(這么多層聲明蝶糯、一長串你鬧哪樣把笾弧)。

01.濫用 id

CSS 權(quán)重的高低取決于你使用什么樣的選擇器:id,class 類,tags 標簽昼捍。舉個栗子:

#my-link{color: red}
.my-link{color: yellow}
a{ colour: blue}

來做這么一個小測試识虚,有這么一個超鏈接如下,如果我們沒有其定義其他樣式妒茬,瀏覽器渲染出來的最終結(jié)果會是什么顏色担锤?

<a href="#" id="my-link" class="my-link">舉個栗子</a>

最終的顏色會是紅色,因為 id 屬性是三者之中權(quán)重最高的(id在網(wǎng)頁中只能使用一次乍钻,他得權(quán)重值為100)肛循,所以紅色葫蘆娃成功擊敗了其他娃娃,舉起了栗子团赁。

根據(jù) css 權(quán)重育拨,權(quán)重次于 id 的是class類,最后才是tag標簽欢摄,正如你如上圖審查器中所看到的熬丧。

當然啦,像上面我們舉的栗子這種「同時使用 id/calss/tag 」的情況在實際應用中還是很少見的怀挠,在日常開發(fā)中析蝴,我們更多的情況是會遇到如下情況:

#header a { border:2px dashed #000 }

假設(shè)這是我們的一個項目,現(xiàn)在我們決定要把一個在 header 的 link設(shè)置成無邊框绿淋,隨手一寫闷畸,我們添加了:

.special-link { border:none }

然后再在 html 中添加了一個 special-link 的class 類,這下解決我們的問題了嗎吞滞? 答案是:沒有佑菩! 由于 id 的權(quán)重如此之高,我們需要更高權(quán)重的聲明才能實現(xiàn)我們的需求裁赠。下面這樣寫才是正確的:

#header .special-link { border: none }

假如說這種情景在我們的 code 過程中不斷地出現(xiàn):設(shè)置 header 區(qū)域另外一個特殊的超鏈接 link 為某特殊的樣式殿漠,你該怎么處理呢? id 的高權(quán)重特性意味著濫用 id 絕對是一個很糟的做法佩捞!

那我們?nèi)绾谓鉀Q這個問題呢绞幌?用 class 類來代替 id 吧。

02.大串的 css 選擇器(多層級)
#header #title .left-side img.logo { opacity: 0.5 }

上面這個栗子不僅僅亂用 id一忱,他還很長莲蜘,正如同亂用 id導致的高權(quán)重麻煩谭确,如果你使用一大串選擇器(超過三個層級)你同樣會造成過高權(quán)重,導致你陷入到高權(quán)重和更高權(quán)重的汪洋大海之中票渠。

那針對這個問題的解決辦法有什么呢——精簡逐哈!如同我們現(xiàn)在這個栗子,如果我們用一個 .logo class類就能解決我們的需求问顷,那我們就沒必要寫這么以大串了鞠眉。一般情況下,我們應該控制選擇器在2個择诈,最多3個。

03.Inline styles

內(nèi)聯(lián)樣式是css 權(quán)重罪惡的源泉出皇,同時也從根本上摧毀了我們使用 css 的初心(結(jié)構(gòu)樣式分離)羞芍。當我們的工程師好不容易走出 tables 的魔窟開懷擁抱外部樣式表,我們早就應該知道不要把樣式同結(jié)構(gòu)混雜在一起郊艘。

根據(jù) css 權(quán)重級的特性荷科,內(nèi)聯(lián)樣式只能被!important 所覆蓋。一般來說纱注,這就意味著畏浆,如果某猿使用了!important,他們更多是被逼的沒辦法才這么用(對應英文 reactive)狞贱,而不是想這么用(preoactive)刻获。的確!important在 css 樣式表中用起來十分方便,但我們最好是聰明地瞎嬉、小心翼翼地碰她蝎毡、用他,而不是把他當做救命稻草(救命稻草用多了氧枣,遲早也會從救命稻草變成壓死駱駝的稻草)沐兵。

下面舉例怎么解決內(nèi)聯(lián)樣式的問題,就兩步 1.復制刪除 2.粘貼 便监。剔除內(nèi)聯(lián)樣式扎谎,轉(zhuǎn)移到樣式表之中吧。

04.從上至下式的粗放命名

說完 css 權(quán)重烧董,接下來我們來談?wù)勂渌?CSS 的糟糕用法毁靶。假設(shè)我們開始了一個新項目,設(shè)計師丟給我們一份 psd解藻,我們開始在 html 中寫基本的框架老充。

根據(jù)結(jié)構(gòu)從下至上式的命名方式模糊化了 html 結(jié)構(gòu),工程師常常根據(jù)上下結(jié)構(gòu)來命名id 和 class螟左,而不是具體的設(shè)計元素啡浊,例如#header,content觅够,這常常會導致長選擇器(舉個例子如. menu ul li a{ })巷嚣,這樣的后果是我們的代碼變得難以調(diào)試和維護喘先。怎么解決這個問題呢?我們應該嘗試從網(wǎng)頁中分離出設(shè)計元素廷粒,這同樣可以減少我們代碼中的冗余窘拯。

05.冗余/重復

冗余意味著你寫 css 的過程中不斷重復某些代碼。在使用編程語言的時候坝茎, 我們很好理解重復(造輪子)意味著浪費時間涤姊,我們在 code 中應該遵循 DRY 原則(Don't repeat yourself)。什么情況下我們會重復造輪子呢嗤放?舉個栗子:

.some-title { font-weight: bold; }
.some-other-title { font-weight: bold; color: red }

實際上思喊,我們可以有個更好的解決辦法

.some-title, .some-other-title { font-weight: bold; }
.some-other-title { color: red; }

比如說我們要添加一個不同顏色的標題,我們可以使用一個常用的命名次酌,或者添加一個具體的 class 類恨课。

<h3 class="some-title pop">我的標題/h3>

這個有點面向?qū)ο蟮腃SS的思想在里面,使用 Sass 中的 @extend 特性可以很好地解決我們這個問題岳服。

在 Sass 之中剂公,你可以使用@extend 繼承選擇器,被繼承的選擇器的樣式也被繼承吊宋。這個特性使得我們可以很方便管理不同的樣式纲辽,舉個栗子:

.some-title { font-weight: bold; }
.some-other-title { @extend .some-title; color: red; }

當CSS預處理編譯器將.scss轉(zhuǎn)換成.css文件時,我們最終輸出的樣式是:

.some-title, .some-other-title { font-weight: bold; }
.some-other-title { color: red; }

最終輸出的是一模一樣的效果璃搜,解決重復和冗余的問題文兑,要求我們在寫 css 的時候心中對 html 層級結(jié)構(gòu)要有個大致的規(guī)劃,思考不同的設(shè)計元素之間的層級和關(guān)系腺劣,我們規(guī)劃得越清晰绿贞,最終輸出的 css 也越精簡。

06.精簡你的單位

如果你的樣式表中混雜著 px,em,rem等等單位橘原,是時候改變了籍铁,業(yè)內(nèi)著名的web開發(fā)者Rachel Nabors 呼吁大家統(tǒng)一使用em為字體大小單位,他曾說「我看其他人的樣式表第一件事就是看字體樣式趾断,然后把所有的font-size的單位換成em」拒名,這幾年用戶使用的終端越來越多樣(不同的終端、不同的瀏覽器使用的默認字體大小存在差異)芋酌,使用絕對字體大小px變得越來越不可控增显,使用em等相對大小的字體則避免了這個問題。

如果你想在轉(zhuǎn)成em對這些單位有個深入點的了解脐帝,推薦你閱讀《CSS文字大小單位PX同云、EM糖权、PT》

當然炸站,如果你就是不喜歡em和他們嵌套特性星澳,那么你可以更進一步了解 CSS3 中推出的新單位 rem

不同單位在 web 設(shè)計之中的戰(zhàn)爭還在繼續(xù)(可參考文章CSS Font-Size: em vs. px vs. pt vs. percent
)旱易,學習一點相關(guān)知識對我們提高代碼可維護性至關(guān)重要禁偎。

下面我們進入到這篇博文的第三也是最后一個部分「自以為是」,這些壞習慣包括:增加不必要的東西阀坏,錯誤如暖,無意義的 css。

07.向下兼容和無效的規(guī)則

在開發(fā)的過程中忌堂,如果你不需要使用 css3 之類的高大上代碼就能實現(xiàn)效果装处,那再好不過了〗可是,作為工程師的你在 Chrome 最新版本上面看到的效果寝蹈,并不意味著你的用戶能在他們的瀏覽器上看到同樣的效果(考慮過 IE 的感受沒有)李命,一個十分糟糕的壞習慣就是完全忽略向下兼容性。

如果你在項目中使用rgba()箫老,你是否測試過這個屬性的兼容性封字?如果沒有,那你最好祈禱沒有 IE8的用戶會訪問你的網(wǎng)站耍鬓。你是否寫全了針對不同瀏覽器的不同的規(guī)則(-webkit,-ms -moz 等等)阔籽?解決這個問題,可以使用 CSS LInt檢測下你的 css 代碼牲蜀,CSS Lint的檢測規(guī)則包括錯誤的和不合理的地方笆制。

08.(沒有意義)不起作用的樣式

Harry RobertsCode smells in CSS是關(guān)于 css 糟糕用法的經(jīng)典文章。他舉了幾個可有可無的不起作用樣式的栗子:

h2{
font-size:2em;
margin-bottom:0.5em;
padding-bottom:0.5em;
border-bottom:1px solid #ccc;
}
.no-border{
padding-bottom:0;
border-bottom:none;
}

Roberts 推薦的重構(gòu)精簡方法是刪掉屬性為0none的屬性值涣达。

h2{
font-size:2em;
margin-bottom:0.5em;
}
.headline{
padding-bottom:0.5em;
border-bottom:1px solid #ccc;
}

如果你像重構(gòu)之前的那樣寫法在辆,h2是一個我們在web 設(shè)計中會不斷重復用到的元素,這個本質(zhì)上「你寫了更多的代碼卻沒有實現(xiàn)了更少的樣式效果」度苔,如果我們接下來又要設(shè)置一個h2的屬性為其他樣式匆篓,那代碼會得很亂。

Harry Roberts是 inuit.css 框架的作者寇窑。

09.巧而不巧:用 Hack 不意味著你是個好 Hacker

負的 margin 邊距鸦概,!important等等,上面的這些就是我們所說的 hack 用法(此 hack 非針對IE 兼容的 hack甩骏,也可以理解成 cheater 作弊用法)窗市,如果其他人問我們?yōu)槭裁匆@么寫先慷?我們可能只需要回答「管他呢,反正能實現(xiàn)效果」谨设。

當我們?yōu)樽约菏褂眠@些充滿「弊」端的方法而略不放心的時候熟掂,一個解決辦法就是把我們的這些 hack 放到一個特定的樣式表文件hack.css之中。

任何時候你意識到你寫了一個 css 的 hack 用法的時候扎拣,你直接把這些代碼放到這個hack.css 之中(或者樣式表的特定區(qū)域:通過注釋跟其他樣式區(qū)分開)赴肚,這個專屬區(qū)域是個好解決方案因為他最終會在用戶端隱藏。

當我們養(yǎng)成了這個習慣二蓝,我們可以十分清晰地知道我們寫了哪些 hack 誉券,同樣可以方便我們了解我們使用這些 hack 的情景,讓我們可以知道如何避免這些 hack 刊愚。我們有許多寫 hack 用法的理由踊跟,但是如果我們不記錄我們?yōu)槭裁?hack,我們將不會從我們這些 hack 中學到我們?yōu)槭裁匆e誤地這么用鸥诽。

10.糟糕的文檔和注釋

昨天在微博上看到一個段子「程序員最討厭的四件事:寫注釋商玫、寫文檔、別人不寫注釋牡借、別人不寫文檔 …」拳昌。

寫文檔和注釋絕對不是一個有意思的事情,但卻是一個最重要的事情(尤其是涉及到項目后續(xù)可維護性時)钠龙,文檔可以有效地讓其他人知道你的代碼是干什么的炬藤,同時其他人理解你的 css。對于大部分語言(html,css,php,JavaScript) 碴里,開發(fā)者可以直接在代碼文件中寫上注釋(文檔)沈矿。

Nabors 曾說「我曾YY:如果我今天寫完一個項目的 css 但是明兒我卻掛掉了,有一個人幸運地接手我這個項目咬腋,那他看得懂我的這些代碼是什么意思嗎羹膳?」。盡量地讓我們的樣式表中的結(jié)構(gòu)清晰根竿,如果不能讓人立馬知道你的選擇器指的是哪里的樣式溜徙,可以嘗試添加注釋(什么!你還說注釋增加css 文件大邢睢蠢壹!難道你不知道壓縮工具么!)九巡。

第一步是在必須的地方做好注釋图贸,第二步是使用工具把css文件中的這些注釋轉(zhuǎn)換成一個合適的文檔。推薦可以使用css_docKSS

css_doc 跟 JavaDoc類似疏日,他的轉(zhuǎn)換原理基于 CSSDOC. KSS(Knyle Style Sheets)偿洁,對于前端和設(shè)計師來說都十分有益。

總結(jié)

在這篇文章中沟优,我們介紹了一些常見的 css 糟糕用法涕滋,指出了為什么我們應該避免這些用法和應該使用什么正確的用法。還是這句話"Doin something is always better than nothing"挠阁,行動起來總比什么都不做要好點宾肺,未雨綢繆有備無患。

今天你看完這篇文章侵俗,知道了10個糟糕的 CSS 用法锨用,這不意味著你明兒去上班就把你過去所有的代碼都重構(gòu)一遍。從點滴開始隘谣,一步一步來才是我們開發(fā)工作的正確做法增拥。在接下來的工作中,注意這些細節(jié)寻歧,避免這些「小」錯誤掌栅,讓我們的代碼更漂亮點。終有一天码泛,我們會發(fā)現(xiàn)"Code is poetry"猾封。

譯者言

這是第二次翻譯技術(shù)相關(guān)文章,不得不說弟晚,還是低估了翻譯的難度。要把技術(shù)類的文章翻譯得語言流暢逾苫、通俗易懂卿城,還是挺有挑戰(zhàn)性的。譯文中加入了自己的理解铅搓,配圖也是自己通過 codepen 重新截圖演示瑟押,這篇文章的譯稿我放在了 google docs 上,如果對于某些翻譯你有更好的用法星掰,可以直接建議修改多望。

https://docs.google.com/document/d/11Ly6z0dlVVPzIL-W22L_U6waoU7Pid4-KdDmEx6D0c8/edit?usp=sharing

原文地址羅磊的獨立博客:「網(wǎng)頁重構(gòu)應該避免的10大 CSS 糟糕用法」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市氢烘,隨后出現(xiàn)的幾起案子怀偷,更是在濱河造成了極大的恐慌,老刑警劉巖播玖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椎工,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機维蒙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門掰吕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颅痊,你說我怎么就攤上這事殖熟。” “怎么了斑响?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵菱属,是天一觀的道長。 經(jīng)常有香客問我恋捆,道長照皆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任沸停,我火速辦了婚禮膜毁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愤钾。我一直安慰自己瘟滨,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布能颁。 她就那樣靜靜地躺著杂瘸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伙菊。 梳的紋絲不亂的頭發(fā)上败玉,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音镜硕,去河邊找鬼运翼。 笑死,一個胖子當著我的面吹牛兴枯,可吹牛的內(nèi)容都是我干的血淌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼财剖,長吁一口氣:“原來是場噩夢啊……” “哼悠夯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躺坟,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沦补,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咪橙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策彤,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡栓袖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了店诗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裹刮。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庞瘸,靈堂內(nèi)的尸體忽然破棺而出捧弃,到底是詐尸還是另有隱情,我是刑警寧澤擦囊,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布违霞,位于F島的核電站,受9級特大地震影響瞬场,放射性物質(zhì)發(fā)生泄漏买鸽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一贯被、第九天 我趴在偏房一處隱蔽的房頂上張望眼五。 院中可真熱鬧,春花似錦彤灶、人聲如沸看幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诵姜。三九已至,卻和暖如春搏熄,著一層夾襖步出監(jiān)牢的瞬間棚唆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工心例, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宵凌,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓契邀,卻偏偏與公主長得像摆寄,于是被迫代替她去往敵國和親失暴。 傳聞我的和親對象是個殘疾皇子坯门,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,748評論 1 92
  • CSS基礎(chǔ) 本文包括CSS基礎(chǔ)知識選擇器(重要6喊恰9糯鳌!)繼承矩肩、特殊性现恼、層疊、重要性CSS格式化排版單位和值盒模型浮動...
    廖少少閱讀 3,077評論 0 40
  • <a name='html'>HTML</a> Doctype作用?標準模式與兼容模式各有什么區(qū)別? (1)叉袍、<...
    clark124閱讀 3,472評論 1 19
  • 感恩~l老師對兒子的贊美始锚,我也特別感恩兒子曾經(jīng)在溪元學堂的日子,l老師x老師對孩子的引導喳逛,為孩子們創(chuàng)造的遠離喧囂沉...
    毛毛細雨mmxy閱讀 243評論 0 0
  • 想象文字的主要目的是娛樂瞧捌,而非教育。都想用文字的“不要”論說性作品要傳達的就是知識—在讀者經(jīng)驗中曾經(jīng)有過或沒有過的...
    吳黃龍本人閱讀 611評論 1 1