目錄
優點
缺點
關於使用 SASS 結構化 CSS 類選擇器的常見問題
使用 SASS 結構化 CSS 類選擇器的意義是什麼?
如何在 SASS 中使用通配符選擇器?
我可以在 SASS 中使用 @extend 指令與類選擇器嗎?
如何使用 SASS 更有效地組織 CSS 代碼?
使用 SASS 結構化 CSS 類選擇器的最佳實踐是什麼?
如何在 SASS 中使用 mixin 重用 CSS 代碼?
我可以在 SASS 中使用函數生成 CSS 代碼嗎?
如何在 SASS 中使用 @import 指令組織 CSS 代碼?
如何在 SASS 中使用 & 運算符引用父選擇器?
如何在 SASS 中使用 @media 指令創建響應式樣式?
首頁 web前端 css教學 與SASS結構CSS類選擇器

與SASS結構CSS類選擇器

Feb 24, 2025 am 10:01 AM

Structuring CSS Class Selectors with Sass

關鍵要點

  • BEM 和 SMACSS 等 CSS 命名約定嚴重依賴 CSS 類選擇器,而使用 Sass 可以使編寫這些選擇器更模塊化和可重用。
  • Sass 中的原生選擇器嵌套允許從文檔根級別的原始塊名稱創建子類名稱,從而簡化代碼並減少對變量或 mixin 等額外輔助工具的需求。
  • BEM mixin 提供了一個友好的 API,一旦您了解 BEM 的工作原理,就很容易理解,儘管邏輯隱藏在 mixin 後面,這可能會使生成新的選擇器和類不那麼明顯。
  • Humanified-BEM mixin 旨在通過隱藏 Block-Element-Modifier 專業術語來提高代碼的可讀性,但這對於某些開發人員來說可能涉及過多的抽象。

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>
登入後複製
登入後複製

優點

  • 它依賴於原生功能,不需要額外的輔助工具,例如變量或 mixin。
  • 一旦您了解引用選擇器(&)的工作原理,總體上就很容易掌握。

缺點

  • 它公開了 & 語法,如果對於不熟悉 Sass 的開發人員來說,這可能會稍微令人困惑,甚至令人恐懼。
  • 除非使用 @at-root,否則嵌套通常不會在根目錄打印,這可能會令人不安。

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>
登入後複製
登入後複製

優點

  • 此版本提供了一個友好的 API,一旦您了解 BEM 的工作原理,就很容易理解。

缺點

  • 邏輯隱藏在 mixin 後面,除非您明確知道發生了什麼,否則生成新的選擇器和類並不那麼明顯。
  • 單個字母 mixin 可能不是一個好主意,因為它們使理解 mixin 的用途變得困難。 b 和 m 可以表示很多東西。

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>
登入後複製

優點

  • 這種方法有助於提高代碼的可讀性,就像我們開始使用前導 is-(由 SMACSS 推廣)為我們的狀態類命名一樣。
  • 仍然堅持特定方法(在本例中為 BEM),但使其更易於開發人員使用。

缺點

  • 更多的 mixin、更多的輔助工具、更多的東西需要學習,才能獲得更穩定的學習曲線。並非每個人都喜歡處理大量的 mixin 來編寫諸如 CSS 選擇器之類的簡單內容。
  • 這對於某些人來說可能過於抽象;並非每個人都喜歡像閱讀英語一樣閱讀代碼。這取決於情況。

最終想法

請記住,使用任何這些技術都會阻止選擇器代碼庫可搜索,因為選擇器在由 Sass 生成之前實際上並不存在。在選擇器之前添加註釋可以解決這個問題,但為什麼不一開始就直接編寫選擇器呢?

如果您關心擁有可搜索的代碼庫,請不要使用新的 Sass 功能來 BEM 化所有選擇器(.b { &__e { } })。

— Kaelig (@kaelig) 2014 年 3 月 12 日

無論如何,朋友們,以下是我知道的用 Sass 編寫 CSS 選擇器最流行的方法,在我和你之間,我不喜歡它們。而且不僅僅是因為搜索問題,對我來說這並不是什麼大問題。

我可以看出他們試圖解決的問題,但有時簡單勝過 DRY。重複根選擇器並不是什麼大問題,它不僅使代碼更易於閱讀,因為嵌套較少,而且更接近 CSS。

有時簡單勝過 DRY。

— Hugo Giraudel (@HugoGiraudel) 2015 年 5 月 19 日

關於使用 SASS 結構化 CSS 類選擇器的常見問題

使用 SASS 結構化 CSS 類選擇器的意義是什麼?

