CSS 利用 Signature 來讓導覽列更好寫

偶然翻書學到的。

簡述

簡單來說就是在 body 上添加特定的 class / id 來表示「狀態」。

來看一個在寫導覽列按鈕時常會碰到的問題,假設有個頁面的 HTML 長這樣:

1
2
3
4
5
6
7
<!-- 頁面一 -->
<ul>
<li><a class="link current" href="#">頁面一</a></li>
<li><a class="link" href="#">頁面二</a></li>
<li><a class="link" href="#">頁面三</a></li>
<li><a class="link" href="#">頁面四</a></li>
</ul>

為了讓 user 知道目前所在位置,通常會用 CSS 把那個目前的位置給「標示出來」,所以根據上面的內容,會這樣寫:

1
2
3
4
5
6
7
.link {
color: black;
}
/* 改成紅字代表目前位置 */
.link.active {
color: red;
}

好,最麻煩問題來了。如果我要讓其他頁面也能配合這個 CSS,我就得改 HTML:

1
2
3
4
5
6
7
8
<!-- 頁面二 -->
<ul>
<li><a class="link" href="#">頁面一</a></li>
<li><a class="link current" href="#">頁面二</a></li>
<li><a class="link" href="#">頁面三</a></li>
<li><a class="link" href="#">頁面四</a></li>
</ul>
<!-- 其他以此類推 -->

只是加個 class 好像不麻煩?也許是這樣沒錯。可是,如果你有 100 個頁面,有天 PM 這樣跟你說:

欸欸,那個 current 的語意不太好懂,改成 active 好嗎?

這下你除了改一隻 CSS 檔案以外,你還得把每個頁面的 HTML 都調整成 active。這個時候你還覺得不麻煩嗎?

所以其實有更好的做法,參考以下解法:

1
2
3
4
5
6
7
8
<body id="home">
<ul>
<li><a class="link" href="page1">頁面一</a></li>
<li><a class="link" href="page2">頁面二</a></li>
<li><a class="link" href="page3">頁面三</a></li>
<li><a class="link" href="page4">頁面四</a></li>
</ul>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.link {
color: blue;
}
/* home 頁面就標示出來 */
#home .link[href="page1"] {
color: red;
}
/* about 頁面就標示出來 */
#about .link[href="page2"] {
color: red;
}
/* servie 頁面就標示出來 */
#servie .link[href="page3"] {
color: red;
}
/* product 頁面就標示出來 */
#product .link[href="page4"] {
color: red;
}

這個就跟 JavaScript 裡的 event delegation 有點異曲同工之妙,與其從按鈕來判定目前狀態,倒不如交給上層的父元素來處理不就好了?

雖然這個做法一樣要調整 HTML,但要調整的地方會少很多。因為你把「狀態」都交給 body 來控制了。

目前只有連結可能感受不太到差異,可是當有其他類似的樣式也是針對「特定頁面」來處理的時候,就會明白現在的做法比較好。

總而言之,現在把狀態都透過 body 的 class / id 來管理,你只要把重點著重在 CSS 就好,不用再針對特定元素來一個一個調整了。

CSS 利用 DataURI 來節省流量 CSS 利用 Sprite 來提升效能
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×