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

パーツ番号 04-09-03 ・ JavaScript使用

伸びるプログレスバー申込みフォーム

入力の進み具合に合わせて上部のバーがぐんぐん伸びていく申込みフォームです。Contact Form 7の入会申込みや予約フォームで完了までの目安を視覚的に伝えたいときに使えます。

jsinput

プレビュー

ソースコード

HTML

<div class="d04-09-03-wrap">
          <div class="d04-09-03-head">
            <span class="d04-09-03-title">お申し込み手続き</span>
            <span class="d04-09-03-pct">33%</span>
          </div>
          <div class="d04-09-03-track"><span class="d04-09-03-fill"></span></div>
          <div class="d04-09-03-body">
            <div class="d04-09-03-page is-show">
              <label class="d04-09-03-flabel">お名前</label>
              <input type="text" class="d04-09-03-finput" placeholder="山田 太郎">
            </div>
            <div class="d04-09-03-page">
              <label class="d04-09-03-flabel">ご住所</label>
              <input type="text" class="d04-09-03-finput" placeholder="東京都〇〇区…">
            </div>
            <div class="d04-09-03-page">
              <label class="d04-09-03-flabel">お支払い方法</label>
              <select class="d04-09-03-finput"><option>クレジットカード</option><option>銀行振込</option></select>
            </div>
          </div>
          <div class="d04-09-03-nav">
            <button type="button" class="d04-09-03-prevbtn" disabled>戻る</button>
            <button type="button" class="d04-09-03-nextbtn">次へ</button>
          </div>
        </div>

CSS

.d04-09-03-wrap{width:min(280px,100%)}
        .d04-09-03-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px}
        .d04-09-03-title{font-size:12px;font-weight:700;color:#333}
        .d04-09-03-pct{font-size:12px;font-weight:700;color:#4a6cf7}
        .d04-09-03-track{height:8px;background:#e4e8ef;border-radius:99px;overflow:hidden;margin-bottom:16px}
        .d04-09-03-fill{
          display:block;height:100%;width:33.33%;border-radius:99px;
          background:linear-gradient(90deg,#4a6cf7,#7c8cf8);transition:width .4s ease;
        }
        .d04-09-03-body{min-height:64px}
        .d04-09-03-page{display:none;flex-direction:column;gap:6px}
        .d04-09-03-page.is-show{display:flex}
        .d04-09-03-flabel{font-size:11px;color:#8a93a3}
        .d04-09-03-finput{
          padding:10px 12px;font-size:13px;border:2px solid #d5d9e0;border-radius:8px;
          outline:none;background:#fff;font-family:inherit;
        }
        .d04-09-03-finput:focus{border-color:#4a6cf7}
        .d04-09-03-nav{display:flex;justify-content:space-between;gap:10px;margin-top:16px}
        .d04-09-03-nav button{
          padding:9px 14px;font-size:12px;font-weight:700;border-radius:8px;cursor:pointer;
          border:2px solid #d5d9e0;background:#fff;color:#444;
        }
        .d04-09-03-nextbtn{background:#4a6cf7;border-color:#4a6cf7;color:#fff}
        .d04-09-03-nav button:disabled{opacity:.4;cursor:not-allowed}

JavaScript

(function(){
        var wrap=document.querySelector('.d04-09-03-wrap');
        if(!wrap)return;
        var pages=wrap.querySelectorAll('.d04-09-03-page');
        var fill=wrap.querySelector('.d04-09-03-fill');
        var pct=wrap.querySelector('.d04-09-03-pct');
        var prevBtn=wrap.querySelector('.d04-09-03-prevbtn');
        var nextBtn=wrap.querySelector('.d04-09-03-nextbtn');
        var total=pages.length;
        var cur=0;
        function paint(){
          pages.forEach(function(p,i){p.classList.toggle('is-show',i===cur);});
          var p=Math.round((cur+1)/total*100);
          fill.style.width=p+'%';
          pct.textContent=p+'%';
          prevBtn.disabled=cur===0;
          nextBtn.textContent=cur===total-1?'申し込む':'次へ';
        }
        prevBtn.addEventListener('click',function(){
          if(cur>0){cur--;paint();}
        });
        nextBtn.addEventListener('click',function(){
          if(cur<total-1){cur++;paint();}
        });
      })();

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