使用 SASS 結構化 CSS 類選擇器對於維護乾淨、有序和高效的樣式表至關重要。 SASS(代表 Syntactically Awesome Stylesheets)是一種 CSS 預處理器,允許開發人員使用變量、嵌套規則、mixin 和函數,使 CSS 更具動態性和可重用性。通過結構化類選擇器,您可以創建樣式層次結構,從而更容易理解不同元素及其樣式之間的關係。這可以極大地提高 CSS 代碼的可維護性和可擴展性。

如何在 SASS 中使用通配符選擇器?

通配符選擇器,也稱為通用選擇器,可以在 SASS 中用於選擇與特定模式匹配的任何元素。例如,您可以使用通配符選擇器“*”來選擇所有元素。但是,SASS 不直接支持通配符類名。如果您想選擇類名以特定字符串開頭的元素,則需要使用變通方法,例如使用屬性選擇器。例如,您可以使用選擇器[class^="prefix-"]來選擇所有類名以“prefix-”開頭的元素。

我可以在 SASS 中使用 @extend 指令與類選擇器嗎?

是的,@extend 指令可以在 SASS 中與類選擇器一起使用。 @extend 指令允許一個選擇器繼承另一個選擇器的樣式。這對於減少 CSS 代碼中的冗餘非常有用。例如,如果您有兩個類共享許多相同的樣式,則可以在一個類中定義這些樣式,然後使用 @extend 指令將這些樣式應用於另一個類。

如何使用 SASS 更有效地組織 CSS 代碼?

SASS 提供了一些功能,可以幫助您更有效地組織 CSS 代碼。其中一項功能是嵌套,它允許您將 CSS 選擇器嵌套在其他選擇器中,從而反映 HTML 結構。這可以使您的 CSS 代碼更易於閱讀和維護。另一個功能是變量,它允許您定義可重用的值。這對於維護樣式的一致性(例如顏色、字體和間距)非常有用。

使用 SASS 結構化 CSS 類選擇器的最佳實踐是什麼?

使用 SASS 結構化 CSS 類選擇器有幾種最佳實踐。一種最佳實踐是使選擇器盡可能具體。這可以幫助防止樣式意外影響其他元素。另一種最佳實踐是使用有意義的類名來描述元素的目的或功能。這可以使您的 CSS 代碼更易於閱讀和維護。此外,最好對您的類使用一致的命名約定,例如 BEM(塊、元素、修飾符),以便更容易理解不同類之間的關係。

如何在 SASS 中使用 mixin 重用 CSS 代碼?

SASS 中的 mixin 是一種定義可以在整個樣式表中重用的樣式的方法。 mixin 使用 @mixin 指令定義,後跟名稱和 CSS 代碼塊。然後,您可以使用 @include 指令(後跟 mixin 的名稱)在任何選擇器中包含 mixin。這對於減少 CSS 代碼中的冗餘並使其更易於維護非常有用。

我可以在 SASS 中使用函數生成 CSS 代碼嗎?

是的,SASS 支持函數,可用於生成 CSS 代碼。 SASS 中的函數使用 @function 指令定義,後跟名稱和代碼塊。函數可以接受參數,並返回一個值,該值可以在您的 CSS 代碼中使用。這對於創建依賴於特定條件或計算的複雜樣式非常有用。

如何在 SASS 中使用 @import 指令組織 CSS 代碼?

SASS 中的 @import 指令可用於將其他 SASS 文件導入 SASS 文件。這對於將 CSS 代碼組織到單獨的文件中非常有用,每個文件都專注於網站樣式的特定部分。例如,您可以為頁眉樣式、頁腳樣式和主要內容樣式創建單獨的 SASS 文件,然後將它們全部導入主 SASS 文件。

如何在 SASS 中使用 & 運算符引用父選擇器?

SASS 中的 & 運算符可用於在嵌套規則中引用父選擇器。這對於創建偽類或偽元素選擇器非常有用。例如,如果您有一個嵌套規則用於 .link 規則內的 a:hover,則可以使用 & 運算符創建選擇器 .link:hover。

如何在 SASS 中使用 @media 指令創建響應式樣式?

SASS 中的 @media 指令可用於創建媒體查詢,允許您根據查看頁面的設備的特性(例如其寬度或高度)應用不同的樣式。這對於創建適應不同屏幕尺寸的響應式設計非常有用。您可以將 @media 指令用於選擇器中,僅當媒體查詢條件滿足時才應用樣式。

以上是與SASS結構CSS類選擇器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

See all articles