你是否在撰寫 CSS 時曾遇過寫了 Class name 卻沒有效果的詭異情況?
現在讓我們玩個小賭局吧(註1),猜猜看下方 HTML 搭配兩組 Class 樣式後,最終文字的顏色為何?猜錯的話,如果呈現為藍色,就請你的另一半去吃和牛 47,反之如果是紅色就請他 / 她吃 12mini 吧。
<div class="wagyu47 12mini">請他/她吃?<div/>
// 選項一;和牛 47 燒肉懷石料理
.wagyu47 {
color: bule;
}
// 選項二:12 mini 快煮鍋
.12mini {
color: red;
}
提醒你,在 CSS 中相同屬性的值會後蓋前唷!
倒數三秒~~~ 下好離手!
答案是... 你可以準備打電話訂位帶你的另一半去微風南山點 $3880 外加一成服務費的和牛套餐了。
什麼!?難道 CSS 這麼勢利眼,生不生效還要看價位?別緊張,且讓我們繼續看下去,看看還有沒有機會守護你的荷包。
初次看到這名詞時或許你會感到陌生,但相信我,你一定看過也使用過它。識別符(identifier)是用來命名和標識元素的字串。在 CSS 中,主要用於定義 Class、ID、自訂屬性等。而這些識別符存在的最大目的是,讓我們可以在 CSS 檔案中指向特定的 HTML 元素,並為它們套用樣式。而 <ident>
就是用來描述 CSS 中「識別符」的資料類型。
舉例來說,下方這段的 myClass
就是一個符合 <ident>
規範的字串,它能夠讓所有具有 class="myClass"
的元素變為紅色。
.myClass {
color: red;
}
小細節:當你寫 CSS 時,所有的 Class、ID、自訂屬性名稱,實際上都是識別符 <ident>
類型的字串。
前面我們提到過 <ident>
是一種資料類型,它主要是由一個或多個字元組成的字串,而這些字元可以包括以下幾種:
A-Z
)或小寫(a-z
)的 ASCII 字元。0
到 9
的十進位數字。-
)或底線(_
)。U+00A0
及以上的字元(也就是排除 ASCII 的部分)。\
)來轉義字元。既然有允許的字元,想必就會有一些不合規的寫法或規則要遵守。
12mini
。-12mini
。id1
、Id1
、iD1
和 ID1
會被視為不同的識別符。toto\?
和 toto\3F
是相同的識別符,因為 \?
和 \3F
都表示 ?
。小細節:大小寫視為不同的識別符,也就是會選取到不同的元素。如果你的樣式沒效果,搞了半天才發現是寫錯一個字母大小寫... 嗯,請注意別踩坑了。
在語法與限制部分我們一直反覆提到「轉義」這個詞,那到底是什麼意思呢?
轉義字元是指將某個字元以其他形式來表示,目的在於改變其在軟體系統中的解釋方式。在 CSS 中,轉義字元可以通過在字元前添加反斜線(\
)來實現。除了十六進位數字(0-9
,a-f
,A-F
),任何字元都可以這樣轉義。例如,&
可以轉義為 \&
。
也可以通過反斜線後跟隨字元的 Unicode 代碼點(用一至六個十六進位數字表示)來轉義。例如,&
可以轉義為 \26
。
這邊再舉一個極端情境,現在我們知道反斜線後可以跟隨數字來表達轉義,但假如我們的轉義字元後面就真的要接一個十六進位數字時該怎麼做呢?例如,\26
+ 123
(代表字串 &123
)。這時可以用以下兩種方式來解決:
例如,剛剛說的字串 &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 個理由讓各位小夥伴們思考思考吧。
總結來說,理解識別符不僅僅是掌握一項關於 CSS 的技術細節,更是為了在日常開發中提升程式碼的品質、可維護性和團隊協作效率。我始終相信這對於任何一位前端工程師來說都會是一個正面的幫助。
註1:回答即視同參加本賭局,回答行為定義包括但不限於口說,紙本電子書寫及心裡默念等。
Cheng's murmur
願賭服輸,該請的和牛還是請吧。
正所謂...
餐廳選的好,感情沒煩惱。