擁抱 Sass:為什麼你應該停止使用 Vanilla CSS

已發表: 2022-03-11

當我第一次聽說 Sass 和其他 CSS 預處理器時,我的確切想法並不是很熱情。 “為什麼我們需要另一個工具來處理已經像 CSS 一樣漂亮的東西?”。 “我不會用那個”。 “我的 CSS 已經足夠有序,不需要它”。 “預處理器適用於不知道如何編寫 CSS 的人,如果您知道如何編寫 CSS,則不需要預處理器”。 “畢竟,處理器是為不知道如何編寫 CSS 的人準備的。 如果他們這樣做了,他們就不需要預處理器了”。 我實際上避開了它們一段時間,直到我被迫在幾個項目中使用它。

擁抱一次 Sass,你可能再也不想回到原版 CSS

擁抱一次 Sass,你可能再也不想回到原版 CSS
鳴叫

直到最近,當我不得不在一個項目中切換回 vanilla CSS 時,我才意識到我有多喜歡使用 Sass。 在那段時間裡,我學到了很多,我決定讚美薩斯,讓這個世界變得更美好,讓你成為一個更快樂的人!

為什麼仍然使用 Sass?

組織:@import

我剛才提到的這個項目,一個大型電子商務網站,只有一個 CSS 文件,其中包含 7184 行未壓縮的樣式聲明。 是的,你沒看錯:七千一百八十四行 CSS。 我確信這不是業界前端開發人員必須處理的最大的 CSS 文件,但它足夠大,可以完全一團糟。

這是您需要 Sass 的第一個原因:它可以幫助您組織和模塊化您的樣式表。 它不是變量,也不是嵌套。 對我來說,Sass 的關鍵特性是部分以及它如何擴展 CSS @import 規則以允許它導入 SCSS 和 Sass 文件。 在實踐中,這意味著您將能夠將巨大的 style.css 文件拆分為幾個更易於維護、理解和組織的較小文件。

Sass 幫助你組織和模塊化你的樣式表

Sass 幫助你組織和模塊化你的樣式表
鳴叫

@import 規則幾乎與 CSS 本身一樣長。 然而,它卻名聲不佳,因為當您在 CSS 文件中使用 @import 時,您會觸發單獨的 HTTP 請求,每個要導入的 CSS 文件都有一個請求。 這可能會損害您網站的性能。 那麼你在 Sass 中使用它會發生什麼? 如果您從未停下來思考“預處理器”一詞的含義,那麼現在是時候了。

預處理器是一個程序,它處理其輸入數據以產生用作另一個程序輸入的輸出。 ——維基百科

所以,回到我們的 @import 規則,這意味著 @import 將由 Sass 處理,我們所有的 CSS 和 SCSS 文件將被編譯成一個文件,最終將出現在我們的實時站點中。 用戶只需提出一個請求並下載一個文件,而您的項目結構可以由數百個模塊化文件組成。 這就是典型 Sass 項目的 style.scss 的樣子:

 @import “variables”; @import “reset”; @import “fonts”; @import “base”; @import “buttons”; @import “layout”;

不要重複自己:變量

任何讚美 Sass 的文章都可能首先提到它的明星特性——變量。 變量最常見的用途是調色板。 有多少次你發現幾個應該是相同顏色的聲明,因為沒有人使用相同的十六進制代碼,最終在 CSS 中顯示為略有不同的陰影? 薩斯來救援。 在 Sass 中,您可以聲明幾乎任何值的變量。 所以,我們的調色板可以是這樣的:

 $brand: #226666; $secondary: #403075; $emphasis: #AA8439;

以“$”開頭的單詞是 Sass 變量。 這意味著稍後在您的樣式表中,您將能夠使用這些詞,並且它們將被映射到您之前定義的值:

 body { background: $secondary; } .logo { color: $brand; } a { color: $emphasis; } a:hover { color: $brand; }

想像一下這將如何改變我們的 7184 行 CSS 代碼,你可能現在就開始渴望 Sass。 更好的是,想像一下品牌重新設計,您需要更新 CSS 中的所有顏色。 使用 Sass,您唯一需要做的就是更新這些變量的聲明一次,然後 baam! 更改將圍繞您的樣式表進行。

我在 Sass 遊樂場 Sassmeister 中編寫了這個示例。 所以繼續嘗試將​​這些變量更改為其他變量。

變量的用處不僅限於顏色,還包括字體聲明、大小、媒體查詢等等。 這是一個非常基本的例子,可以給你一個想法,但相信我,Sass 的可能性是無窮無盡的。

Sass 的可能性是無窮無盡的
鳴叫

更乾淨的源代碼:嵌套

