【JavaScript】focus / blur – フォーカス操作に関連するイベント

JavaScriptのfocusblurイベントは、フォーム要素やインタラクティブなUI要素でのフォーカス操作に関連するイベントです。これらを活用することで、入力フィールドの強調表示やエラーメッセージの表示など、より直感的でインタラクティブなインターフェースを構築できます。

focus / blurイベントとは?

focusイベント

  • 要素がフォーカスされたときに発生します。
  • 通常、ユーザーがマウスでクリックしたり、タブキーを使用して要素にフォーカスを移動したときにトリガーされます。

blurイベント

  • 要素がフォーカスを失ったときに発生します。
  • 例えば、ユーザーが別の要素に移動したり、ブラウザの外をクリックした場合などにトリガーされます。

focusblurイベントはバブリングしませんが、キャプチャフェーズで検知可能です。

基本的な使い方

以下は、focusblurイベントを使った簡単な例です。

See the Pen focus() / blur() by tones (@tonescodedesign) on CodePen.

JavaScript
const input = document.getElementById('name');
const errorMessage = document.getElementById('error-message');

// フォーカス時に強調表示
input.addEventListener('focus', () => {
  input.style.border = '3px solid green';
  errorMessage.style.display = 'none';
});

// フォーカスを失ったときにバリデーション
input.addEventListener('blur', () => {
  if (input.value.trim() === '') {
    errorMessage.style.display = 'block';
  }
});
HTML
<form>
  <label for="name">名前:</label>
  <input type="text" id="name">
  <p id="error-message" class="error" style="display: none;">名前を入力してください。</p>
</form>
CSS
input:focus {
  outline: 2px solid blue;
}
.error {
  color: red;
  font-size: 0.9em;
}

サンプルコード

入力フィールドのリアルタイムバリデーション

フォームの入力値をリアルタイムでバリデートする例です。

See the Pen focus() / blur() by tones (@tonescodedesign) on CodePen.

JavaScript
const emailInput = document.getElementById('email');
const validationMessage = document.getElementById('validation-message');

emailInput.addEventListener('blur', () => {
  const email = emailInput.value;
  if (!email.includes('@') || !email.includes('.')) {
    emailInput.classList.add('invalid');
    emailInput.classList.remove('valid');
    validationMessage.style.display = 'block';
  } else {
    emailInput.classList.add('valid');
    emailInput.classList.remove('invalid');
    validationMessage.style.display = 'none';
  }
});

emailInput.addEventListener('focus', () => {
  validationMessage.style.display = 'none';
});
HTML
<label for="email">メールアドレス:</label>
<input type="email" id="email">
<p id="validation-message" style="color: red; display: none;">無効なメールアドレスです。</p>
CSS
.valid {
  border-color: green;
}
.invalid {
  border-color: red;
}

カスタムフォーカスインジケーター

focusイベントを使って、現在フォーカスしているフィールドを強調表示します。

See the Pen focus() / blur() by tones (@tonescodedesign) on CodePen.

JavaScript
const inputs = document.querySelectorAll('input');

inputs.forEach(input => {
  input.addEventListener('focus', () => {
    input.classList.add('highlight');
  });

  input.addEventListener('blur', () => {
    input.classList.remove('highlight');
  });
});
HTML
<form>
  <label for="username">ユーザー名:</label>
  <input type="text" id="username">
  <br><br>
  <label for="password">パスワード:</label>
  <input type="password" id="password">
</form>
CSS
.highlight {
  background-color: lightyellow;
}

使用時の注意点

focusblurはバブリングしない

focusblurは他のイベントとは異なり、親要素に伝播しません。そのため、フォーム全体に対してイベントを検知したい場合は、focusinfocusoutを使用する必要があります。

JavaScript
document.addEventListener('focusin', (event) => {
  console.log(`${event.target.tagName}がフォーカスされました。`);
});
【JavaScript】focusin / focusout – 要素がフォーカスを受け取った・失ったときに発生するイベント

フォーム全体での管理

複数の入力欄を含むフォームでは、個々のfocusblurイベントにリスナーを追加するよりも、focusinfocusoutを活用する方が効率的です。

アクセシビリティへの配慮

フォーカス時に表示される内容が視覚的なものに限定される場合、スクリーンリーダー利用者には認識されない可能性があります。必要に応じてaria-live属性や適切な説明文を追加しましょう。

HTML
<div id="help" aria-live="polite">フォーカスされたときの説明をここに表示します。</div>