標籤:

CSS新浪潮——Styled Components

編者按:本文由Athon在眾成翻譯平台上翻譯。

CSS很奇怪,你花上15分鐘就可以學會它的基礎,但是需要花費數年才能想到一個好方法來組織你的樣式。

造成上述問題的原因有一部分是語言本身的怪癖。除了盒模型以外,CSS是很局限的:沒有變數、循環或者函數。同時,它又允許你使用元素、類、ID或者它們的組合來改變樣式。

混亂的樣式表

你可能已經親身經歷過,樣式表常常是造成混亂的原因。儘管像SASS、LESS這種預處理語言添加了很多好用的特性,但是他們依舊沒有有效地阻止CSS變混亂。

於是組織代碼的任務就留給了像 BEM這樣的方法,雖然很有效,但是它完全是自選方案,不能被強制應用在語言或者工具層面。

CSS新浪潮

最近幾年,基於JavaScript的新工具正試圖通過改變CSS的書寫方式,從根本上解決這些問題。

Styled Components 就是其中之一,因為既具備創新性同時保留了編碼習慣,它很快吸引了大量的關注。因此如果你正在使用React(如果沒有,看看我的JS學習計劃 和我的 React簡介),你一定要看看這個CSS新方式。

我最近在用它重構我的個人網站,今天我想把我在重構過程中學到的東西在這裡分享一下。

組件,樣式化

關於Styled Components您首先要理解的是——正如它的名字所表示的——樣式化的組件。 你不必再根據類名或HTML元素來為HTML元素或組件寫樣式了:

<h1 className="title">Hello World</h1>nh1.title{n font-size: 1.5em;n color: purple;n}n

相反,你定義具有自己的封裝樣式的樣式化組件(styled components),然後就可以自由地在你的代碼中使用它:

import styled from styled-components;nconst Title = styled.h1`n font-size: 1.5em;n color: purple;n`;n<Title>Hello World</Title>n

這看上去有一些小的差異,而事實上兩者的語法很相似。但它們的關鍵區別在於樣式現在是組件的一部分了。

換句話說,我們正在擺脫 CSS 類名作為組件和其樣式的中間步驟這種情況。

就像styled-components的聯合創始人 Max Stoiber 所說:

「styled-components的最基本思想就是通過移除樣式和組件之間的映射來執行最佳實踐」

減少複雜性

乍一看會感覺這是反直覺的,因為使用CSS而不直接用帶樣式的html元素(還記得 <font>標籤嗎)的重點就是通過引用中介類名來解耦樣式和標記。

但是這種解耦也帶來了很多的複雜性,而且與CSS相比,像JavaScript這樣的「真正」的編程語言可以更好地處理這種複雜性。

用屬性(Prop)代替類名(Class)

為了遵循「去類名」(no-classes)的理念,當需要定義一個組件的行為時,styled-component使用屬性而不是類名。因此不應該用如下方式:

<h1 className="title primary">Hello World</h1> // will be bluenh1.title{n font-size: 1.5em;n color: purple;nn&.primary{n color: blue;n}n}n

你應該這樣寫:

const Title = styled.h1`n font-size: 1.5em;n color: ${props => props.primary ? blue : purple};n`;n<Title primary>Hello World</Title> // will be bluen

就像你看到的, styled-components通過封裝所有CSS和HTML相關的實現細節來讓您的組件更加乾淨。

也就是說,樣式組件的CSS仍然是CSS。這樣的代碼也是完全有效的(儘管平時不這麼用):

const Title = styled.h1`n font-size: 1.5em;n color: purple;nn &.primary{n color: blue;n }n`;n<Title className="primary">Hello World</Title> // will be bluen

這個特性讓styled-components很容易被接受:當它被懷疑的時候,你同樣可以使用你熟悉的方法去使用它!

注意事項

值得注意的是,styled-components還只是一個年輕的項目,很多新的特性還沒有被完全支持。例如,如果你想從父組件中為子組件添加樣式,你現在需要先使用CSS類名(至少要等到styled-components的v2版本出來才可以實現)。

這裡同樣還沒有在服務端預渲染你的CSS的「官方途徑」,雖然通過手動注入樣式肯定是可以實現的。

並且,styled-component會生成隨機的類名,這會導致很難用瀏覽器調試出你是在哪裡定義的樣式。

但是令人振奮人心的是 styled-components的核心成員意識到了所有這些問題,並且正在努力地逐一修復它們。 第二個版本即將發布,還有點小期待呢!

了解更多

我的目標不是詳細解釋styled-components是如何工作的,而是給您簡單的介紹他的特性,以便您自己決定是否使用它。

如果我已經激發了你的好奇心,你可以通過以下方式了解更多(編者註:點擊文末閱讀原文查看鏈接):

  • Max Stoiber最近在 Smashing Magazine上發表了一篇文章介紹為什麼要使用styled-components。
  • styled-components 項目本身就有大量的文檔。
  • Jamie Dixon寫的文章 使用styled-components的一些好處。
  • 如果你想知道這個庫是如何實現的,看看Max的這篇文章 。

如果你想要了解更多,你還可以看看 Glamor,它是CSS新浪潮的另一種實現方式!


推薦閱讀:

Adobe Brackets 用來寫 HTML 和 CSS 有什麼優勢和技巧?
一些編寫css的建議
HTML元素class屬性的主要作用是選定元素,還是歸納屬性?

TAG:CSS | 前端开发 |