透過識別符重新認識 CSS

閱讀時間約 1 分鐘

你是否在撰寫 CSS 時曾遇過寫了 Class name 卻沒有效果的詭異情況?
現在讓我們玩個小賭局吧(註1),猜猜看下方 HTML 搭配兩組 Class 樣式後,最終文字的顏色為何?猜錯的話,如果呈現為藍色,就請你的另一半去吃和牛 47,反之如果是紅色就請他 / 她吃 12mini 吧。

<div class="wagyu47 12mini">請他/她吃?<div/>
// 選項一;和牛 47 燒肉懷石料理
.wagyu47 {
color: bule;
}

// 選項二:12 mini 快煮鍋
.12mini {
color: red;
}

提醒你,在 CSS 中相同屬性的值會後蓋前唷!

倒數三秒~~~ 下好離手!

raw-image


答案是... 你可以準備打電話訂位帶你的另一半去微風南山點 $3880 外加一成服務費的和牛套餐了。
什麼!?難道 CSS 這麼勢利眼,生不生效還要看價位?別緊張,且讓我們繼續看下去,看看還有沒有機會守護你的荷包。


章節一:初探識別符

什麼是識別符?

初次看到這名詞時或許你會感到陌生,但相信我,你一定看過也使用過它。識別符(identifier)是用來命名和標識元素的字串。在 CSS 中,主要用於定義 Class、ID、自訂屬性等。而這些識別符存在的最大目的是,讓我們可以在 CSS 檔案中指向特定的 HTML 元素,並為它們套用樣式。而 <ident> 就是用來描述 CSS 中「識別符」的資料類型。

舉例來說,下方這段的 myClass 就是一個符合 <ident> 規範的字串,它能夠讓所有具有 class="myClass" 的元素變為紅色。

.myC​lass {
color: red;
}
小細節:當你寫 CSS 時,所有的 Class、ID、自訂屬性名稱,實際上都是識別符 <ident> 類型的字串。
raw-image


章節二:名稱到底該怎麼取

識別符的語法

前面我們提到過 <ident> 是一種資料類型,它主要是由一個或多個字元組成的字串,而這些字元可以包括以下幾種:

  1. 字母:任何大寫(A-Z)或小寫(a-z)的 ASCII 字元。
  2. 數字:任何 09 的十進位數字。
  3. 連字號與底線:連字號(-)或底線(_)。
  4. 非 ASCII 字元:任何 Unicode 代碼在 U+00A0 及以上的字元(也就是排除 ASCII 的部分)。
  5. 轉義字元:透過在字元前面加上反斜杠(\)來轉義字元。


識別符的限制

既然有允許的字元,想必就會有一些不合規的寫法或規則要遵守。

  • 不能以數字開頭,例如剛剛題目中的 12mini
  • 不能以連字號開頭並緊跟著數字,例如 -12mini
  • 識別符本身對大小寫敏感,例如 id1Id1iD1ID1 會被視為不同的識別符。
  • 雖然識別符可以轉義,但 CSS 中不同的轉義方式會產生相同的識別符。例如 toto\?toto\3F 是相同的識別符,因為 \?\3F 都表示 ?
小細節:大小寫視為不同的識別符,也就是會選取到不同的元素。如果你的樣式沒效果,搞了半天才發現是寫錯一個字母大小寫... 嗯,請注意別踩坑了。


轉義字元

在語法與限制部分我們一直反覆提到「轉義」這個詞,那到底是什麼意思呢?
轉義字元是指將某個字元以其他形式來表示,目的在於改變其在軟體系統中的解釋方式。在 CSS 中,轉義字元可以通過在字元前添加反斜線(\)來實現。除了十六進位數字(0-9a-fA-F),任何字元都可以這樣轉義。例如,& 可以轉義為 \&

也可以通過反斜線後跟隨字元的 Unicode 代碼點(用一至六個十六進位數字表示)來轉義。例如,& 可以轉義為 \26

這邊再舉一個極端情境,現在我們知道反斜線後可以跟隨數字來表達轉義,但假如我們的轉義字元後面就真的要接一個十六進位數字時該怎麼做呢?例如,\26 + 123 (代表字串 &123 )。這時可以用以下兩種方式來解決:

  1. 在 Unicode 代碼後加一個空格或其他空白字元。
  2. 使用完整的六位數 Unicode 代碼來表示所轉義的字元。

例如,剛剛說的字串 &123 可以轉義為 \26 123(帶空格)或 \000026123(使用完整的六位數 Unicode 代碼),這樣能確保反斜線後的 123 不會被視為轉義模式的一部分。


