沒(méi)那么難评甜,談CSS的設(shè)計(jì)模式

什么是設(shè)計(jì)模式灰粮?
  曾有人調(diào)侃,設(shè)計(jì)模式是工程師用于跟別人顯擺的忍坷,顯得高大上粘舟;也曾有人這么說(shuō),不是設(shè)計(jì)模式?jīng)]用佩研,是你還沒(méi)有到能懂它柑肴,會(huì)用它的時(shí)候。
  先來(lái)看一下比較官方的解釋:“設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用旬薯、多數(shù)人知曉的晰骑、經(jīng)過(guò)分類的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)袍暴。使用設(shè)計(jì)模式是為了可重用代碼些侍、讓代碼更容易被他人理解、保證代碼可靠性政模。 毫無(wú)疑問(wèn)岗宣,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)模式使代碼編制真正工程化淋样;設(shè)計(jì)模式是軟件工程的基石脈絡(luò)耗式,如同大廈的結(jié)構(gòu)一樣〕煤铮”
  今天我們來(lái)聊聊CSS的設(shè)計(jì)模式刊咳。
  設(shè)計(jì)模式,這個(gè)詞匯我們常見(jiàn)儡司,幾乎所有的編程語(yǔ)言都會(huì)有幾套娱挨,但深入研究的人不多,原因如下:
  1捕犬、似乎沒(méi)有太大必要性去強(qiáng)調(diào)它跷坝,有問(wèn)題了改一下或者按團(tuán)隊(duì)規(guī)范來(lái)就行酵镜;
  2、不去使用一些既有的模式也無(wú)傷大雅柴钻;
  3淮韭、不少人所接觸的業(yè)務(wù)量級(jí)還沒(méi)有達(dá)到需要規(guī)劃和組織的程度,光寫布局贴届,寫特效靠粪,照顧兼容,就夠喝一壺的了毫蚓,沒(méi)有意識(shí)去思考一些方法論的問(wèn)題占键。
  當(dāng)然,這三者都是我經(jīng)歷過(guò)的元潘,相信你也是~
  我們都會(huì)長(zhǎng)大捞慌,都會(huì)慢慢的做更多、更大柬批、更復(fù)雜的項(xiàng)目啸澡,這個(gè)時(shí)候,就需要自上而下氮帐,全流程的去思考一些問(wèn)題嗅虏。后臺(tái)不說(shuō),只講前端上沐,比如:風(fēng)格的制定皮服、色調(diào)、模塊参咙、布局方式龄广、交互方式、邏輯等等蕴侧,如果再加上團(tuán)隊(duì)合作择同,若再?zèng)]有一個(gè)規(guī)劃的話,要不了多久净宵,那些看起來(lái)沒(méi)問(wèn)題的代碼敲才,就會(huì)暴露出各種問(wèn)題,模塊命名择葡、類的命名紧武、文件的組織、共用模塊的提取敏储、代碼的復(fù)用阻星、可讀性、擴(kuò)展性已添、維護(hù)性妥箕。它們看起來(lái)只是一些簡(jiǎn)單的小動(dòng)作番舆,卻需要你看得更遠(yuǎn),避免將來(lái)出問(wèn)題需要付出更大的代價(jià)矾踱,甚至被迫整個(gè)項(xiàng)目重構(gòu),可謂疏哗,功在當(dāng)代呛讲,利在千秋~
  既然要對(duì)CSS進(jìn)行設(shè)計(jì),那么肯定是它本身存在一些問(wèn)題或者缺陷返奉,其中贝搁,一個(gè)最明顯的就是,它的任何一個(gè)規(guī)則芽偏,都是全局性的聲明雷逆,會(huì)對(duì)引入它的頁(yè)面當(dāng)中所有相關(guān)元素起作用,不管那是不是你想要的污尉。而獨(dú)立及可組合的模塊是一個(gè)可維護(hù)系統(tǒng)的關(guān)鍵所在膀哲。下面,我們就從多個(gè)層面來(lái)探討一下被碗,到底該怎樣寫CSS某宪,才是更科學(xué)的。
  從需求出發(fā)


  我們剛開(kāi)始學(xué)習(xí)寫字的時(shí)候锐朴,是不會(huì)去考慮兴喂,寫出來(lái)的某句話好不好,文章結(jié)構(gòu)合適不合適焚志,因?yàn)槲覀兪且庾R(shí)不到的衣迷。寫代碼也一樣,剛開(kāi)始酱酬,我們只是去定義規(guī)則壶谒,能用對(duì)了屬性,語(yǔ)法正確膳沽,把頁(yè)面實(shí)現(xiàn)出來(lái)了佃迄,就好。慢慢地,就會(huì)發(fā)現(xiàn)流纹,頁(yè)面也是有結(jié)構(gòu)的利职,我們按照頁(yè)面的結(jié)構(gòu)去組織代碼,會(huì)不會(huì)更好普碎?比如,分成頭部录平、導(dǎo)航麻车、側(cè)邊欄缀皱、banner區(qū)、主內(nèi)容區(qū)动猬、底部等啤斗。
  然而這樣貌似還是不夠,因?yàn)檫€有一些東西赁咙,復(fù)用度是很高的钮莲,又不好把它歸為任何一個(gè)固有模塊,比如:面包屑彼水、分頁(yè)崔拥、彈窗等,它們不適合被放到某一個(gè)固有模塊的代碼中凤覆,就可以單獨(dú)的分出一段專屬的css和js链瓦,或許,這就是組件化的由來(lái)~


  在分了之后盯桦,我們的代碼看起來(lái)已經(jīng)比之前好很多了慈俯,組織清晰,維護(hù)性大幅提高拥峦,但是肥卡,好像還是不夠,我們會(huì)發(fā)現(xiàn)另外一些東西事镣,很細(xì)小步鉴,但復(fù)用度也很高,它們同樣不適合被放到模塊中去璃哟,比如氛琢,邊框、背景随闪、圖標(biāo)阳似、字體、邊距铐伴、布局方式等等撮奏。如果我們?cè)诿總€(gè)需要它們的地方,都定義一次当宴,它們會(huì)被重復(fù)很多次畜吊,顯然,這背離好的實(shí)踐户矢,會(huì)造成代碼冗余和維護(hù)困難玲献。所以,我們需要“拆”。拆過(guò)之后會(huì)怎樣捌年?我們想在哪里用可以直接加瓢娜,需要改的時(shí)候統(tǒng)一改。


  經(jīng)過(guò)了“分”礼预、“拆”眠砾,我們的代碼結(jié)構(gòu)已經(jīng)十分清晰,各個(gè)內(nèi)容模塊托酸,功能模塊褒颈,UI模塊都乖巧的等待召喚,那么還差什么获高?是的,還差有序的組織吻育,分類清晰之后念秧,還需要排列有序,從不同緯度去考量布疼,我們總能精益求精摊趾。舉個(gè)栗子,我們可能會(huì)看到像這樣:
