CSS進階:提高你前端水平的 4 個技巧

来源:http://www.cnblogs.com/qianduantuanzhang/archive/2017/11/14/7833151.html
-Advertisement-
Play Games

譯者註:隨著 Node.js 、react-native 等技術的不斷出現,和互聯網行業的創業的層出不窮,瞭解些前端知識,成為全棧攻城師,快速的產出原型,展示你的創意,對程式員,尤其是在創業的程式員來說,越來越重要,下麵我們就跟隨著名國外開發者網站上的熱推文章《Leveling up in CSS》 ...


譯者註:隨著 Node.js 、react-native 等技術的不斷出現,和互聯網行業的創業的層出不窮,瞭解些前端知識,成為全棧攻城師,快速的產出原型,展示你的創意,對程式員,尤其是在創業的程式員來說,越來越重要,下麵我們就跟隨著名國外開發者網站上的熱推文章《Leveling up in CSS》,從提升你的CSS技巧開始。

 

CSS 在剛開始學習的時候看起來非常簡單。畢竟,它僅僅就是些樣式而已,事實上是這樣嗎?

但是,隨著你的不斷瞭解。很快,你會發現 CSS 沒你想象的那麼簡單,它複雜且有深度。

做好這四件事情,能讓你在大規模使用 CSS 的時候保證代碼的健壯性:使用適當的語義,模塊化,採用統一的命名規範,遵循單一功能原則。

使用適當的語義

在 HTML 和 CSS 編程中有語義標註的概念。語義是指單詞的含義和他們間的關係。在 HTML 編程中,意味著你需要使用一個合適的標簽名字來標記。下麵是一個經典的例子。

 <!-- bad --> 
 <div class = ”footer” </div>
 <!-- good -->
 <footer></footer>

富有語義的 HTML 是非常簡單明確的。另一方面,富有語義的 CSS 則是更抽象和主觀的。編寫富有語義的 CSS 意味著在選擇類型的時候,類名要傳達出結構和功能信息。類名要很容易被理解。確保它們不要太具體、太特殊。這樣,你就可以復用它了。

 

為了闡述什麼是一個良好的類名,請看這個簡化了的 Medium 網站的 CSS 例子。

<div  class ="stream">
 <div  class="streamItem">
 <article  class="postArticle">
  <div  class = "postArticle-content">
<!-- content -->
 </div>
 </article>
 </div>
</div>

通過這些代碼,你可以立即識別出它們的結構、功能和含義。父節點的類名是 stream ,內容是一個文章列表。它的子節點的類名是 streamItem ,內容是文章列表中的一篇具體的文章。這使我們很容易的瞭解到父節點和子節點之間的關係。並且,這些類可以在每一個有文章功能的頁面中使用。

你可以像閱讀一本書一樣讀 HTML 和 CSS。它會給你講一個故事。通過故事你可以瞭解故事中的每一個角色和他們之間的關係。語義豐富的 CSS 代碼容易理解,更便於維護。

若果你想進一步瞭解語義相關的內容,看看 《怎麼富有語義的為類命名》、《CSS 命名不簡單》 和 《富有語義和容易識別(的代碼命名)》,再看 《關於 HTML 命名和前端架構》。

模塊化

在這個充滿了組件庫(以 React 為例)的時代,模塊化就是王者。組件就是由已經解構了的介面創建的可組合的模塊。下麵是一個Product Hunt(一種發佈好的創業項目的網站)前端頁面。作為練習,讓我們將這個頁面分解成一系列的組件。

 

每種顏色框代表一個組件,stream 節點下分為好多個 stream item 子節點。

 <div class = "stream" >
 <div class = "streamItem" >
 <!-- product info -->
 </div>
 </div>

大多數組件都可以分解為更小的組件。

 

每一個 stream item 組件都有一個縮略圖和一個特色的產品信息。

 <!-- STREAM COMPONENT -->
 <div class = "stream" >
 <div  class = "streamItem" >
 <!-- POST COMPONENT -->
 <div  class = "post" >
 <img  src = "thumbnail.png" class = "postThumbnail" />
 <div  class = "content" >
 <!-- product info -->
 </div>
 </div>
 </div>
 </div>

由於 stream 組件和它的子控制項是完全獨立的,你可以很容易的調整或者更換 post 組件,並且這不會對 stream 組件產生任何影響。

