玩點不同之CSS的BEM規範

来源:http://www.cnblogs.com/ChengWuyi/archive/2016/07/14/5667945.html
-Advertisement-
Play Games

引言 人類自誕生開始,無論是鑿木取火還是製造武器,都是在不斷的解決問題。 所以說,人類的進步就是一個不斷解決問題的過程。 BEM引入背景 因為項目的業務邏輯發生重大變化,所以原來大半年的開發周期里做的事情基本上變成無用功。但是公司的項目上線時間依舊沒有改變。剩下的時間只有區區的兩個月,要做的功能是有 ...


引言

人類自誕生開始,無論是鑿木取火還是製造武器,都是在不斷的解決問題。

所以說,人類的進步就是一個不斷解決問題的過程。

BEM引入背景

因為項目的業務邏輯發生重大變化,所以原來大半年的開發周期里做的事情基本上變成無用功。但是公司的項目上線時間依舊沒有改變。剩下的時間只有區區的兩個月,要做的功能是有社區+電商+核心業務的網站,著實是非常的緊張。

所以為了在有限的時間裡面能夠完成,甚至於保質保量的完成項目的開發。正所謂非常時期,非常方法。我們必須要高效的完成設計稿到頁面輸出的這個過程,這時候SASS和一些模板引擎(我們使用的jade)配合自動化構建工具(gulp)就展示出了他們和傳統html配合css所不同的強力肌肉了。

BEM到底有什麼好的呢?

因為以前也用過sass,所以感覺有一個坑的地方就是:當dom結構比較複雜的時候,最後sass編譯完成以後的css的嵌套層級非常的深。

如果按照傳統的方式,為了防止css樣式衝突。我們會給我們的css類名增加深層次的嵌套。所以在寫sass的時候我們也按照這樣的方式來寫,結果就會出現如上圖css文件這般的樣式。這樣的話樣式如果需要進行查找和修改的時候就會非常的頭疼。而且眼睛也很累。所以很多人都覺得重寫css會比修改css要快樂得多。

所以,按照我在文章開頭所說的話推而廣之。技術的進步就是不斷解決問題的過程。那麼,問題來了:我們如何可以快樂的使用sass的特性,又可以減少層級的嵌套呢?

那就快使用BEM規範來書寫類樣式吧!今天就拿出來說說,希望能給大家有所裨益。

因為sass為我們引入了很多很強大的特性,例如巨集(mixin)和include。這樣就為了我們實現sass樣式的復用提供了一條康莊大道。既然sass可以復用了,除去表現,不考慮行為,剩下結構。就是我們的html了,既然html要能復用的話,就必須要將結構進行組件化的分割。

這也是BEM的核心思想:塊(block)、元素(element)、修飾符(modifier),我喜歡在這裡將塊稱為組件。

原始的BEM的規範如下:

.block{}
.block__element{}
.block__element--modifier{}

  

而我使用的是Nicolas Gallagher修改過規範,不同如下:

.block{}
.block__element{}
.block--modifier{}
//
.block-user{}
.block-user__element{}
.block-user--modifier{}

修改過的之所以使用兩個連字元和下劃線而不是一個,是為了讓你自己的塊可以用單個連字元來界定

我們來按照上面這個常用的Tab切換來做一個定量的分析。

按照BEM規範來看,tab這個切換就是一個可復用的組件。所以TAB就是一個組件

所以我們的頂級類名就是:.tab

每個單獨的tab頁簽就是一個單獨的元素:.tab__tab1,.tab__tab2...

每個單獨的tab元素就會有選中這樣的狀態,這裡就是最後一層:.tab__tab1--active

//BEM scss
.tab{} .tab__tab1{} .tab__tab1--active{}

//normal scss .tab{ .tab1{ .tab1_active{} } }

 改進後的BEM規範:

//BEM scss
.tab{}
.tab__tab1{}
.tab--active{}

如果我們有一個tab頁面是個豎版的怎麼辦呢?使用了改進版的如下

.tab-vertical{}
.tab-vertical__tab1{}
.tab-vertical--active{}

如果使用未改進版的BEM寫個豎版的,當然這個在BEM裡面未定義,而且相對而言,對於改進版而言的類命過長。

.tab-vertical{}
.tab-vertical__tab1{}
.tab-vertical__tab1--active{}

這樣我們就可以把組件化的sass寫成一個單獨的scss文件,當我們的結構需要使用到這個組件的時候,我們就把它include進去,因為是一個單獨的組件,所有無外乎你的最外層是什麼類命,我都可以使用。

//main.html
<div class="tab">
    <ul>
           <li class="tab__tab1 tab--active"></li>
           <li class="tab__tab1"></li>
           <li class="tab__tab2"></li>
    </ul>
</div>

 

總結:

因為使用了BEM規範,我們的類名高度的特異性。所以即使不嵌套類名,我們的樣式衝突的可能性也很小。只要整個團隊能遵循這個規範,需要修改的時候我們可以馬上定位要具體的組件,而且我們也可以很方便的瞭解到項目中其他同事想要表達的樣式信息。當然,BEM規範的受人詬病的地方也正是類名太長,不太美觀,而且如果沒有接觸過BEM規範的人來看css的話會一頭霧水,但是瑕不掩瑜。BEM一定會為你的項目加速。

正所謂技術無好壞,合適方最好。

想瞭解更多可以戳如下鏈接:

http://docs.emmet.io/filters/bem/

http://nicolasgallagher.com/about-html-semantics-front-end-architecture/




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有關xhEditor的文件上傳配置官方文檔鏈接:http://i.hdu.edu.cn/dcp/dcp/comm/xheditor/demos/demo08.html 一、xhEditor圖片上傳的配置 DWZ集成的xhEditor預設的配置是預設模式沒有如下圖上傳按鈕的,如果需要本地瀏覽上傳,則需 ...
  • 這裡要分享的是接著上篇:NET Core-學習筆記(一)展開的繼續學習core筆記,有不妥之處或者更好見解的地方希望各位朋友多多分享。 下麵是本篇將要分享的學習步奏,對於剛學或者即將要學習的朋友做個相互交流: 1.一起閱覽core框架自動生成的Controller代碼 2.路由及路由參數格式限制 3 ...
  • 第11行:一個細節問題 如果將 boolean b = (new File(files.getAbsolutePath()+s)).isFile(); 改為 boolean b = (new File(s)).isFile(); 則會一直返回false,因為沒有指定路徑,系統會在項目的目錄找s所指向 ...
  • Windows和Linux(Ubuntu)下安裝Scala及ScalaIDE ...
  • 上一篇已經完成了polls的基本功能,接下來完善剩下的vote功能和並使用generic views改進請求處理view。包含表單的簡單運用和前後臺參數傳遞。 目錄 vote:完善投票功能 generic views:改進views.py vote 編輯detail.html,添加投票投票功能 添加 ...
  • 虛函數引入原因:為了方便使用多態特性,我們常常需要在基類中定義虛函數,在子類中實現虛函數。 class Cman { public: virtual void Eat(){……}; void Move(); private: }; class CChild : public CMan { publi ...
  • Learning Django Django makes it easier to build better Web apps more quickly and with less code. Web Resource 1. "Django Project Doucment" 2. "Django ...
  • 獲取【下載地址】 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單;freemaker模版技術 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...