@import "mod_reset.css";@import "ico_sprite.css";@import "mod_btns.css";@import "header.css";@import "mod_tab.css";@import "footer.css";
  我們將不同的部分按照一定的順序去擺放游两,能讓我們的代碼看起來(lái)更加有序砾层,易于維護(hù),同時(shí)贱案,有利于進(jìn)行繼承或?qū)盈B覆蓋肛炮。不要小看這一步,看似可有可無(wú)宝踪,實(shí)際要求比較高的統(tǒng)籌規(guī)劃能力侨糟,可以減少冗余代碼和快速定位問(wèn)題位置等。
  除此之外瘩燥,我們依然可以有其他的方法來(lái)幫助我們進(jìn)行區(qū)分代碼范圍秕重,比如:
  1、在文件頭部建立一個(gè)簡(jiǎn)要的目錄


  2厉膀、使用區(qū)塊注釋

  在注釋中溶耘,應(yīng)該盡量詳細(xì)的寫清楚該段代碼的目的,狀態(tài)切換服鹅,調(diào)整原因凳兵,交互邏輯等等,這樣不僅利于自己的維護(hù)企软,更加利于別人接手維護(hù)你的代碼留荔。
  從結(jié)論出發(fā)
  除了需求當(dāng)中一些通用部分,另外一些也是需要注意,但不會(huì)被正式定義的東西聚蝶,它們來(lái)源于我們的實(shí)踐經(jīng)驗(yàn)杰妓,比如:

