CSS書寫規範與理論

来源:http://www.cnblogs.com/jinyuGu/archive/2017/12/11/8025587.html
-Advertisement-
Play Games

前端體系的變化可謂是日新月異,短短一年時間,從理論、框架、構建工具、甚至開發語言都發生非常大的變化。 隨著新項目就即將啟動,我抽時間回顧了一下以往項目的前端架構,零零散散產生了許多想法,儘量一一記錄下來,為新的框架搭建做點準備。 首先來聊聊CSS的的各種規範與理論。回顧過去的代碼,首先讓我頭痛不已的 ...


       前端體系的變化可謂是日新月異,短短一年時間,從理論、框架、構建工具、甚至開發語言都發生非常大的變化。 隨著新項目就即將啟動,我抽時間回顧了一下以往項目的前端架構,零零散散產生了許多想法,儘量一一記錄下來,為新的框架搭建做點準備。

       首先來聊聊CSS的的各種規範與理論。回顧過去的代碼,首先讓我頭痛不已的就是那些不知所謂的類名,以及數不清的難以維護的CSS/LESS代碼。

       我曾經對自己和前端小組的成員提出過要求,強制使用BEM方法來書寫CSS,但是在使用的過程中,也出現了總總問題。     

       它帶來的好處是顯而易見的,每個元素都被清晰描述出來,這也非常符合自文檔化代碼的要求。但同時也引發很多諸多問題

  • 單純使用BEM方法,並沒有很好的去構建CSS的結構
  • 複雜的業務邏輯帶來複雜的頁面,導致複雜的類名。
  • 組件的嵌套以及組件狀態使得一個元素上應用大量的類,這讓第二個問題更加嚴重

      在這個過程中,我們開始鬆懈了要求,這使得我們的CSS代碼又回到了混亂無序的原始時代。

      因此我想我必須去重新去探究CSS的各種規範與理論。

一、OOCSS(面向對象的CSS)

  OOCSS有兩個主要的原則:分離結構和外觀,以及分離容器和內容。

  與任何基於對象的編程方法一樣,OOCSS 的目的是鼓勵代碼復用,使得最終的樣式可以更快地和更有效地添加和維護。

    OOCSS風格的CSS也可以描述為兩點:增加class、不使用繼承選擇符。

<div class="box simple">
    <div class="box-content active">
           <p class="box-title">OOCSS</p>
    </div> 
</div>    

  上面這段代碼是一段遵循OOCSS模式的代碼

    • 其中"normal"作為外觀和結構分離,例如"simple"可用使用的是直角,我將"simple"換成"complex",就"box"變成了圓角。
    • 分離容器和內容,是指不再將元素位置作為樣式的限定詞,比如"box-title"就是文本的樣式,無論這個類作用在哪裡,都會是相同的樣式呈現。

       OOCSS的缺點

    • OOCSS適合真正的大型網站開發,因為大型網站用到的可重用性組件特別的多,如果運用在小型項目中可能見不到什麼成效。所以用不用OOCSS應該根據你的項目來決定。
    • 如果沒用巧妙的使用,創建組件可能對於你來說是一堆沒用的東西,成為一爛攤子,給你的維護帶來意想不到的杯具,說不定還是個維護的噩夢。
    • 最好給每一個組件備寫一份說明文檔,有助於調用與維護

二、SMACSS(模塊化架構可擴展CSS)

  我們把上面的代碼用SMACSS風格來再次寫出來

<div class="box box-simple">
    <div class="box-content is-active">
           <p class="box-title">SMACSS</p>
    </div> 
</div>   

  儘管SMACSS和OOCSS有許多相似之處。但不同點是它把樣式系統劃分為五個具體類別。

    • 基礎
      • 如果不添加CSS類名,標記會以什麼外觀呈現
      • 例如瀏覽器的 reset 可以寫在這裡
        html {}
        input[type=text] {}
        a:hover {}
    • 佈局
      • 把頁面分成一些區域,是指整個網站的「大架構」的外觀,而非button 這種小元件的 class
      • 通常只有一個選擇器,一個 id、或一個 class。
        .header {}
        .articles {}
        .sidebar {}
    • 模塊
      • 設計中的模塊化、可復用單元,就如同代碼中的"box-title"一樣,無論這個類作用在哪裡,都會是相同的樣式呈現
    • 狀態
      • 描述在特定狀態或情況下的顯示方式,代碼中的“is-active”就是一個狀態類
    • 主題
      • 一個可選的視覺外觀層,可以讓你更換不同主題   
      • 主題可以修改前面4個類別的樣式,且應和前面4個類別分離開來(便於切換,也就是“換膚”)。
      • SMACSS的Theme Rules不要求使用單獨的class命名,也就是說,你可以在佈局中定義.header{ },然後在主題中也用.header { }來定義需要修改的部分來覆蓋前面的樣式

             

