Contents

使用CSS自訂checkbox方法

平常在用 checkout 都用在分支,今天查看 checkbox 的 CSS 自訂方式。瀏覽器對 <input type="checkbox"> 的預設樣式各不相同,在 Windows、macOS、Android 上的外觀都有差異,若要讓網站在各平台顯示一致,需要自訂 checkbox 樣式。

為什麼要自訂 Checkbox?

不同瀏覽器和作業系統對 checkbox 的預設外觀差異很大:

  • Windows:方形、系統顏色
  • macOS:圓角方形、系統藍色
  • Android:可能是圓形

自訂 checkbox 可以讓所有平台的外觀一致,並符合網站的品牌設計。

方法一:CSS 隱藏 + ::before 偽元素(傳統方式)

利用 CSS Hack 技巧,隱藏原生 checkbox 後用偽元素模擬:

1
2
3
4
5
<label class="custom-checkbox">
  <input type="checkbox" id="agree">
  <span class="checkmark"></span>
  同意條款
</label>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
.custom-checkbox {
  display: flex;
  align-items: center;
  cursor: pointer;
  gap: 8px;
}

/* 隱藏原生 checkbox,但保留在 DOM 中(讓螢幕閱讀器能讀取) */
.custom-checkbox input[type="checkbox"] {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}

/* 自訂外觀 */
.checkmark {
  width: 20px;
  height: 20px;
  border: 2px solid #999;
  border-radius: 4px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background-color 0.2s, border-color 0.2s;
}

/* 勾選狀態:使用相鄰選擇器 + :checked 偽類 */
.custom-checkbox input[type="checkbox"]:checked + .checkmark {
  background-color: #4a90e2;
  border-color: #4a90e2;
}

/* 勾選標記(打勾符號) */
.custom-checkbox input[type="checkbox"]:checked + .checkmark::before {
  content: '';
  width: 6px;
  height: 10px;
  border: 2px solid white;
  border-top: none;
  border-left: none;
  transform: rotate(45deg) translateY(-2px);
}

/* focus 狀態(鍵盤導航時顯示焦點框) */
.custom-checkbox input[type="checkbox"]:focus + .checkmark {
  outline: 2px solid #4a90e2;
  outline-offset: 2px;
}

這個方法透過 CSS 的 :checked 偽類加上相鄰選擇器(+),在 checkbox 狀態改變時切換 .checkmark 的樣式。

方法二:accent-color(現代簡單方式)

CSS accent-color 是一個現代屬性,可以直接改變 checkbox(以及 radio、range、progress)的主題色,不需要複雜的 CSS Hack:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
/* 全域設定 */
:root {
  accent-color: #4a90e2;
}

/* 或只針對特定 checkbox */
input[type="checkbox"] {
  accent-color: #4a90e2;
  width: 18px;
  height: 18px;
  cursor: pointer;
}

優點:簡單、瀏覽器負責渲染外觀
缺點:客製化程度有限,只能改顏色,無法自訂形狀

瀏覽器支援:Chrome 93+、Firefox 92+、Safari 15.4+,現代瀏覽器都支援。

CSS Checkbox Hack(純 CSS 互動效果)

Checkbox Hack 是利用 :checked 偽類和 CSS 選擇器來實現純 CSS 的互動效果,不需要 JavaScript:

1
2
3
4
5
<input type="checkbox" id="toggle">
<label for="toggle">點我開關</label>
<div class="content">
  這個區塊會在 checkbox 勾選後顯示
</div>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/* 隱藏 checkbox */
#toggle {
  display: none;
}

/* 預設隱藏 content */
.content {
  display: none;
}

/* checkbox 勾選後,顯示 content(~ 是一般兄弟選擇器) */
#toggle:checked ~ .content {
  display: block;
}

/* 對應 label 的樣式變化 */
#toggle:checked + label {
  color: #4a90e2;
}

無障礙(Accessibility)注意事項

自訂 checkbox 時需要注意不影響無障礙功能:

  1. 不要用 display: nonevisibility: hidden 隱藏原生 checkbox(螢幕閱讀器無法讀取)

    • 應使用 opacity: 0 搭配 position: absolute 讓元素視覺上不可見但仍在 DOM 中
  2. 確保 <label> 正確關聯 <input>

    • 使用 <label for="id"> 或將 <input> 包在 <label> 內部
  3. 保留 :focus 狀態的視覺提示,讓鍵盤使用者能看到目前焦點在哪裡

  4. 確保對比度足夠,勾選後的顏色需符合 WCAG AA 標準(對比度 4.5:1 以上)

參考資料