範例

了解上述規則後,這邊列出一些有效與無效的識別符給大家看看。

有效的識別符:

  • nono79:包含字母和數字的組合。
  • ground-level:包含字母和連字號的組合。
  • -test:以連字號開頭的字母組合。
  • --toto:類似於自訂屬性的識別符。
  • _internal:以底線開頭的字母組合。
  • \22 toto:包含轉義字元的字母組合。
  • \000022toto:與上一個範例相同。
  • bili\.bob:正確轉義的句號。
  • 🔥123:包含非 ASCII 字元和數字的組合。

無效的識別符:

  • 34rem:不能以數字開頭。
  • -12rad:不能以連字號開頭並緊跟著數字。
  • bili.bob:字母組合中非字母字元(如句號)必須轉義。
  • 'bilibob':被視為字串。
  • "bilibob":被視為字串。


章節三:懂它可以當飯吃嗎?

看到這邊想必有些人會覺得,即便我不熟悉識別符,但我不也活得好好的嗎?當然,你不懂它可能不會怎樣,但也可能有天真的會怎麼樣,說穿了不過就是倖存者偏差罷了。

這裡就舉出 7 個理由讓各位小夥伴們思考思考吧。

  1. 避免語法錯誤
    理解識別符的規則,讓我們可以避免在 CSS 中出現語法錯誤。例如,識別符不能以數字開頭或包含未轉義的特殊字符。避免這些錯誤可以讓 CSS 程式碼更穩定、易於測試,減少踩坑時間。
  2. 提高程式碼可讀性
    當團隊成員都遵循識別符的命名規則並使用有意義的名稱時,CSS 程式碼將變得更易讀與理解。這對於團隊協作特別重要,讓其他人可以更快地理解和維護現有的樣式。
  3. 提升維護性
    在大型專案中,CSS 的維護往往會變得很複雜。透過理解識別符規則,團隊成員能夠使用一致的命名方式,減少樣式名稱衝突和意外覆蓋的風險,使得後續的維護工作更加順利。
  4. 增強 CSS 的可重用性
    當我們能正確地命名識別符時,這些識別符可以在專案的不同部分重複使用,這不僅減少了重複的樣式定義,還提高了程式碼的效率和一致性。
  5. 提高開發效率
    掌握識別符的使用規則後,我們也可以更快地撰寫、測試和調整 CSS。這也有助於使用工具(如 CSS 預處理器和框架)更好地管理和組織樣式,進一步提升開發效率。
  6. 減少命名衝突
    在大型專案或多人協作中,使用規範的識別符可以有效減少命名衝突。這是因為 CSS 的選擇器是全局的,命名衝突可能導致樣式意外覆蓋或不正確應用。
  7. 促進最佳實踐
    理解識別符的概念可以促使我們遵循最佳實踐,例如使用 BEM(Block, Element, Modifier)命名法或其他命名規範。這些最佳實踐可以幫助我們撰寫程式碼,使其更具可擴展性和可維護性。


總結來說,理解識別符不僅僅是掌握一項關於 CSS 的技術細節,更是為了在日常開發中提升程式碼的品質、可維護性和團隊協作效率。我始終相信這對於任何一位前端工程師來說都會是一個正面的幫助。


註1:回答即視同參加本賭局,回答行為定義包括但不限於口說,紙本電子書寫及心裡默念等。


Cheng's murmur

願賭服輸,該請的和牛還是請吧。
正所謂...
餐廳選的好,感情沒煩惱。
raw-image
avatar-img
2會員
5內容數
生活就是 早上 8 點的文湖線;晚上 8 點的 New York Sour;帶著一台 GR3X 意興闌珊的漫步;嚮往著午後草皮上陪拉布拉多 🐶 玩耍;拿起似有似無的筆開始敲打創作。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Cheng's 的其他內容
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
CSS入門-Day3 的主要內容包括字體大小、字體顏色、字體系列、字體樣式、字體粗細等屬性。此外,還涵蓋了文本對齊、行高、文字間距、單詞間距和文本裝飾。最後,介紹了如何引入和使用 Google 字體,以提高網頁的排版效果。
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
CSS入門-Day3 的主要內容包括字體大小、字體顏色、字體系列、字體樣式、字體粗細等屬性。此外,還涵蓋了文本對齊、行高、文字間距、單詞間距和文本裝飾。最後,介紹了如何引入和使用 Google 字體,以提高網頁的排版效果。
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!