層級(jí)嵌套不要太深
  稍微了解一些瀏覽器渲染原理的都知道,它在解析CSS規(guī)則的時(shí)候碘勉,是從右向左巷挥,一層層的去遍歷尋找,如果層級(jí)太多验靡,必然增加了渲染時(shí)間倍宾,影響渲染速度。另外胜嗓,如果選擇器層級(jí)過(guò)多高职,也就間接反應(yīng)了,你的HTML結(jié)構(gòu)可能寫得不夠簡(jiǎn)潔辞州。
  那么具體多少層合適怔锌?一般建議是不超過(guò)4層,但話又說(shuō)回來(lái)变过,超過(guò)4層會(huì)怎樣嗎埃元?不會(huì)有多明顯的影響,除非你寫到很恐怖的數(shù)量媚狰,或者項(xiàng)目極其龐雜岛杀,可能能看出來(lái)影響,其實(shí)從我們?nèi)粘P枨髞?lái)看崭孤,4層以內(nèi)足可以解決絕大多數(shù)問(wèn)題类嗤,故而,是合理的辨宠。

避免使用元素選擇器
  出于兩點(diǎn)考慮:

第一點(diǎn)土浸,和上一段提到的相關(guān),在HTML中彭羹,有很多常用的高頻元素黄伊,比如,div派殷、p还最、span、a毡惜、ul等拓轻。如果,你在多層選擇器的最內(nèi)層使用了元素選擇器经伙,那么扶叉,在開(kāi)始尋找時(shí)勿锅,瀏覽器就會(huì)遍歷HTML中的所有該元素,顯然枣氧,這是沒(méi)有必要的溢十。

第二點(diǎn),我們的需求和代碼結(jié)構(gòu)都是存在著潛在變化的达吞,今天寫好了一個(gè)頁(yè)面张弛,明天可能就要再加進(jìn)去一個(gè)按鈕,再加進(jìn)去一句話酪劫,再加進(jìn)去一個(gè)圖標(biāo)吞鸭。我們寫好的一個(gè)結(jié)構(gòu),也隨時(shí)可能被復(fù)用到別的結(jié)構(gòu)中去覆糟。所以刻剥,如果,你使用了元素選擇器去定死某個(gè)東西滩字,不論是新加進(jìn)來(lái)的東西造虏,還是被復(fù)用的東西加到別的結(jié)構(gòu)里去,都極有可能產(chǎn)生樣式的沖突踢械,這個(gè)時(shí)候酗电,你又不得不寫多余的樣式進(jìn)行覆蓋修正魄藕,或者重新定義類内列。
  所以,出于以上考慮背率,在具體的代碼模塊中话瞧,盡量不要使用元素選擇器,使用元素選擇器的前提是寝姿,你完全的確定交排,不會(huì)導(dǎo)致出現(xiàn)問(wèn)題。注意饵筑,我用的限定范圍是“具體的代碼模塊”埃篓,那么用于定義通用規(guī)則的樣式,是可以的根资,也是推薦使用的架专,比如,reset玄帕。也可以是別的地方部脚,這就需要我們自行考量。

避免使用群組選擇器
  群組選擇器會(huì)有什么問(wèn)題裤纹?直接上圖吧委刘。


  圖中這種情況不多見(jiàn),此處只是舉個(gè)例子,這里寫了三組選擇器锡移,用來(lái)定義不同地方的同一種樣式呕童,其明顯的缺陷是,如果有第四個(gè)地方需要使用到罩抗,你不得不再往里加一組選擇器拉庵,如果有10個(gè)不同的地方,你就寫10個(gè)套蒂?這對(duì)于維護(hù)來(lái)說(shuō)钞支,是很痛苦的,聰明的我們操刀,怎能被如此繁復(fù)又不必要的勞動(dòng)所困擾烁挟,故而,墻裂不推薦此種做法骨坑,完全可以提取出來(lái)一個(gè)公用類撼嗓,定義統(tǒng)一樣式,然后欢唾,哪里需要放哪里且警,復(fù)用和維護(hù)都會(huì)更加方便。
  當(dāng)然礁遣,你可能會(huì)說(shuō)斑芜,我在寫第一個(gè)的時(shí)候,不會(huì)知道后面還有那么多祟霍,有沒(méi)有必要提取是不知道的杏头,是的,所以沸呐,需要你根據(jù)經(jīng)驗(yàn)去判斷醇王,也需要在項(xiàng)目推進(jìn)過(guò)程中,適時(shí)的對(duì)代碼進(jìn)行整理和重構(gòu)崭添。