三、BEM(塊元素修飾符)

  同樣的,使用BEM風格,重寫上面的代碼

<div class="box box--simple">
    <div class="box__content box__content--active">
           <p class="box__title">BEM</p>
    </div> 
</div> 

  BEM是一個CSS命名的命名規則,它不涉及如何書寫CSS的結構,只是建議每個元素都添加帶有如下內容的CSS類名

    • 塊名

      所屬組件的名稱

    • 元素

                     元素在塊裡面的名稱

    • 修飾符

      任何與塊或元素相關聯的修飾符

  BEM模式下,看起來很累贅、很冗餘,但是每一個CSS類名都很好的描述了它的作用,在結合LESS或者SASS使用時,會使它的書寫複雜程度降低。

四、規則文檔 

  我們往往會非常註重大的方法,而忘記細節,而一份完善的規則文檔會時刻提醒我們按照要求書寫代碼

  一份好的規則文檔,應該遵循以下規範:

    • 中包含不可變的規則,而不是籠統的說明
    • 總是把規則提煉成最簡單的表達
    • 總是首先說明規則 是什麼,再說明“如果不這樣,那麼會如何”
    • 每個規則必須包含以下詞中的一個——總是、永遠不要、只有、每一個、不要、要  

 

五、綜合方案

  就像開篇所說一樣,單純的使用BEM並沒有很好的解決我們在項目中所遇到能再的問題,反而產生了新的問題。

  但這並不是BEM的責任,CSS作為前端架構的重要一環,我們必須要針對項目來選擇一個合適的解決方案,而不是因為業界流行就去使用它。

  往往單一的理論是無法支撐起真實需求的,因此,我們必須結合現有的方法來制定一個新的方案。比如繼續堅持BEM風格以及js hook,同時引入SMACSS、OOCSS亦或者其他方法,並且用一份嚴格的規則文檔來規範整個項目的細節。

 

 


 

如果喜歡我的文章,可以掃描二維碼關註我的微信公眾號

爭取每天都分享一點我自己的開發和練習體驗~
qrcode_for_gh_a80ae0bf035f_344

 


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

-Advertisement-
Play Games
更多相關文章
  • 在前面已經初步封裝了一個MVP的網路請求框架,那隻是個雛形,還有很多功能不完善,現在進一步進行封裝。添加了網路請求時的等待框,retrofit中添加了日誌列印攔截器,添加了token攔截器,並且對DataManager類進行了擴展,真正體現它的作用,並且對大量的重覆代碼做了一定封裝,減少代碼的冗餘。 ...
  • 25條提高iOS App性能的技巧和訣竅 當我們開發iOS應用時,好的性能對我們的App來說是很重要的。你的用戶也希望如此,但是如果你的app表現的反應遲鈍或者很慢也會傷害到你的審核。 然而,由於IOS設備的限制有時很難工作得很正確。我們開發時有很多需要我們記住這些容易忘記的決定對性能的影響。 這是 ...
  • 一旦攻擊者將植入惡意代碼的仿冒的App投放到安卓商店等第三方應用市場,就可替代原有的App,進行公開下載、更新。網友安裝這些仿冒App後,不僅會泄露個人賬號、密碼、照片、文件等隱私信息,手機更可能被植入木馬病毒,進而或導致手機被ROOT,甚至被遠程操控。 ...
  • dispatch_sync 線程同步、dispatch_async線程非同步 比如 這些代碼輸出的結果是 1 2 3 4 依次輸出、無論你運行多少次都會是這一種結果 但是來看下麵的非同步呢? 輸出的結果是 1 2 3 4 隨機輸出、有時 2 1 3 4 有時 1 3 2 4 等 在iOS中是無法使用 d ...
  • [1]定義 [2]參數傳遞 [3]返回值輸出 [4]AOP [5]其他應用 ...
  • 很久不寫文檔,平時只寫日記,所以對這個有點生疏,如果寫的不好別介意。 今天閑的蛋疼,於是要寫寫白天的東西,並且以後也會一直更新(一直寫)下去。 時間太倉促了,這幾個月,今天算最晚的一次凌晨1點,吃不消的路過。 進入正題! 這是一個每次點擊添加指定數據的插件,基於jQuery封裝,調用方法名batch ...
  • 設置cookie: ...
  • 上一節看了一眼預編譯的總體代碼,這一節分析convert-argv模塊。 這個模塊主要是對命令參數的解析。 生成預設配置文件名數組 函數內部,首先判斷了argv.d與argv.p屬性是否存在,這個屬性來源於參數d與p,即webpack -d -p,測試如圖: 因為懶得加,所以直接跳過,進入到第二階段 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...