關鍵要點
CSS 命名約定有很多。您可能已經了解 BEM 和 SMACSS(後者不僅僅是命名約定)。還有 OOCSS,它更像是一種完整的方法論。它們都嚴重依賴 CSS 類選擇器,因為它們具有很強的可重用性。
使用 Sass 可以幫助以更模塊化的方式編寫這些選擇器。通過選擇器嵌套和 mixin,我們可以提出花哨的瘋狂的解決方案來構建所需的 API。在本文中,我將(重新)介紹其中幾種方法,列出我認為每種方法的優缺點。
原生選擇器嵌套
為了不必重複原始塊名稱而能夠嵌套選擇器,這在 Sass 中一直是一個長期要求的功能。在 Sass 3.3 版本中,此功能最終已引入。在測試版期間,首先使用非常奇怪的語法,後來在穩定版本上線時更改為更好的語法。 Natalie Weizenbaum 在這篇文章中解釋了更改背後的原因。
基本上,引用選擇器(&)可以用作子類名稱的一部分,以便從文檔的根級別(這意味著此處不需要@at-root)創建第一個類名稱的另一個類名稱。
<code>.foo { // .foo 的样式 &-bar { // .foo-bar 的样式 } }</code>
此功能很快就被過度使用來編寫 BEM 選擇器,例如非常流行的媒體對象:
<code>.media { // .media 块的样式 &__img { // .media__image 元素的样式 &--full { // .media__image--full 修改后的元素的样式 } } &--new { // .media--new 修饰符的样式 } }</code>
之前的代碼將編譯為:
<code>.media {} .media__img {} .media__img--full {} .media--new {}</code>
BEM mixin
因為在Sass 3.3 的測試版期間類生成的語法非常難看(@at-root #{&}__element),我們很快就在這里和那裡看到了一些mixin 來隱藏痛苦並提供更友好的API 。
<code>.foo { // .foo 的样式 &-bar { // .foo-bar 的样式 } }</code>
您可以像這樣使用它們:
<code>.media { // .media 块的样式 &__img { // .media__image 元素的样式 &--full { // .media__image--full 修改后的元素的样式 } } &--new { // .media--new 修饰符的样式 } }</code>
我們也可以以同樣的方式創建一個塊 mixin,但它不會像塊那樣有用,因為塊只是一個類名稱。讓我們保持簡單。儘管對於某些人來說,修飾符和元素似乎太長了,所以我們看到一些 e 和 m 在盛開。
<code>.media {} .media__img {} .media__img--full {} .media--new {}</code>
Humanified-BEM mixin
最近,我閱讀了 Anders Schmidt Hansen 的一種新的類似 BEM 的方法。其思想是將 Block-Element-Modifier 專業術語隱藏在朗讀時有意義的常用詞彙後面。
<code>@mixin element($element) { &__#{$element} { @content; } } @mixin modifier($modifier) { &--#{$modifier} { @content; } }</code>
在這種情況下,重點是將代碼隱藏在精心命名的 mixin 後面,以便代碼看起來像是在講述一個故事,因此新的 mixin 實際上很有用。
<code>.media { // .media 块的样式 @include element("image") { // .media__image 元素的样式 @include modifier("full") { // .media__image--full 修改后的元素的样式 } } @include modifier("new") { // .media--new 修饰符的样式 } }</code>
Anders 進一步使用 is(..) 和 holds(..) mixin。整個想法讓我想起了我的 when-inside(..) mixin,當根據其上級上下文設置元素樣式時,它將 & 隱藏在一個用戶友好的 mixin 後面。
<code>.media { // .media 块的样式 @include e("image") { // .media__image 元素的样式 @include m("full") { // .media__image--full 修改后的元素的样式 } } @include m("new") { // .media--new 修饰符的样式 } }</code>
最終想法
請記住,使用任何這些技術都會阻止選擇器代碼庫可搜索,因為選擇器在由 Sass 生成之前實際上並不存在。在選擇器之前添加註釋可以解決這個問題,但為什麼不一開始就直接編寫選擇器呢?
如果您關心擁有可搜索的代碼庫,請不要使用新的 Sass 功能來 BEM 化所有選擇器(.b { &__e { } })。
— Kaelig (@kaelig) 2014 年 3 月 12 日
無論如何,朋友們,以下是我知道的用 Sass 編寫 CSS 選擇器最流行的方法,在我和你之間,我不喜歡它們。而且不僅僅是因為搜索問題,對我來說這並不是什麼大問題。
我可以看出他們試圖解決的問題,但有時簡單勝過 DRY。重複根選擇器並不是什麼大問題,它不僅使代碼更易於閱讀,因為嵌套較少,而且更接近 CSS。
有時簡單勝過 DRY。
— Hugo Giraudel (@HugoGiraudel) 2015 年 5 月 19 日
使用 SASS 結構化 CSS 類選擇器對於維護乾淨、有序和高效的樣式表至關重要。 SASS(代表 Syntactically Awesome Stylesheets)是一種 CSS 預處理器,允許開發人員使用變量、嵌套規則、mixin 和函數,使 CSS 更具動態性和可重用性。通過結構化類選擇器,您可以創建樣式層次結構,從而更容易理解不同元素及其樣式之間的關係。這可以極大地提高 CSS 代碼的可維護性和可擴展性。
通配符選擇器,也稱為通用選擇器,可以在 SASS 中用於選擇與特定模式匹配的任何元素。例如,您可以使用通配符選擇器“*”來選擇所有元素。但是,SASS 不直接支持通配符類名。如果您想選擇類名以特定字符串開頭的元素,則需要使用變通方法,例如使用屬性選擇器。例如,您可以使用選擇器[class^="prefix-"]
來選擇所有類名以“prefix-”開頭的元素。
是的,@extend 指令可以在 SASS 中與類選擇器一起使用。 @extend 指令允許一個選擇器繼承另一個選擇器的樣式。這對於減少 CSS 代碼中的冗餘非常有用。例如,如果您有兩個類共享許多相同的樣式,則可以在一個類中定義這些樣式,然後使用 @extend 指令將這些樣式應用於另一個類。
SASS 提供了一些功能,可以幫助您更有效地組織 CSS 代碼。其中一項功能是嵌套,它允許您將 CSS 選擇器嵌套在其他選擇器中,從而反映 HTML 結構。這可以使您的 CSS 代碼更易於閱讀和維護。另一個功能是變量,它允許您定義可重用的值。這對於維護樣式的一致性(例如顏色、字體和間距)非常有用。
使用 SASS 結構化 CSS 類選擇器有幾種最佳實踐。一種最佳實踐是使選擇器盡可能具體。這可以幫助防止樣式意外影響其他元素。另一種最佳實踐是使用有意義的類名來描述元素的目的或功能。這可以使您的 CSS 代碼更易於閱讀和維護。此外,最好對您的類使用一致的命名約定,例如 BEM(塊、元素、修飾符),以便更容易理解不同類之間的關係。
SASS 中的 mixin 是一種定義可以在整個樣式表中重用的樣式的方法。 mixin 使用 @mixin 指令定義,後跟名稱和 CSS 代碼塊。然後,您可以使用 @include 指令(後跟 mixin 的名稱)在任何選擇器中包含 mixin。這對於減少 CSS 代碼中的冗餘並使其更易於維護非常有用。
是的,SASS 支持函數,可用於生成 CSS 代碼。 SASS 中的函數使用 @function 指令定義,後跟名稱和代碼塊。函數可以接受參數,並返回一個值,該值可以在您的 CSS 代碼中使用。這對於創建依賴於特定條件或計算的複雜樣式非常有用。
SASS 中的 @import 指令可用於將其他 SASS 文件導入 SASS 文件。這對於將 CSS 代碼組織到單獨的文件中非常有用,每個文件都專注於網站樣式的特定部分。例如,您可以為頁眉樣式、頁腳樣式和主要內容樣式創建單獨的 SASS 文件,然後將它們全部導入主 SASS 文件。
SASS 中的 & 運算符可用於在嵌套規則中引用父選擇器。這對於創建偽類或偽元素選擇器非常有用。例如,如果您有一個嵌套規則用於 .link 規則內的 a:hover,則可以使用 & 運算符創建選擇器 .link:hover。
SASS 中的 @media 指令可用於創建媒體查詢,允許您根據查看頁面的設備的特性(例如其寬度或高度)應用不同的樣式。這對於創建適應不同屏幕尺寸的響應式設計非常有用。您可以將 @media 指令用於選擇器中,僅當媒體查詢條件滿足時才應用樣式。
以上是與SASS結構CSS類選擇器的詳細內容。更多資訊請關注PHP中文網其他相關文章!