
:not
選擇器可以選取不符合指定選擇器的元素,主要功能是排除符合特定選擇器的元素,這讓我們能夠將樣式應用於那些不符合條件的元素,也稱為是「反選偽類」或「否定偽類」(negation pseudo-class)。
💠:not
基本用法
語法
1 2 3
| 選擇器:not(排除的選擇器) { 屬性名: 屬性值; }
|
範例一:排除特定類別的元素
假設我們想要將所有 <p>
元素設置成藍色,但排除 class="apple"
的段落:
1 2 3 4
| <p>空白段落</p> <p class="apple">apple</p> <p class="not-apple">not-apple</p> <div class="apple">apple</div>
|
1 2 3
| p:not(.apple) { color: royalblue; }
|

除了具有 apple
類別的段落,其他 <p>
會變成藍色。
範例二:排除特定屬性的元素
選中 <div>
底下的子元素 <p>
,但排除 title
屬性值以 apple 開頭的元素
1 2 3 4 5
| <div> <p title="apple">🍎title is apple</p> <p>apple</p> <p title="not-apple">not-apple</p> </div>
|
1 2 3
| div > p:not([title^="apple"]) { color: royalblue; }
|

只有 title
不是以 apple 開頭的 <p>
會變成藍色
範例三:排除第一個子元素
選中 <div>
底下的子元素 <p>
,但排除第一個子元素,只有不是第一個的 <p>
元素將會變為藍色
1 2 3 4 5
| <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul>
|
1 2 3
| ul > li:not(:first-child) { color: royalblue; }
|

💠:not
的無效或不合理用法
一、排除所有元素
不管怎樣永遠都不會有任何元素選中,很顯然這種寫法是很不合理的
1 2 3
| :not(*) { color: red; }
|
二、沒有選擇任何選擇器,並排除所有有 apple 的類別
1
| <p class="apple">apple</p>
|
1 2 3
| :not(.apple) { background-color: skyblue; }
|

你會發現,apple 類別背景色還是變色了,這其實不是無效,是因為排除 apple 類別也包含了 <html>
、<body>
,所有沒有 apple 類別的元素都會被加上背景色
三、後代選擇器的使用
1 2 3 4 5 6 7 8 9 10 11
| <div> <a href="#">div 的 a 元素</a> </div>
<div> <p> <a href="#">div p 的 a 元素</a> </p> </div>
<a href="#">一般的 a 元素</a>
|
1 2 3
| body :not(div) a { color: red; }
|

如果你是這樣寫,將會選中非 <div>
包住的 <a>
- 第一行的
<a>
不會被選中,因為是 <div>
包住的 <a>
,這沒什麼疑慮
- 第二行的
<a>
文字將會變成紅色,這是因為 <p>
也符合 :not(div)
的條件
- 第三行的
<a>
不會被選中,因為它並沒有被任何元素包住
如果想排除 <div>
下所有的 <a>
,你應該這樣寫
1 2 3
| body :not(div a) { color: red; }
|

這麼一來,所有在 <div>
底下的 <a>
都會被排除
四、選擇器列表使用到無效的選擇器,將全部無效
1 2 3 4
| <div> <p class="apple">🍎apple</p> <p>not-apple</p> </div>
|
1 2 3 4
| p:not(.apple, :invalid-pseudo-class) { color: red; font-style: italic; }
|

還記得我們在選擇器列表時講的嗎?如果希望忽略無效的選擇器,讓有效選擇器執行效果,我們應該使用 :is
1 2 3 4
| p:not(:is(.apple, :invalid-pseudo-class)) { color: red; font-style: italic; }
|

如此一來,就可以選中排除 apple 類別的 <p>
囉!
💠 實務應用:按鈕樣式
一起試試:[CODEPEN]
我們可以使用 :not()
為不同按鈕類型設定樣式。例如,對一般按鈕設置一種樣式,對提交按鈕設置另一種樣式:
1 2 3
| <button type="button">按鈕 1</button> <button type="button">按鈕 2</button> <button type="submit">提交按鈕</button>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| button:not([type="submit"]) { background-color: skyblue; color: white; border: none; border-radius: 6px; padding: 10px 20px; margin: 5px; cursor: pointer; }
button[type="submit"] { background-color: green; color: white; border: none; border-radius: 6px; padding: 10px 20px; margin: 5px; cursor: pointer; }
|

type="button"
的按鈕會有藍色背景,而 type="submit"
的按鈕會有綠色背景
💠 總結
:not
選擇器可以精確地排除特定元素,它能用來處理類別、屬性或是結構選擇器,讓我們在設計複雜的頁面時有更多控制力,使用它可以避免不必要的重複選擇器。
🚀線上課程分享
線上課程可以加速學習的時間,省去了不少看文件的時間XD,以下是我推薦的一些課程
想學習更多關於前後端的線上課程,可以參考看看。
Hahow 有各式各樣類型的課程,而且是無限次數觀看,對學生或上班族而言,不用擔心被時間綁住
如果你是初學者,非常推薦六角學院哦!
剛開始轉職也是上了六角的課,非常的淺顯易懂,最重要的是,隨時還有線上的助教幫你解決問題!
Udemy 裡的課程非常的多,品質普遍不錯,且價格都滿實惠的,CP值很高!
也是很多工程師推薦的線上課程網站。