使用組件的思想將會使你的代碼解耦。解耦的代碼越多,你的類之間的依賴就越低。這會讓你的代碼更容易修改,並且使你的代碼更長時間的工作下去而不用修改它。

 

組件驅動設計

模塊化你的 CSS 時,首先將你的設計分解成多個組件。你可以使用紙和筆,也可以使用類似 Illustrator 或者 Sketch 這類的軟體。確定你將要如何命名這些組件,同時理清各個組件之間的關係。

閱讀更多關於 CSS 組件驅動的文章,詳見《CSS 建構:可擴展和模塊化處理》、《使用 Sass 編寫模塊化的 CSS》和《模塊化你的前端代碼——編寫高可維護和條理清晰的代碼》。

採用統一的命名規範

目前有幾十個不同版本的 CSS 命名規範。有些人對他們選擇的命名規範極其篤定,認為他們的比別人的更好。事實上,不同的人喜歡不同的命名規範。我聽到的最好的建議是:選擇你覺得最合適的命名規範。

下麵簡單列舉一下常用的命名規範:

  • Object oriented CSS OOCSS

  • Block element modifier (BEM)

  • Scalable and modular architecture for CSS (SMACSS)

  • Atomic

我最喜歡的命名規範是 BEM。BEM 代表塊(block)、元素(element)和修飾符(modifier)。Yandex,在俄羅斯的相當於谷歌的搜索引擎,為瞭解決他們 CSS 代碼庫中的縮放問題而提出了它(它指BEM)。

 

BEM 是一個極其簡單——又極其嚴格——的命名規範。

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

塊(Blocks)代表高級別的類。元素(Elements)是塊的子模塊。修飾符(modifiers)代表不同的狀態。

 
 <div class = "search" >
 <input  type= "search__btn search__btn--active"  />
 </div>

在上面的示例中, search 是塊(block),search button是它的元素(element)。如果你想要更改按鈕的狀態,我們可以為按鈕增加一個修飾符,例如 active 。

關於命名規範要記住的一件事是,無論你喜歡哪種命名規範,你會經常繼承或者工作在不同標準的代碼庫上。請敞開心扉去學習新的標準,用不同的思維去思考 CSS 。

你可以在《深入學習 BEM 語法》、《BEM 101》和《BEM 簡介》上看到更多關於 BEM 的信息。想要瞭解不同的命名規範,參見《OOCSS、ACSS、BEM、SMACSS:這些是什麼?我該用哪個?》。

遵循單一功能原則

單一功能原則規定每個模塊和類都應該有一個單一的功能,並且該功能應該由這個類完全封裝起來。

在 CSS 中,單一功能原則代表每一段代碼、類和模塊只做一件事。當我們提交 CSS 文件時,這意味著每個獨立的組件(例如輪播效果和導航欄)都應該有自己的 CSS 文件。

 /
 components
 |-  carousel
 |- |-  carousel .css
 |- |-  carousel.partial . html
 |- |-  carousel . js
 |-  nav
 |- |-  nav . css
 |- |- nav .partial . html
 |- |-  nav . js

另外一個常見的組織文件的方式是按照功能將文件分組。舉個慄子,如上面所示,所有和輪播效果組件有關的文件都被分類到了一起。採用這種方式可以讓你更容易的找到相關文件。

除了對組件的樣式進行分離之外,最好利用單一功能原則對全局樣式也進行分離。

 / base
 |-  application . css
 |-  typography . css
 |-  colors . css
 |- grid . css

在這個例子中,每個相關的樣式被分離到自己的樣式文件中。這樣,如果你想要修改樣式中的顏色,那麼你將會很容易的找到它。

無論你使用哪種方式組織文件結構,儘量在決定的時候參考單一功能原則。一旦有某個文件開始變的臃腫,那麼考慮按照邏輯功能將它分成多個部分。

更多有關組織文件結構和 CSS 架構的文章,詳見《Sass 審美 1:架構和組織樣式文件》和《可擴展和可維護的 CSS 架構》。

當單一功能原則應用於你的每一個 CSS 類選擇器中時,這意味著每一個類選擇器都有著唯一的功能。換句話說,要根據不同關註點將樣式分離到不同的類選擇器中。下麵是個經典的例子:

 .splash {
background : #f2f2f2 ;
 color :#fffff ;
 margin : 20px ;
 padding: 30px;
 border-radius : 4px;
 position : absolute ; 
 top : 0 ;
 right: 0 ;
 bottom : 0 ;
 left: 0 ;
 }

