【ソーコード】番外編:プラグイン「Datepicker」/カレンダー&入力チェック

目次

※コーディングの解説はCSS、JavaScriptのコメントを参照

ディレクトリ構成

    
extra9
 ├─css
 │  └─style.css
 │
 ├─js
 │  └─main.js
 │
 └─index.html
    
  

HTML(index.html)

別タブで開く
index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>タイトル</title>
    <meta name="description" content="テキストテキストテキストテキストテキストテキスト">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css">
    <link rel="stylesheet" href="css/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
    <script src="js/main.js"></script>
  </head>

  <body>
    <div class="content">
      <h1 class="page-title">セミナー お申込みフォーム</h1>
      <form action="#">
        <dl class="form-area">
          <dt><label for="name">名前</label><span>必須</span></dt>
          <dd>
            <input type="text" id="name" name="your-name">
            <p id="name-error" class="error-text"></p>
          </dd>

          <dt><label for="tel1">電話番号</label><span>必須</span></dt>
          <dd>
            <input type="text" id="tel1" name="your-tel1"> -
            <input type="text" id="tel2" name="your-tel2"> -
            <input type="text" id="tel3" name="your-tel3">
            <p id="tel-error" class="error-text"></p>
          </dd>

          <dt><label for="reservation">予約日</label><span>必須</span></dt>
          <dd>
            <input type="text" id="reservation" name="your-reservation"> 13時 ~ 14時
            <p id="reservation-error" class="error-text"></p>
          </dd>

          <dt>受講形式<span>必須</span></dt>
          <dd>
            <input type="radio" id="online" class="lesson" name="your-lesson" value="online" checked>
            <label for="online">オンラインで受講</label><br>
            <input type="radio" id="venue" class="lesson" name="your-lesson" value="venue">
            <label for="venue">会場で受講</label>
            <p id="lesson-error" class="error-text"></p>
          </dd>
        </dl>

        <div class="note-online">
          <p>
            当日はオンライン会議システムを使用いたします。<br>
            ご受講にあたり、端末とネットワーク環境が必要になりますのでご準備をお願いいたします。<br>
            参加方法については、前日までに別途ご案内を差し上げます。
          </p>
        </div>

        <div class="note-venue">
          <p>
            【会場情報】<br>
            会場:代々木GIプラザ3F Room1<br>
            住所:〒151-0053 東京都渋谷区代々木1-1-1<br>
            電話番号:00-0000-0000
          </p>
        </div>

        <div class="button-area">
          <button id="submit-button" type="button" value="">上記の内容で申し込む</button>
        </div>
      </form>
    </div>
  </body>
</html>

CSS(style.css)

別タブで開く
style.css

@charset "UTF-8";

html {
  font-size: 100%;
}
body {
  background-color: #f2f2f2;
  color: #333;
  font-size: 0.875rem;
}

.content {
  max-width: 1000px;
  padding: 60px 10px;
  margin: 0 auto;
}
.page-title {
  text-align: center;
  margin-bottom: 30px;
}
.form-area {
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 15px;
}
.form-area dt {
  width: 30%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background-color: #3d546a;
  color: #fff;
  padding: 30px 15px;
  margin-bottom: 2px;
}
.form-area dt span {
  background-color: #fff;
  color: #e85c4e;
  font-size: 0.75rem;
  padding: 0 8px;
}
.form-area dd {
  width: 70%;
  background-color: #fff;
  padding: 22px 15px 20px 15px;
  margin-bottom: 2px;
}
.form-area input {
  background-color: #f2f2f2;
  padding: 8px 10px;
}
.button-area {
  text-align: center;
}
#submit-button {
  background-color: #e85c4e;
  border-radius: 5px;
  color: #fff;
  font-size: 1.25rem;
  font-weight: bold;
  padding: 20px 40px;
  text-align: center;
}
#submit-button:hover {
  opacity: 0.7;
}
#name {
  width: 100%;
}
#tel1,
#tel2,
#tel3 {
  max-width: 80px;
}
#reservation {
  max-width: 200px;
}
.lesson {
  margin-right: 5px;
  position: relative;
  top: 2px;
}
.lesson:first-child {
  margin-bottom: 10px;
}
.note-online,
.note-venue {
  padding: 0 30px;
  margin-bottom: 30px;
}
.note-venue {
  display: none;
}
/* エラーメッセージ用 */
.error-text {
  color: #de3f2e;
  margin-top: 2px;
}

/*-------------------------------------------
SP
-------------------------------------------*/
@media screen and (max-width: 600px) {
  .form-area {
    flex-direction: column;
  }
  .form-area dt {
    width: 100%;
    display: block;
    padding: 10px;
    margin-bottom: 0;
  }
  .form-area dt span {
    margin-left: 10px;
  }
  .form-area dd {
    width: 100%;
    padding: 10px;
    margin-bottom: 10px;
  }
  .form-area dd:last-child {
    margin-bottom: 0;
  }
  .note-online,
  .note-venue {
    padding: 0 10px;
  }
}

JavaScript(main.js)

別タブで開く
main.js

$(function(){
  /*=================================================
  // カレンダー用 jQueryプラグイン「Datepicker」
  ===================================================*/
  $('#reservation').datepicker();

  /*=================================================
  // ラジオボタン下のテキスト切り替え
  //(ラジオボタンが変更されたタイミングで実行)
  ===================================================*/
  $('.lesson').on('change', function(){
    // チェックされている方のラジオボタンのvalue値を取得
    let lesson = $('input[name=your-lesson]:checked').val();

    // 「オンラインで受講」がチェックされている場合
    if (lesson == 'online') {
      // 「オンラインで受講」用のテキストを表示する
      $('.note-online').css('display', 'block');
      // 「会場で受講」用のテキストを非表示にする
      $('.note-venue').css('display', 'none');

    // 「会場で受講」がチェックされている場合
    } else if (lesson == 'venue') {
      // 「オンラインで受講」用のテキストを非表示にする
      $('.note-online').css('display', 'none');
      // 「会場で受講」用のテキストを表示する
      $('.note-venue').css('display', 'block');
    }
  });

  /*=================================================
  // 入力チェック(申し込みボタン押下時に実行)
  ===================================================*/
  $('#submit-button').on('click', function(){
    // エラーメッセージを表示するためのエリアを初期化
    $('#name-error').text("");
    $('#tel-error').text("");
    $('#reservation-error').text("");
    $('#lesson-error').text("");

    // 名前が未入力の場合
    if($('input[name="your-name"]').val() == "") {
      // エラーメッセージをセット
      $("#name-error").text("名前は必須項目です。");
    }

    // 電話番号の入力欄に1つでも未入力がある場合
    if(
      ($('input[name="your-tel1"]').val() == "") ||
      ($('input[name="your-tel2"]').val() == "") ||
      ($('input[name="your-tel3"]').val() == "")
    ) {
      // エラーメッセージをセット
      $("#tel-error").text("電話番号は必須項目です。");
    }

    // 予約日が未入力の場合
    if($('input[name="your-reservation"]').val() == "") {
      // エラーメッセージをセット
      $("#reservation-error").text("予約日は必須項目です。");
    }
  });
});