iT邦幫忙

2024 iThome 鐵人賽

DAY 25
1

:disabled & :enabled

之前我們介紹了如何使用 :focus & :focus-visible 來處理表單的焦點效果,這次我們要來看當表單元素被禁用時如何應用樣式 :disabled,以及如何利用 :enabled 為啟用狀態設置樣式。

💠 可以使用 disabled 的元素

在了解基本用法之前,先看看哪些 HTML 元素可以被 disabled,進而應用 :disabled 來改變它們的樣式。大部分的表單元素都支持 disabled 屬性:

  • <fieldset>:禁用表單元素群組
  • <input>:禁用輸入框、勾選框、單選框
  • <textarea>:禁用多行文本區域
  • <select>:禁用下拉選單
  • <option>:禁用下拉選單中的選項
  • <button>:禁用按鈕

💠 :disabled 基本用法

語法

選擇器:disabled { 
	屬性名: 屬性值; 
}
  • 選中禁用的表單元素

範例

一起試試:[CODEPEN]

<form>
  <h1>個人資訊</h1>
  <label for="name">姓名:</label>
  <input type="text" id="name" name="name" disabled>

  <label>興趣:</label>
  <label>
    <input type="checkbox" name="hobbies" value="reading" disabled> 閱讀
  </label>
  <label>
    <input type="checkbox" name="hobbies" value="sports" disabled> 運動
  </label>

  <label>性別:</label>
  <label>
    <input type="radio" name="gender" value="male" disabled> 男
  </label>
  <label>
    <input type="radio" name="gender" value="female" disabled> 女
  </label>

  <label for="country">國家:</label>
  <select id="country" name="country" disabled>
    <option value="taiwan">台灣</option>
    <option value="japan">日本</option>
    <option value="usa">美國</option>
  </select>

  <label for="message">自我介紹:</label>
  <textarea id="message" name="message" rows="4" cols="50" disabled></textarea>

  <button type="submit" disabled>送出</button>
</form>
input:disabled, 
textarea:disabled, 
select:disabled, 
option:disabled, 
button:disabled {
  background-color: #d1d1d1;
}

:disabled

如上所見,當表單元素處於 disabled 狀態時,背景顏色會變為灰色,不過上個章節 :checked 有講過,瀏覽器對複選框單選框有自己內建的預設外觀,所以此顏色只會變成它預設的淺灰色,如要設置其他樣式可像上篇章節 :checked 一樣,自行客製複選框、單選框樣式,或是利用後面會講到的偽元素來客製樣式。

💠 :enabled 基本用法

:disabled 相對應的是 :enabled,它針對表單中的啟用元素。

語法

選擇器:enabled { 
	屬性名: 屬性值; 
}
  • 選中的是啟用的元素 (沒有 disabled)

範例

一起試試:[CODEPEN]

<form>
  <h1>個人資訊</h1>
  <label for="name">姓名:</label>
  <input type="text" id="name" name="name">

  <label for="country">國家:</label>
  <select id="country" name="country">
    <option value="taiwan">台灣</option>
    <option value="japan">日本</option>
    <option value="usa">美國</option>
  </select>

  <label for="message">自我介紹:</label>
  <textarea id="message" name="message" rows="4" cols="50"></textarea>

  <button type="submit">送出</button>
</form>
input:enabled, 
textarea:enabled, 
select:enabled {
  background-color: cornsilk;
}

button:enabled {
  background-color: sienna;
}

:enabled

這個範例展示了啟用狀態下的表單元素樣式,<input><textarea><select> 都會有淺黃色的背景色,<button> 會是棕色,但是你可能會發現,其實不寫 :enabled 也能達到相同效果

input, 
textarea, 
select {
  background-color: cornsilk;
}

button{
  background-color: sienna;
}

兩種方式看起來的效果其實也會是一樣的,但其實還是有些許差異,

比方說,表單元素 <input>disabled 狀態時,會呈現灰色

:enabled&amp;:disabled

如果沒使用 :enabled 時,我們可以按 F12 打開開發人員工具,查看 <input> 的樣式,我們會發現,<input> 會以覆蓋的方式蓋掉原本的背景色

:enabled&amp;:disabled

:enabled 只會用於啟用狀態,所以在 disabled 時不會有啟用狀態的樣式。

💠 實務應用:表單必填與按鈕禁用

一起試試:[CODEPEN]

在實際開發中,我們常常會根據表單的驗證狀態來控制按鈕的啟用與禁用,例如提交按鈕在所有欄位通過驗證後才可使用。

<form>
  <h1>個人資訊</h1>
  <label for="name">姓名:</label>
  <input type="text" id="name" name="name" required>

  <label for="message">自我介紹:</label>
  <textarea id="message" name="message" rows="4" cols="50" required></textarea>

  <button type="submit" id="submit" disabled>送出</button>
</form>

CSS 樣式:表單欄位加上禁用、啟用樣式

form {
  background-color: #fff;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  width: 100%;
  max-width: 500px;
}

label {
  display: block;
  margin-bottom: 10px;
  font-weight: bold;
}

input[type="text"],
textarea {
  width: 100%;
  padding: 10px;
  margin-bottom: 15px;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 1rem;
}

button {
  width: 100%;
  padding: 10px;
  background-color: black;
  border: none;
  border-radius: 4px;
  color: white;
  font-size: 1rem;
  cursor: pointer;
  transition: background-color 0.3s;
}

button:enabled {
  background-color: sienna;
}

input:enabled, 
textarea:enabled {
  background-color: cornsilk;
}

input:disabled, 
textarea:disabled,
button:disabled{
  background-color: #d1d1d1;
}

JavaScript 驗證:姓名、介紹為必填欄位,兩個欄位填寫後才會啟用按鈕

const nameInput = document.getElementById("name");
const messageInput = document.getElementById("message");
const submitButton = document.getElementById("submit");

function checkFormValidity() {
  if (nameInput.value.trim() !== "" && messageInput.value.trim() !== "") {
    submitButton.disabled = false;
  } else {
    submitButton.disabled = true;
  }
}

nameInput.addEventListener("input", checkFormValidity);
messageInput.addEventListener("input", checkFormValidity);

沒有填寫欄位時,提交按鈕為 disabled 狀態

:disabled

填寫後驗證通過,啟用提交按鈕

:enabled

如此一來,就完成驗證表單囉!


💠 總結

:disabled:enabled 是專門針對表單元素的禁用和啟用狀態進行樣式控制。透過這兩個選擇器,我們可以靈活地為表單元素設置不同的視覺效果,提升使用者的操作體驗。


上一篇
:checked 玩轉複選框和單選框的選中效果
下一篇
::first-letter & ::first-line & ::selection 文章段落偽元素
系列文
你的優先選擇是什麼?從 CSS 選擇器到優先級,深入解析與實用技巧28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Alex Liu
iT邦新手 4 級 ‧ 2024-10-10 23:04:20

之前不知道有 :enabled 可以用,感覺有很多東西可以調整了 🙌

Lala Code iT邦新手 4 級 ‧ 2024-10-11 23:33:38 檢舉

:enabled 比較不常用到~下次可以用用看🙂👍

我要留言

立即登入留言