在上面的例子中,我們將關註點耦合了。splash 這個類不但包含了本身的樣式和邏輯,同時也包含了它的子節點的。為瞭解決這個問題,我們可以將這段代碼分離為兩個新的類。

 .splash {
   position: absolute;
   top: 0;
  right: 0;
   bottom: 0;
  left: 0;
 }

現在我們有 splash 和 splash content 兩個類。我們可以將 splash 作為一個一般的全屏類,它可以擁有任何子節點。所有子節點關註的屬性,都在 splash content 中,與父節點的屬性是完全解耦的。

你可以通過閱讀下列文章進一步瞭解單一功能原則在樣式表和類中的應用。《單一功能原則在 CSS 中的應用》和《單一功能原則》。

簡單勝過複雜

如果你問任何一個成功的前端開發工程師或者 CSS 架構師,他們會告訴你,他們從來沒有對自己的代碼完全滿意。寫好 CSS 是一個不斷迭代的過程。從簡單開始,遵循基本的 CSS 規則和樣式指南,然後不斷迭代。

我很想知道你的 CSS 學習之路。你喜歡的命名規範是什麼?你是怎樣組織你的代碼文件的?你可以隨時通過留言或者在 Tweet 上告訴我。

我有一個前端學習交流QQ群:328058344 如果你在學習前端的過程中遇到什麼問題,歡迎來我的QQ群提問,群里每天還會更新一些學習資源。禁止閑聊,非喜勿進。


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

-Advertisement-
Play Games
更多相關文章
  • 今天項目需要一份根據本地數據的篩選分頁功能,好吧,本來以為很簡單,網上搜了搜全是ajax獲取的數據,這不符合要求啊,修改起來太費力氣,還不如我自己去寫,不多說直接上代碼 效果圖: 項目需要:點擊左側進行數據篩選,實現自動分頁,自動生成頁數,點擊自動跳轉 項目代碼:js代碼 下麵是html節點代碼: ...
  • 需求場景 在前端開發中,偶爾需要驗證下某個元素上到底綁定了哪些事件,以及監控某個元素上的事件觸發情況。 解決方案 普通操作 之前面對這種情況,一般採取的措施就是在各個事件里寫console.info,然後進行點擊等操作觸發事件,或者在控制台trigger元素上的事件,或者dispatchEvent。 ...
  • 這個需要對Excel表格的表頭編碼規則有所瞭解,目前示例代碼只擴展到52個欄位 /** *json數據導入導出Excel表格示例代碼 * / var array_utils = require('./utils-array')var XLSX = require("xlsx");module.exp ...
  • 近期公司需要按照安卓app去開發h5項目,但是後端人手緊缺,沒人整理介面文擋,就只能自己抓介面。 在網上自己學習,然後整理了我所用到的,以便日後自己還要使用方便查看,在此記錄。需要的胖友們也可以查看 參考學習來源1:http://blog.csdn.net/jiangsanfeng1111/arti ...
  • 對於沒參加過互聯網企業招聘,或是沒有參加過大型互聯網企業招聘的人來說,能以這些公司的面試題做為鍛煉,無疑是一種非常好的學習和進步的途徑。下麵是一道騰訊的前端面試題(JS解答),題目本身在現實中意義不大,主要是考察應試者對js及演算法的理解程度,本文給出了三種答案,期待有更大的俠來一試身手,做出更好的解 ...
  • 分頁有兩種方式: 1. 前臺分頁:ajax一次請求獲取全部數據,適合少量數據(萬條數據以下); 註意:1. bootstrap3中分頁的HTML部分要求使用ul標簽;2. 前臺寫分頁演算法。 2. 後臺分頁:發送多次ajax,每次獲取指定頁數的數據(萬條數據以上)。 註意:1. bootstrap3中 ...
  • ()這裡用的是input做的點擊發送驗證碼<input type="number" class="input" name="mobile" placeholder="手機號" style="border: none"<input class="hui_kuang"style="width: 30%; ...
  • 使用的插件為LArea 使用方法 出現的問題:點擊input時會預設彈出軟體盤,與插件彈出的省市區選擇器重疊 解決辦法: $("#txt_area").focus(function () { document.activeElement.blur(); }); 或者 插件地址http://www.5 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...