Webフォームのエラー処理をもっとスマートに!:user-invalidセレクタと代替方法ガイド


  • 入力値が制約に違反している状態
    • <input> 要素の required 属性が設定されており、値が入力されていない場合
    • <input> 要素の pattern 属性が設定されており、入力値がパターンに一致しない場合
    • <input> 要素の min または max 属性が設定されており、入力値が範囲外の場合
    • <select> 要素の required 属性が設定されており、値が選択されていない場合
  • 入力値が無効な状態
    • <input> 要素の disabled 属性が設定されている場合
    • <select> 要素の disabled 属性が設定されている場合
    • <checkbox> または <radio> 要素の disabled 属性が設定されている場合

:user-invalid セレクタは、入力フォームのエラー処理や、ユーザー入力を検証する際に役立ちます。例えば、以下のことが可能です。

  • ユーザーが誤った入力を修正できるように誘導する
  • エラーメッセージを表示する
  • 無効な入力項目を目立たせるようにスタイルを設定する

以下の例は、:user-invalid セレクタを使用して、無効な入力項目を赤色で表示する方法を示しています。

input:user-invalid {
  background-color: red;
}

このコードは、<input> 要素が無効な場合、その背景色を赤色に変更します。

  • :user-invalid セレクタは、他の擬似クラスセレクタと組み合わせて使用することができます。
  • :user-invalid セレクタは、入力値が無効または制約に違反している要素のみを対象とします。無効な要素の子要素は選択されません。
  • :user-invalid セレクタは、すべてのブラウザでサポートされているわけではありません。古いブラウザでは、このセレクタが機能しない可能性があります。


無効な入力項目を赤色で表示

input:user-invalid {
  background-color: red;
}

無効な入力項目に赤い枠線を表示

input:user-invalid {
  border: 2px solid red;
}

このコードは、<input> 要素が無効な場合、その要素に赤い枠線を表示します。

無効な入力項目にエラーメッセージを表示

input:user-invalid {
  border: 2px solid red;
  box-shadow: 0 0 5px red;
}

input:user-invalid + .error-message {
  display: block;
  color: red;
}

このコードは、<input> 要素が無効な場合、その要素に赤い枠線と影を表示し、その下に赤いエラーメッセージを表示します。

送信ボタンを無効化する

input:invalid ~ button[type="submit"] {
  opacity: 0.5;
  pointer-events: none;
}

このコードは、フォーム内に無効な入力項目がある場合、送信ボタンを無効化します。

カスタムエラーメッセージを表示

input:user-invalid {
  border: 2px solid red;
  box-shadow: 0 0 5px red;
}

input[type="email"]:user-invalid + .error-message {
  content: "有効なメールアドレスを入力してください";
}

input[type="number"]:user-invalid + .error-message {
  content: "数値を入力してください";
}

このコードは、<input type="email"> 要素が無効な場合、「有効なメールアドレスを入力してください」というエラーメッセージを表示します。また、<input type="number"> 要素が無効な場合、「数値を入力してください」というエラーメッセージを表示します。

  • ユーザー入力の検証には、JavaScript を併用することを検討してください。
  • ":user-invalid" セレクタは、すべてのブラウザでサポートされているわけではありません。古いブラウザでは、このセレクタが機能しない可能性があります。
  • 上記のコードはあくまで例であり、実際の状況に合わせて調整する必要があります。


そこで、":user-invalid" セレクタの代替方法として以下の3つの方法が考えられます。

JavaScript を使用する

JavaScript を使用して、入力値の検証を行い、エラーメッセージを表示したり、無効な入力項目を無効化したりすることができます。この方法は、":user-invalid" セレクタよりも柔軟性が高く、さまざまな種類のエラー処理に対応することができます。

const inputElement = document.querySelector('input[type="email"]');

inputElement.addEventListener('invalid', function() {
  if (inputElement.validity.valueMissing) {
    // エラーメッセージを表示
    const errorMessage = document.createElement('p');
    errorMessage.textContent = '有効なメールアドレスを入力してください';
    inputElement.parentNode.insertBefore(errorMessage, inputElement.nextSibling);
  } else if (inputElement.validity.typeMismatch) {
    // エラーメッセージを表示
    const errorMessage = document.createElement('p');
    errorMessage.textContent = '有効なメールアドレスを入力してください';
    inputElement.parentNode.insertBefore(errorMessage, inputElement.nextSibling);
  }
});

":invalid" 擬似クラスと ":valid" 擬似クラスを組み合わせて使用する

:invalid 擬似クラスと :valid 擬似クラスを組み合わせて使用することで、無効な入力項目と有効な入力項目をそれぞれ異なるスタイルで表示することができます。

input:invalid {
  background-color: red;
}

input:valid {
  background-color: green;
}

属性セレクタを使用する

入力項目の required 属性や pattern 属性などの属性に基づいて、CSS でスタイルを設定することができます。この方法は、JavaScript を使用するよりもシンプルですが、":user-invalid" セレクタほど柔軟ではありません。

input[required]:invalid {
  background-color: red;
}

input[pattern="[0-9]{3}-[0-9]{4}"]::invalid {
  background-color: red;
}
方法利点欠点
JavaScript を使用する柔軟性が高い複雑
":invalid" 擬似クラスと ":valid" 擬似クラスを組み合わせて使用するシンプルエラーの種類が限られる
属性セレクタを使用するシンプル柔軟性に欠ける