フォーム(Forms)

目次

フォーム(Forms)

フォームは、ラベルに .form-label を、<input> 等のコントロールに .form-control を指定します。

Example
Code
<form>
  <div class="mb-2">
    <label class="form-label" for="name">Name</label>
    <input class="form-control" type="text" name="name" id="name">
  </div>
  <div class="mb-2">
    <label class="form-label" for="address">Address</label>
    <input class="form-control" type="text" name="address" id="address">
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

フォームテキスト(Form text)

.form-text はフォームの注釈文などのテキストを表示します。

Example
全角文字で入力してください。
Code
<input type="text" class="form-control" name="name">
<div class="form-text">全角文字で入力してください。</div>

サイジング(Sizing)

.form-control-lg は大きなフォーム、.form-control-sm は小さなフォームを表示します。

Example
Code
<input type="text" class="form-control form-control-lg" placeholder="Large size">
<input type="text" class="form-control" placeholder="Normal size">
<input type="text" class="form-control form-control-sm" placeholder="Small size">

読み取り専用プレインテキスト(Readonly plain text)

.form-control-plaintext は読み取り専用のプレインテキストを表示します。

Example
Code
<input type="text" readonly class="form-control-plaintext" id="email" value="foo@example.com">

カラーピッカー(Color picker)

.form-control-color はカラーピッカーに指定します。

Example
Code
<input type="color" class="form-control form-control-color" name="color">

データリスト(Datalists)

list="..."<datalist> を指定することで、入力に応じで候補が絞られるデータリストを指定することができます。

Example
Code
<input class="form-control" list="states" name="state">
<datalist id="states">
  <option value="San Francisco">
  <option value="New York">
  <option value="Seattle">
  <option value="Los Angeles">
  <option value="Chicago">
</datalist>

選択肢(Select)

選択肢には .form-select を指定します。.form-select-lg は大き目、.form-select-sm は小さ目に表示します。

Example
Code
<select class="form-select">
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>

チェックボックス&ラジオボタン(Checks & Radios)

チェックボックスやラジオボタンには .form-check.form-check-input.form-check-label を指定します。

Example
Code
<div class="form-check">
  <input class="form-check-input" type="checkbox" id="check_1" name="1">
  <label class="form-check-label" for="check_1">Check#1</label>
</div>
<div class="form-check">
  <input class="form-check-input" type="radio" id="radio_1_1" name="radio_1" value="1" checked>
  <label class="form-check-label" for="radio_1_1">Red</label>
</div>

スイッチ(Switches)

.form-switch はスイッチスタイルのチェックボックスを表示します。

Example
Code
<div class="form-check form-switch">
  <input class="form-check-input" type="checkbox" id="switch_1" name="switch_1" checked>
  <label class="form-check-label" for="switch_1">Switch#1</label>
</div>

インラインチェック&ラジオ(Inline check & radio)

.form-check-inline を指定すると、チェックボックスやラジオボタンを横並びに表示します。

Example
Code
<div>
  <div class="form-check form-check-inline">
    <input class="form-check-input" type="checkbox" id="inline_checkbox_1" value="1" checked>
    <label class="form-check-label" for="inline_checkbox_1">Check#1</label>
  </div>
  <div class="form-check form-check-inline">
    <input class="form-check-input" type="checkbox" id="inline_checkbox_2" value="2">
    <label class="form-check-label" for="inline_checkbox_2">Check#2</label>
  </div>
</div>

チェックボックスとトグルボタン(Checkbox toggle buttons)

.btn-check を指定するとチェックボックスをトグルボタンとして利用することができます。On の時は少し色が濃くなります。周りにボーダーが表示されるのは On/Off ではなくフォーカスです。

Example
Code
<input class="btn-check" type="checkbox" id="btn_check">
<label class="btn btn-primary" for="btn_check" id="btn_check_label" style="width:5rem">Off</label>
<script>
(function() {
  document.getElementById('btn_check').addEventListener('click', function(e) {
    document.getElementById('btn_check_label').innerText = this.checked ? "On" : "Off";
  });
})();
</script>

レンジ(Range)

.form-range はレンジを表示します。

Example
Code
<label class="form-label" for="range_1">Example range</label>
<input class="form-range" type="range" id="range_1">

インプットグループ(Input group)

.input-group 内のフォームコントロールやボタンはインプットグループとして表示されます。テキストには .input-group-text を指定します。.input-group-lg は大き目、.input-group-sm は小さ目に表示します。

Example
Search
Search
Code
<div class="col-6 mb-2">
  <div class="input-group">
    <span class="input-group-text">Search</span>
    <input class="form-control" type="text">
    <button class="btn btn-secondary">&#9166;</button>
  </div>
</div>
<div class="col-6">
  <div class="input-group input-group-sm">
    <span class="input-group-text">Search</span>
    <input class="form-control" type="text">
    <button class="btn btn-secondary">&#9166;</button>
  </div>
</div>

フローティングラベル(Floating labels)

.form-floating は、ラベルを入力欄の内側に表示します。入力中は上部に小さく表示されます。<input> は最初に記述する必要があり、placeholder 属性が必須です。

Example
Code
<div class="form-floating">
  <input type="email" class="form-control" id="floating_label_1" placeholder="name@example.com">
  <label for="floating_label_1">Your name</label>
</div>

レイアウト(Layout)

フォームの縦配置(Vertical form)

通常のラベルやフォームは横幅 100% で縦に配置されます。

Example
Code
<div class="mb-2">
  <label for="layoutExam1-name" class="form-label">Name</label>
  <input type="text" class="form-control" id="layoutExam1-name" name="name">
</div>
<div class="mb-2">
  <label for="layoutExam1-address" class="form-label">Address</label>
  <input type="text" class="form-control" id="layoutExam1-address" name="address">
