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

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

丸数字ステップインジケータ付きフォーム

上部の丸数字が現在地を示し、進むたびに完了ステップが緑のチェック色に変わるフォームです。会員登録や資料請求など複数ページにまたがる申込フローの進捗を分かりやすく伝えられます。

jsinput

プレビュー

ソースコード

HTML

<div class="d04-09-02-wrap">
          <div class="d04-09-02-steps">
            <div class="d04-09-02-node is-active"><span class="d04-09-02-circle">1</span><span class="d04-09-02-label">基本情報</span></div>
            <span class="d04-09-02-line"></span>
            <div class="d04-09-02-node"><span class="d04-09-02-circle">2</span><span class="d04-09-02-label">連絡先</span></div>
            <span class="d04-09-02-line"></span>
            <div class="d04-09-02-node"><span class="d04-09-02-circle">3</span><span class="d04-09-02-label">確認</span></div>
          </div>
          <div class="d04-09-02-panel">
            <div class="d04-09-02-page is-show">
              <label class="d04-09-02-flabel">お名前</label>
              <input type="text" class="d04-09-02-finput" placeholder="山田 太郎">
            </div>
            <div class="d04-09-02-page">
              <label class="d04-09-02-flabel">電話番号</label>
              <input type="tel" class="d04-09-02-finput" placeholder="090-1234-5678">
            </div>
            <div class="d04-09-02-page">
              <p class="d04-09-02-confirm">入力内容をご確認の上、送信してください。</p>
            </div>
          </div>
          <div class="d04-09-02-nav">
            <button type="button" class="d04-09-02-prevbtn" disabled>戻る</button>
            <button type="button" class="d04-09-02-nextbtn">次へ</button>
          </div>
        </div>

CSS

.d04-09-02-wrap{width:min(280px,100%)}
        .d04-09-02-steps{display:flex;align-items:flex-start;justify-content:center;margin-bottom:18px}
        .d04-09-02-node{display:flex;flex-direction:column;align-items:center;gap:6px;flex:0 0 auto}
        .d04-09-02-circle{
          width:26px;height:26px;border-radius:50%;background:#e4e8ef;color:#8a93a3;
          display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;
          transition:background .3s,color .3s;
        }
        .d04-09-02-node.is-active .d04-09-02-circle{background:#4a6cf7;color:#fff}
        .d04-09-02-node.is-done .d04-09-02-circle{background:#22b573;color:#fff}
        .d04-09-02-label{font-size:10px;color:#8a93a3;white-space:nowrap}
        .d04-09-02-node.is-active .d04-09-02-label{color:#4a6cf7;font-weight:700}
        .d04-09-02-line{width:30px;height:2px;background:#e4e8ef;margin:12px 4px 0;transition:background .3s}
        .d04-09-02-line.is-done{background:#22b573}
        .d04-09-02-panel{min-height:74px}
        .d04-09-02-page{display:none;flex-direction:column;gap:6px}
        .d04-09-02-page.is-show{display:flex}
        .d04-09-02-flabel{font-size:11px;color:#8a93a3}
        .d04-09-02-finput{
          padding:10px 12px;font-size:13px;border:2px solid #d5d9e0;border-radius:8px;
          outline:none;background:#fff;font-family:inherit;
        }
        .d04-09-02-finput:focus{border-color:#4a6cf7}
        .d04-09-02-confirm{margin:0;font-size:12px;color:#445;line-height:1.7}
        .d04-09-02-nav{display:flex;justify-content:space-between;gap:10px;margin-top:16px}
        .d04-09-02-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-02-nextbtn{background:#4a6cf7;border-color:#4a6cf7;color:#fff}
        .d04-09-02-nav button:disabled{opacity:.4;cursor:not-allowed}

JavaScript

(function(){
        var wrap=document.querySelector('.d04-09-02-wrap');
        if(!wrap)return;
        var nodes=wrap.querySelectorAll('.d04-09-02-node');
        var lines=wrap.querySelectorAll('.d04-09-02-line');
        var pages=wrap.querySelectorAll('.d04-09-02-page');
        var prevBtn=wrap.querySelector('.d04-09-02-prevbtn');
        var nextBtn=wrap.querySelector('.d04-09-02-nextbtn');
        var total=nodes.length;
        var cur=0;
        function paint(){
          nodes.forEach(function(n,i){
            n.classList.toggle('is-active',i===cur);
            n.classList.toggle('is-done',i<cur);
          });
          lines.forEach(function(l,i){l.classList.toggle('is-done',i<cur);});
          pages.forEach(function(p,i){p.classList.toggle('is-show',i===cur);});
          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-02 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。