テキスト入力欄とは

名前やメールアドレスなど、文字を直接入力させる欄。label と結び付け、エラー時は状態を明示する。

概要

名前やメールアドレスなど、ユーザーに文字を直接入力してもらうための欄です。何を入力する欄かを示す <label> を for/id で input と結び付けておくと、ラベルをクリックしても入力欄にフォーカスが移り、スクリーンリーダーでも「何の欄か」が読み上げられます。補足文で入力形式のヒントを添えたり、入力内容が不正なときは aria-invalid とエラーメッセージで状態を明示したりします。

別名

表記ゆれ:インプット、テキストフィールド、入力ボックス、text input

英語の “input” をそのままカタカナにした「インプット」も現場ではよく使われますが、正式には <input> 要素そのものを指す言葉です。

AI への伝え方

「メールアドレスの入力欄を label 付きで作って、不正な形式のときはエラー表示にして」のように、label の必要性とエラー時の見た目をセットで伝えます。入力例を示したいだけなら「プレースホルダー」の役割になるため、ラベルの代わりにしないでほしい旨を伝えると誤解を防げます。

似たパーツとの違い

「プレースホルダー」は入力欄の中に薄く表示される入力例で、テキスト入力欄を構成する要素の 1 つです。ラベルの代わりに使うと、入力を始めた瞬間にヒントが消えてしまう問題があります。 「フローティングラベル」はラベルが入力欄の中から上に浮き上がる表現方法で、テキスト入力欄とラベルの配置方法の一種という違いがあります。

デモ

姓名の間にスペースを入れてください

ハイフンなしで入力してください

メールアドレスの形式が正しくありません

コード

HTML
<div class="text-input-demo">
  <div class="text-input-demo__field">
    <label class="text-input-demo__label" for="text-input-demo-name">お名前</label>
    <input class="text-input-demo__input" type="text" id="text-input-demo-name" name="name" />
    <p class="text-input-demo__hint">姓名の間にスペースを入れてください</p>
  </div>

  <div class="text-input-demo__field">
    <label class="text-input-demo__label" for="text-input-demo-tel">電話番号</label>
    <input class="text-input-demo__input" type="tel" id="text-input-demo-tel" name="tel" value="090" />
    <p class="text-input-demo__hint">ハイフンなしで入力してください</p>
  </div>

  <div class="text-input-demo__field">
    <label class="text-input-demo__label" for="text-input-demo-email">メールアドレス</label>
    <input
      class="text-input-demo__input text-input-demo__input--invalid"
      type="email"
      id="text-input-demo-email"
      name="email"
      value="taro@example"
      aria-invalid="true"
      aria-describedby="text-input-demo-email-error"
    />
    <p class="text-input-demo__error" id="text-input-demo-email-error">メールアドレスの形式が正しくありません</p>
  </div>
</div>
CSS
.text-input-demo {
  display: flex;
  flex-direction: column;
  gap: 20px;
  font-family: sans-serif;
  max-width: 320px;
}

.text-input-demo__field {
  display: flex;
  flex-direction: column;
}

.text-input-demo__label {
  margin-bottom: 6px;
  font-size: 13px;
  font-weight: 700;
  color: #333;
}

.text-input-demo__input {
  padding: 10px 12px;
  border: 1px solid #b3b3b3;
  border-radius: 8px;
  font-size: 14px;
  color: #333;
}

.text-input-demo__input:hover {
  border-color: #666;
}

.text-input-demo__input:focus-visible {
  outline: 2px solid #0017c1;
  outline-offset: 2px;
}

.text-input-demo__input--invalid {
  border-color: #b3261e;
}

.text-input-demo__input--invalid:focus-visible {
  outline-color: #b3261e;
}

.text-input-demo__hint {
  margin: 6px 0 0;
  font-size: 12px;
  color: #666;
}

.text-input-demo__error {
  margin: 6px 0 0;
  font-size: 12px;
  color: #b3261e;
}