文件引入的數(shù)量和順序
  對(duì)于剛接觸網(wǎng)頁(yè)的朋友來(lái)說(shuō)寓娩,這兩點(diǎn)也是容易忽視的,因?yàn)樗鼈兛雌饋?lái)沒(méi)什么大影響呼渣,多幾次請(qǐng)求棘伴,樣式是否已經(jīng)加載,都沒(méi)那么容易把人逼瘋徙邻。但是出于對(duì)用戶體驗(yàn)的極致追求排嫌,我們還是希望文件請(qǐng)求次數(shù)盡量少,內(nèi)容的顯示有個(gè)優(yōu)先順序缰犁,文件加載有個(gè)先后順序淳地。這樣怖糊,在實(shí)在難以縮減文件大小的時(shí)候,讓用戶先看到更重要的颇象,正常展示的內(nèi)容伍伤。
  以上只是幾點(diǎn)舉例,更多實(shí)戰(zhàn)結(jié)論遣钳,大家可以多讀相關(guān)的博文或者書籍扰魂,都會(huì)有前輩們的經(jīng)驗(yàn)之談。
  從矛盾出發(fā)

通用和語(yǔ)義

Naming convention is beneficial for immediately understanding which category a particular style belongs to and its role within the overall scope of the page. On large projects, it is more likely to have styles broken up across multiple files. In these cases, naming convention also makes it easier to find which file a style belongs to.

命名規(guī)則有助于立即理解一個(gè)特定樣式屬于哪一類蕴茴,它在頁(yè)面的整體范圍內(nèi)的作用劝评。在大型項(xiàng)目中,它更可能有在多個(gè)文件中被打破的樣式倦淀。在這種情況下蒋畜,命名約定也可以更容易地找到一個(gè)樣式屬于哪個(gè)文件的文件。
  很多時(shí)候撞叽,我們需要一個(gè)東西被定義為通用的姻成,以便復(fù)用,比如:模塊標(biāo)題愿棋、按鈕科展、提示文字、圖標(biāo)等糠雨,最開(kāi)始的時(shí)候才睹,我們習(xí)慣去看視覺(jué)稿的內(nèi)容,是“新聞”见秤,我們就定義“news”砂竖,是“關(guān)于”真椿,我們就定義“about”鹃答,是紅色的按鈕,我們就定義“red-btn”等突硝,這樣會(huì)導(dǎo)致一個(gè)問(wèn)題测摔,如果有另外一個(gè)跟新聞列表差不多的樣式和結(jié)構(gòu),但不是新聞解恰,怎么辦锋八?繼續(xù)使用“news”顯然不合適,這就告訴我們护盈,不能把目光局限于內(nèi)容挟纱,需要內(nèi)容和結(jié)構(gòu)分離。
  不能用“news”了腐宋,那用什么呢紊服?abc檀轨?123?這樣總不會(huì)沖突了吧欺嗤,萬(wàn)事大吉~其實(shí)参萄,這是走了另一個(gè)極端,這樣雖然在很大程度上避免了和別的模塊沖突煎饼,但其本身的可讀性就被大大降低了讹挎,別人,甚至你自己過(guò)一段時(shí)間都會(huì)忘記它是什么吆玖,對(duì)于團(tuán)隊(duì)合作是很不利的筒溃。至于需要用什么樣的命名方式,需要你根據(jù)項(xiàng)目的整體來(lái)進(jìn)行規(guī)劃沾乘,適合根據(jù)什么特點(diǎn)來(lái)區(qū)分與之不同的結(jié)構(gòu)铡羡,又能讓人比較容易的在名稱和結(jié)構(gòu)之間建立聯(lián)系,比如所屬類別意鲸、功能烦周、頁(yè)面等。

