← 動的パーツギャラリーへ戻る

パーツ番号 10-07-12 ・ JavaScript使用

範囲選択カレンダー(チェックイン/チェックアウト)

開始日と終了日を順にクリックすると、その間の日付がまとめてハイライトされる宿泊日程選択カレンダーです。ホテルや民泊サイトの日程選択に使えます。

clickjs

プレビュー

ソースコード

HTML

<div class="d10-07-12-wrap">
          <p class="d10-07-12-title">宿泊日程を選択(チェックイン→チェックアウト)</p>
          <div class="d10-07-12-grid">
            <span class="d10-07-12-w">月</span><span class="d10-07-12-w">火</span><span class="d10-07-12-w">水</span><span class="d10-07-12-w">木</span><span class="d10-07-12-w">金</span><span class="d10-07-12-w">土</span><span class="d10-07-12-w">日</span>
          </div>
          <p class="d10-07-12-summary">日付を選択してください</p>
        </div>

CSS

.d10-07-12-wrap{width:100%;max-width:260px;}
        .d10-07-12-title{font-size:11px;color:#666;margin:0 0 8px;text-align:center;}
        .d10-07-12-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;}
        .d10-07-12-w{font-size:10px;color:#999;text-align:center;padding-bottom:2px;}
        .d10-07-12-d{font-size:11px;text-align:center;padding:6px 0;border-radius:4px;color:#333;background:#f7f8fa;cursor:pointer;transition:background .2s ease,color .2s ease;}
        .d10-07-12-d:hover{background:#e6edff;}
        .d10-07-12-d.is-start,.d10-07-12-d.is-end{background:#2f6fed;color:#fff;font-weight:700;}
        .d10-07-12-d.is-range{background:#d7e6ff;}
        .d10-07-12-summary{font-size:11px;color:#2f6fed;margin-top:10px;text-align:center;font-weight:600;}

JavaScript

(function(){
          var root = document.getElementById('item-10-07-12');
          if(!root) return;
          var grid = root.querySelector('.d10-07-12-grid');
          var summary = root.querySelector('.d10-07-12-summary');
          for(var i=1;i<=14;i++){
            var d = document.createElement('span');
            d.className = 'd10-07-12-d';
            d.textContent = i;
            d.setAttribute('data-day', i);
            grid.appendChild(d);
          }
          var days = root.querySelectorAll('.d10-07-12-d');
          var start = null, end = null;
          function render(){
            days.forEach(function(d){
              var n = +d.getAttribute('data-day');
              d.classList.remove('is-start','is-end','is-range');
              if(start && n === start) d.classList.add('is-start');
              if(end && n === end) d.classList.add('is-end');
              if(start && end && n > start && n < end) d.classList.add('is-range');
            });
            if(start && end){
              summary.textContent = '7/' + start + ' 〜 7/' + end + '(' + (end - start) + '泊)';
            } else if(start){
              summary.textContent = 'チェックアウト日を選択してください';
            } else {
              summary.textContent = '日付を選択してください';
            }
          }
          days.forEach(function(d){
            d.addEventListener('click', function(){
              var n = +d.getAttribute('data-day');
              if(!start || (start && end)){
                start = n; end = null;
              } else if(n > start){
                end = n;
              } else {
                start = n;
              }
              render();
            });
          });
        })();

クラス名 .d10-07-12 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。