</div>
フォームの横配置(Horizontal form)

横並びにしたい場合は .row.col を使用します。.col-sm などを利用すると、広い画面では横並びに、スマホなどの狭い画面では縦並びにすることもできます。

Example
Code
<div class="row">
  <div class="col-sm">
    <label class="form-label" for="layoutExam2-name">Name</label>
    <input type="text" class="form-control" id="layoutExam2-name" name="name">
  </div>
  <div class="col-sm">
    <label class="form-label" for="layoutExam2-address">Address</label>
    <input type="text" class="form-control" id="layoutExam2-address" name="address">
  </div>
</div>
ラベルの横配置(Horizontal label)

ラベルを横に配置するにも .row.col を使用します。.col-sm-* を使用することで、スマホではラベルとコントロールが縦配置になります。ラベルは .form-label の代わりに .col-form-label.col-form-label-{sm|lg} を使用することで、ラベルをコントロールの高さの中央に配置することができます。

Example
Code
<div class="row mb-3">
  <label class="col-form-label col-sm-2" for="layoutExam3-name">Name</label>
  <div class="col-sm-10"><input type="text" class="form-control" id="layoutExam3-name" name="name"></div>
</div>
<div class="row">
  <label  class="col-form-label col-sm-2"for="layoutExam3-address">Address</label>
  <div class="col-sm-10"><input type="text" class="form-control" id="layoutExam3-address" name="address"></div>
</div>

バリデーション(Validation)

ブラウザバリデーション(Browser validation)

フォームバリデーションは JavaScript と組み合わせて行います。checkValidity()required などのバリデーションチェックを行い、正しければ :valid, 誤っていれば :invalid の属性をフォームコントロールに与えます。また、フォームに .was-validated を設定すると、フォームコントロールの色が変更されると共に、正しい時は .valid-feedback のメッセージが、誤っている時は .invalid-feedback のメッセージが表示されます。ブラウザ標準のエラーメッセージが表示されないように、<form> には novalidate を指定します。下記のフォームで何も入力せずに Submit ボタンを押してみてください。

Example
Good!
Required.
Code
<form class="needs-validation" novalidate>
  <div class="mb-2">
    <input type="text" class="form-control" required>
    <div class="valid-feedback">Good!</div>
    <div class="invalid-feedback">Required.</div>
  </div>
  <button class="btn btn-primary">Submit</button>
</form>
<script>
(function () {
  var forms = document.querySelectorAll('.needs-validation');
  Array.prototype.slice.call(forms).forEach(function (form) {
    form.addEventListener('submit', function (event) {
      if (!form.checkValidity()) {
        event.preventDefault();
        event.stopPropagation();
      }
      form.classList.add('was-validated');
    }, false);
  })
})();
</script>
カスタムバリデーション(Custom validation)

サーバ側でバリデーションしたり、JavaScript で独自のバリデーションを行う場合は、フォームコントロールに .is-valid または .is-invalid クラスを設定してください。下記は JavaScript で独自バリデーションを行うサンプルです。何も入力・変更しないで Submit ボタンを押してみてください。

Example
Good!
Required.
Good!
Too long.
Good!
Too big.
Good!
Invalid format.
Code
<form id="form1" novalidate>
  <div class="row mb-2 gx-2">
    <div class="col-3">
      <input type="text" class="form-control" required value="">
      <div class="valid-feedback">Good!</div>
      <div class="invalid-feedback">Required.</div>
    </div>
    <div class="col-3">
      <input type="text" class="form-control" data-maxlen=5 value="Long Text">
      <div class="valid-feedback">Good!</div>
      <div class="invalid-feedback">Too long.</div>
    </div>
    <div class="col-3">
      <input type="text" class="form-control" data-maxnum=100 value=1000>
      <div class="valid-feedback">Good!</div>
      <div class="invalid-feedback">Too big.</div>
    </div>
    <div class="col-3">
      <input type="text" class="form-control" data-regexp="^\d{4}-\d{2}-\d{2}$" value="1999/12/31">
      <div class="valid-feedback">Good!</div>
      <div class="invalid-feedback">Invalid format.</div>
    </div>
  </div>
  <button class="btn btn-primary" type="submit">Submit</button>
</form>
<script>
(function () {
  var form = document.querySelector('#form1');
  form.addEventListener('submit', function(event) {
    form.querySelectorAll('.form-control').forEach(function(elm) {
      var required = elm.required;
      var maxlen = elm.getAttribute('data-maxlen');
      var maxnum = elm.getAttribute('data-maxnum');
      var regexp = elm.getAttribute('data-regexp');     
      if ((required && (elm.value.length == 0)) ||
          (maxlen && (maxlen < elm.value.length)) ||
          (maxnum && (maxnum < Number(elm.value))) ||
          (regexp && !(elm.value.match(regexp)))) {
        elm.classList.add('is-invalid');
        elm.classList.remove('is-valid');
        event.preventDefault();
        event.stopPropagation();
      } else {
        elm.classList.add('is-valid');
        elm.classList.remove('is-invalid');
      }
    });
  });
})();
</script>
ツールチップ(Tooltips)

.{valid|invalid}-feedback の代わりに .{valid|invalid}-tooltip を用いることで、正常・異常メッセージをツールチップとして表示することができます。親要素に position-relative を指定してください。

Example
Good!
Invalid
Code
<form class="row" novalidate id="form-example-tooltip">
  <div class="col-4 position-relative">
    <input type="text" class="form-control is-valid" value="Mark" required>
    <div class="valid-tooltip">Good!</div>
  </div>
  <div class="col-4 position-relative">
    <input type="text" class="form-control is-invalid" value="" required>
    <div class="invalid-tooltip">Invalid</div>
  </div>
</form>