團(tuán)隊(duì)和個(gè)人
  一個(gè)團(tuán)隊(duì)當(dāng)中怎顾,大家的經(jīng)歷不同读慎,編碼水平和習(xí)慣也不同,這樣就會(huì)造成槐雾,一個(gè)人一個(gè)寫法夭委,你用中劃線,我用下劃線募强;我用英文全拼株灸,你用簡(jiǎn)寫,等等擎值。這些雖然沒(méi)有什么對(duì)錯(cuò)之分慌烧,但對(duì)于團(tuán)隊(duì)成員之間的協(xié)作造成了不小的障礙,別人必須花時(shí)間去適應(yīng)和讀懂你是怎樣組織和定義的鸠儿,這就無(wú)形之中提高了成本屹蚊。
  所以,就有了“團(tuán)隊(duì)規(guī)范”存在的必要进每,規(guī)范除了一些寫法上的規(guī)定汹粤,讓我們的代碼更加統(tǒng)一、清晰田晚、可讀性更強(qiáng)嘱兼、辨識(shí)度更高。還可以提取一些最佳實(shí)踐和復(fù)用模塊等贤徒,對(duì)于團(tuán)隊(duì)里每個(gè)人來(lái)說(shuō)芹壕,都是有好處的胃惜。
  當(dāng)然,對(duì)于人來(lái)說(shuō)哪雕,最難的船殉,莫過(guò)于調(diào)整既有的習(xí)慣,這就會(huì)有進(jìn)入一個(gè)團(tuán)隊(duì)之后“轉(zhuǎn)型”的陣痛斯嚎,其實(shí)這種痛也是成長(zhǎng)的痛利虫,你會(huì)學(xué)習(xí)到更好的編碼方式,更好的實(shí)踐方法堡僻,會(huì)從項(xiàng)目或者團(tuán)隊(duì)的整體去考量一件事的價(jià)值和意義糠惫。

CSS和預(yù)處理器
  前面我有文章詳細(xì)的談過(guò)CSS預(yù)處理器,我曾經(jīng)對(duì)它也是排斥的钉疫,因?yàn)閷W(xué)習(xí)成本硼讽,因?yàn)橛X(jué)得應(yīng)用起來(lái)沒(méi)有必要∩螅可是一旦你決定去學(xué)習(xí)使用它固阁,就會(huì)覺(jué)得不是那樣,預(yù)處理器在向你介紹它自己的時(shí)候城菊,就有特意強(qiáng)調(diào)過(guò)备燃,它的語(yǔ)法是和CSS完全兼容的,也就是說(shuō)凌唬,你在LESS或者SASS文件中并齐,直接寫CSS代碼是沒(méi)有問(wèn)題的。除此之外客税,它能給我們提供很多便利况褪,比如定義統(tǒng)一的變量;使用嵌套而不用一直重復(fù)著寫一些選擇器更耻;可以提取公共的代碼塊然后很方便的復(fù)用等等测垛。
  故而,當(dāng)我們已經(jīng)把CSS組織和書寫得很好了之后酥夭,預(yù)處理器赐纱,就是再次為我們插上一雙翅膀脊奋,能更靈活和高效的編碼熬北。
  從現(xiàn)有模式出發(fā)
  再來(lái)簡(jiǎn)單看看一些廣為流傳的模式。(ps:先后順序與排名诚隙、好壞無(wú)關(guān))

一讶隐、OOCSS——Object Oriented CSS
  接觸過(guò)計(jì)算機(jī)的應(yīng)該都知道,OOP——Object Oriented Programming久又,如果你是第一次接觸OOCSS巫延,你會(huì)很困惑效五,難道是“面向?qū)ο蟮腃SS”嗎?它不是一本真正的編程語(yǔ)言啊炉峰,如何面向?qū)ο螅?br>   OOCSS畏妖,最早被提及,是在2009年疼阔,它的兩大原則是:
  separating structure from skin and container from content.
  直譯過(guò)來(lái)就是戒劫,結(jié)構(gòu)和皮膚分離,容器和內(nèi)容分離婆廊。
  即不要把結(jié)構(gòu)和皮膚以及內(nèi)容進(jìn)行強(qiáng)耦合迅细,而是相互獨(dú)立,所要達(dá)到的目標(biāo)是更易復(fù)用和組合淘邻,可以選擇使用茵典,選擇引用等。
 