嵌套可能是 Sass 中被提及次數第二多的特性。 當我在使用 Sass 後回到 vanilla CSS 時,我正在查看的 CSS 文件看起來非常混亂,以至於我不確定它是否被縮小了。 沒有嵌套,vanilla CSS 看起來並不比漂亮打印的 .min.css文件更好:

 .header { margin: 0; padding: 1em; border-bottom: 1px solid #CCC; } .header.is-fixed { position: fixed; top: 0; right: 0; left: 0; } .header .nav { list-style: none; } .header .nav li { display: inline-block; } .header .nav li a { display: block; padding: 0.5em; color: #AA8439; }

使用嵌套,您可以在聲明的大括號之間添加類。 Sass 將非常直觀地編譯和處理選擇器。 您甚至可以使用“&”字符來獲取父選擇器的引用。 回到我們的示例 CSS,我們可以將其轉換為:

 .header { margin: 0; padding: 1em; border-bottom: 1px solid #CCC; &.is-fixed { position: fixed; top: 0; right: 0; left: 0; } .nav { list-style: none; li { display: inline-block; a { display: block; padding: 0.5em; color: #AA8439; } } } }

它看起來很漂亮,更容易閱讀。 隨意玩這個例子。

再次! 不要重複自己:混合和擴展

CSS 中的重複總是難以避免。 再強調一點也沒有什麼壞處,尤其是當 Sass 為您提供 mixins 和擴展時。 它們都是強大的功能,有助於避免大量重複。 mixins 和extends 的可能性似乎沒有盡頭。 使用 mixins,您可以進行參數化 CSS 聲明並在整個樣式表中重用它們。

使用 Sass 保持乾燥

使用 Sass 保持乾燥
鳴叫

例如,假設您有一個盒子模塊,裡面有一個按鈕。 您希望框的邊框和按鈕的背景顏色相同。 使用 vanilla CSS,您可以執行以下操作:

 .box { border: 2px solid red; } .box .button { background: red; }

假設您現在想要相同的盒子模塊,但顏色不同。 您將在 CSS 中添加如下內容:

 .box-alt { border: 2px solid blue; } .box-alt .button { background: blue; }

現在,假設您想要一個盒子模塊,但邊框更薄。 你會添加:

 .box-slim { border: 1px solid red; } .box-slim .button { background: red; }

很多重複,對吧? 使用 Sass,您可以抽像出這些案例以減少重複。 你可以像這樣定義一個mixin:

 @mixin box($borderSize, $color) { border: $borderSize solid $color; .button { background: $color; } }

因此,您的源代碼可以簡化為:

 .box { @include box(2px, red); } .box-alt { @include box(2px, blue); } .box-slim { @include box(1px, red); }

看起來很漂亮,對吧? 玩這個例子。 您可以創建自己的 mixin 庫,或者更好的是,您可以使用其中一個社區庫。

擴展是類似的,它們讓您可以將屬性從一個選擇器共享到另一個選擇器。 但是,它們不是輸出多個聲明,而是輸出一個類列表而不重複您的屬性。 這樣,您也可以避免在輸出中重複代碼。 讓我們忘記前面示例中的按鈕,看看@extend 如何與 .boxes一起工作。

假設您聲明了第一個框:

 .box { margin: 1em; padding: 1em; border: 2px solid red; }

現在您需要兩個與此類似的框,但邊框顏色不同。 您可以執行以下操作:

 .box-blue { @extend .box; border-color: blue; } .box-red { @extend .box; border-color: red; }

這是編譯後的 CSS 的樣子:

 .box, .box-blue, .box-red { margin: 1em; padding: 1em; border: 2px solid red; } .box-blue { border-color: blue; } .box-red { border-color: red; }

很強大,對吧? 您可以在此處找到示例。 如果您查看生成的 CSS,您會發現.box類已包含在輸出中。 如果您不想要這種行為,您可以將@extend與“佔位符”結合使用。 佔位符是一種特殊的選擇器,不會在 CSS 中輸出類。 例如,我有時會發現自己經常重置列表的默認樣式。 我通常將@extend 與這樣的佔位符一起使用:

 %unstyled-list { list-style: none; margin: 0; padding: 0; }

然後,您可以在所有樣式表中重用此模式:

 .search-results { @extend %unstyled-list; } .posts { @extend %unstyled-list; } .nav { @extend %unstyled-list; }

您編譯的 CSS 將如下所示:

 .search-results, .posts, .nav { list-style: none; margin: 0; padding: 0; }

在此處查看示例。

還有更多嗎?

絕對地! 我不想讓這篇文章過於復雜,但是有一個Sassy的世界等著你去發現; 除此之外還有很多功能:操作、帶有 // 的單行註釋、函數、if 循環……如果你曾經想過“用 CSS 做一些 'X' 的事情會很棒”,我敢肯定那個東西'X'已經由Sass完成了。 “CSS with superpowers”是它的標語,這再貼切不過了。

結論

去訪問安裝頁面並開始黑客攻擊! 相信我,你不會後悔的。

是的,有一些 Sass 的替代品。 其他預處理器(LESS、Stylus)、後處理器、Grunt 等。甚至還有 CSS 變量。 我並不是說 Sass 是唯一的技術。 我只想說這是最好的! 至少現在。 不相信我說的話? 來吧,自己嘗試一下。 你不會後悔的!

相關: *探索 SMACSS:CSS 的可擴展和模塊化架構*