二宾舅、SMACSS——Scalable and Modular Architecture for CSS
  從實(shí)踐上說(shuō)统阿,OOCSS給出了一種值得借鑒的思想,但在代碼的組織方面筹我,它并未給出具體的實(shí)施方法砂吞,從這一點(diǎn)上來(lái)說(shuō),SMACSS更進(jìn)一步崎溃。
  它的核心是:
  1蜻直、Base(基礎(chǔ))
  基礎(chǔ)的樣式,就是一些需要最先定義好袁串,針對(duì)于某一類元素的通用固定樣式概而。
  2、Layout(布局)
  布局樣式囱修,是跟頁(yè)面整體結(jié)構(gòu)相關(guān)赎瑰,譬如,列表破镰,主內(nèi)容餐曼,側(cè)邊欄的位置、寬高鲜漩、布局方式等源譬。
  3、Module(模塊)
  模塊樣式孕似,就是我們?cè)趯?duì)頁(yè)面進(jìn)行拆的過(guò)程中踩娘,所抽取分類的模塊,這類的樣式分別寫到一起喉祭。
  4养渴、State(狀態(tài))
  頁(yè)面中的某些元素會(huì)需要響應(yīng)不同的狀態(tài)雷绢,比如,可用理卑、不可用翘紊、已用、過(guò)期藐唠、警告等等霞溪。將這類樣式可以組織到一起。
  5中捆、Theme(主題)
  主題是指版面整個(gè)的顏色鸯匹、風(fēng)格之類,一般網(wǎng)站不會(huì)有頻繁的較大的改動(dòng)泄伪,給我們印象比較深的是QQ空間殴蓬,其他應(yīng)用的不是很多,所以蟋滴,這個(gè)一般不會(huì)用到染厅,但有這樣一個(gè)意識(shí)是好的,需要用到的時(shí)候津函,就知道該怎樣規(guī)劃肖粮。
  有了以上5點(diǎn)分類策略,我們的代碼組織起來(lái)尔苦,思路就會(huì)很清晰涩馆,會(huì)安排的很有序,另外的好處是允坚,可以解決命名難和混亂魂那,之所以有這個(gè)問(wèn)題,主因便是我們不知道以怎樣的標(biāo)準(zhǔn)去定義元素的所屬和特點(diǎn)稠项,有了分類之后涯雅,我們不會(huì)很隨意和混亂的去命名,有了依據(jù)展运,就能更輕松活逆,也不易沖突。
 ∞质ぁ(web前端學(xué)習(xí)交流群:328058344 禁止閑聊蔗候,非喜勿進(jìn)!)

三挤土、Meta CSS
  原子類琴庵,也可以稱之為“無(wú)語(yǔ)義”類,像這樣:


  它的特點(diǎn)是什么仰美?樣式和結(jié)構(gòu)迷殿、內(nèi)容無(wú)關(guān),預(yù)先定義好這么一組規(guī)則咖杂,在需要的地方加上即可庆寺,我相信每個(gè)人第一次看到這種寫法的時(shí)候,都會(huì)想:還能這樣寫八咦帧懦尝?!是的壤圃,總有一些人陵霉,一些新的思想和方法會(huì)涌現(xiàn)出來(lái),它就是其中之一伍绳,當(dāng)然踊挠,并不是在稱贊其本身有多么好,而是說(shuō)這種現(xiàn)象和過(guò)程是好的冲杀,它本身經(jīng)常被人吐槽效床,比如:“這樣寫和直接內(nèi)聯(lián)有區(qū)別嗎?”权谁、“如果要調(diào)整樣式剩檀,就要去改HTML,維護(hù)更加麻煩旺芽,也有違樣式和結(jié)構(gòu)分離的初衷”等等沪猴,其實(shí)我個(gè)人也是不贊成上面這種寫法的,如果你要把這些抽離出來(lái)采章,那么還有什么抽不出來(lái)的呢字币?而且這些屬性,在項(xiàng)目之間共缕,頁(yè)面之間洗出,模塊之間,并沒(méi)有太大的通用性图谷,把這些抽出來(lái)翩活,只不過(guò)是稍微懶省勁兒些,但為了照顧到更多情況便贵,你必須寫入冗余代碼菠镇,是得不償失的。
  雖然它有缺點(diǎn)承璃,我個(gè)人贊成另外的一些東西分出來(lái)利耍,比如:浮動(dòng)(float)、文本布局(text-align)、Flexbox布局等隘梨,這些是沒(méi)有那么多可能性的值程癌,而且使用頻繁,復(fù)用方便轴猎,改動(dòng)較少嵌莉,除此之外,你還可以提取另外一些公共的小顆粒類捻脖,比如按鈕的種類锐峭,文字顏色的種類等,這些和CSS本身無(wú)關(guān)可婶,和項(xiàng)目相關(guān)沿癞,這就是借鑒其思想,而不是直接拿來(lái)用矛渴。
四椎扬、BEM
  嚴(yán)格說(shuō)來(lái),BEM不是一套有骨有肉的模式曙旭,也不僅僅局限你在CSS的層面去規(guī)劃,它是一種怎樣去組織桂躏、編寫代碼的思想,而且蛮位,看似簡(jiǎn)單的它,對(duì)前端界的影響卻是巨大的鳞绕。
  它的核心如下:
  Block(塊)失仁、Element(元素)们何、Modifier(修飾符)
  它幫助我們定義頁(yè)面中每一部分的級(jí)別屬性,從某種意義上說(shuō)冤竹,也是一種“拆”拂封。命名規(guī)則如下:

  它的出現(xiàn),曾給不少人帶來(lái)啟發(fā)鹦蠕,但是也有另一部分人仍然抱著挑剔的態(tài)度钟病,譬如:
  1刚梭、風(fēng)格不統(tǒng)一票唆,顯得代碼不夠整潔美觀
  2、可能會(huì)導(dǎo)致類名過(guò)長(zhǎng)
  還是前面說(shuō)的惰说,你可以不去直接用它吆视,但要清楚它的優(yōu)點(diǎn):能夠使得我們僅通過(guò)類名就知道哪些代碼是屬于一個(gè)模塊內(nèi)酥宴,以及在模塊中所起的作用。然后借鑒之授滓。
  當(dāng)然肆糕,BEM集聚了很多人的心血,也得到了很多的贊譽(yù)淮摔,其中就包括OOCSS的作者始赎。所以,它肯定不是這么簡(jiǎn)單魔招。它還會(huì)告訴你五辽,怎樣配合著js來(lái)寫,你的文件怎樣組織更好乡翅,項(xiàng)目該怎么構(gòu)建等髓迎。詳細(xì)可以到官網(wǎng)去查閱。
  從實(shí)際出發(fā)波势,決定結(jié)果的人是你
  到底怎樣使用設(shè)計(jì)模式?
  雖然已經(jīng)有成熟的設(shè)計(jì)模式拴曲,但在實(shí)際當(dāng)中凛忿,你可能覺(jué)得哪個(gè)跟自己的項(xiàng)目都不能完全吻合,或者你要去為了使用它們而調(diào)整叁熔,成本很高床牧。其實(shí)戈咳,我們不需要去迎合模式,要讓模式為我所用著蛙,你需要去了解它們背后的原理踏堡,要知道它們用什么方式解決了什么問(wèn)題,然后借鑒之胖秒,用它的方式解決我們的問(wèn)題慕的,就好,這樣就不需要作難要不要用风题,也不需要糾結(jié)選哪個(gè)嫉父,不是簡(jiǎn)單的說(shuō)哪個(gè)好,哪個(gè)不好摇肌,總有我們能夠用得上它的地方仪际。海納百川,集百家眾長(zhǎng)肯适。
  我個(gè)人一直以來(lái)所堅(jiān)持的另一個(gè)觀點(diǎn)就是,前端開(kāi)發(fā)的三駕馬車——html蹦玫、css刘绣、js额港,不要歧焦,也不能孤立的去談那樣好或者這樣好,我們極少會(huì)有只用一次的代碼或者模塊向瓷,也不會(huì)只寫一種語(yǔ)言舰涌,三駕馬車都是在一起協(xié)作的,都是會(huì)有復(fù)用朱躺、擴(kuò)展和團(tuán)隊(duì)合作多方面的因素在里面搁痛。故而鸡典,不能抱著這樣的想法:我現(xiàn)在就在做這個(gè),它就是唯一的谁尸,就是固定的纽甘,沒(méi)問(wèn)題。其實(shí)很多問(wèn)題都是潛在的决瞳,要帶著發(fā)展眼光去看待。項(xiàng)目的文件之間破婆,項(xiàng)目之間胸囱,團(tuán)隊(duì)成員之間烹笔,不論你的分工是哪塊,都要考慮到前后的影響和可能給合作帶來(lái)的不便饰豺。
  怎樣才是最佳實(shí)踐允蜈?有“實(shí)踐”,才有“最佳”漩蟆,脫離實(shí)際情況談最佳妓蛮,就是空中樓閣。那么捺癞,最好的模式构挤,不是哪個(gè)經(jīng)典的模式儿倒,而是在項(xiàng)目進(jìn)行中,不斷的磨合調(diào)整而出的彻犁。故而凰慈,不需要再懼怕看起來(lái)不明覺(jué)厲的設(shè)計(jì)模式,也不需要因?yàn)樽约哼€不懂設(shè)計(jì)模式而郁悶森篷,它就是人們總結(jié)出來(lái)的實(shí)戰(zhàn)方法仲智,你也可以有自己的模式~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剪验,隨后出現(xiàn)的幾起案子前联,更是在濱河造成了極大的恐慌似嗤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乘粒,死亡現(xiàn)場(chǎng)離奇詭異谓厘,居然都是意外死亡寸谜,警方通過(guò)查閱死者的電腦和手機(jī)属桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門聂宾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巾陕,你說(shuō)我怎么就攤上這事纪他〔杼唬” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵亡资,是天一觀的道長(zhǎng)锥腻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)展懈,這世上最難降的妖魔是什么供璧? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任睡毒,我火速辦了婚禮,結(jié)果婚禮上供搀,老公的妹妹穿的比我還像新娘钠至。我一直安慰自己,他們只是感情好屿脐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布的诵。 她就那樣靜靜地躺著佑钾,像睡著了一般休溶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芭碍,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天豁跑,我揣著相機(jī)與錄音,去河邊找鬼狐蜕。 笑死卸夕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡羔。 我是一名探鬼主播乖寒,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼院溺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼珍逸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叭爱,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤买雾,失蹤者是張志新(化名)和其女友劉穎缨称,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡当凡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年沿量,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴则。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钓简。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撤蚊,靈堂內(nèi)的尸體忽然破棺而出侦啸,到底是詐尸還是另有隱情,我是刑警寧澤庞萍,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布钝计,位于F島的核電站服赎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏践付。R本人自食惡果不足惜缺厉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一提针、第九天 我趴在偏房一處隱蔽的房頂上張望辐脖。 院中可真熱鬧,春花似錦艇抠、人聲如沸久锥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)青伤。三九已至,卻和暖如春亮蛔,著一層夾襖步出監(jiān)牢的瞬間擎厢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厘惦,地道東北人宵蕉。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像别智,于是被迫代替她去往敵國(guó)和親稼稿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子让歼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 什么是設(shè)計(jì)模式浦徊? 曾有人調(diào)侃天梧,設(shè)計(jì)模式是工程師用于跟別人顯擺的呢岗,顯得高大上;也曾有人這么說(shuō)悉尾,不是設(shè)計(jì)模式?jīng)]用挫酿,是你...
    kingZXY2009閱讀 278評(píng)論 0 2
  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案早龟? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,748評(píng)論 1 92
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 主播開(kāi)攝像頭露臉和觀眾一起看電影電視劇壹店,邊看邊聊芝加。就像要么選擇自己建網(wǎng)上商城,要么和淘寶合作入駐天貓将塑,也許以后大眾...
    missly117閱讀 183評(píng)論 0 0
  • 下午放學(xué)点寥,和好朋友在校門口不舍得分開(kāi)祥楣,兩個(gè)人拉著手不松開(kāi),如果沒(méi)事肯定就讓他倆玩了责鳍。(任同學(xué)每周三下午4:45分學(xué)...
    任同學(xué)的媽閱讀 534評(píng)論 0 2