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

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

サマリーへ滑らかに遷移する確認フォーム

入力が終わると内容のサマリー画面へふわっとクロスフェードして切り替わる確認フォームです。Contact Form 7の申込フォームで送信前に内容確認をさせたいときの仕上げに使えます。

clickjsinput

プレビュー

ソースコード

HTML

<div class="d04-09-10-wrap">
          <div class="d04-09-10-form">
            <div class="d04-09-10-page is-show">
              <label class="d04-09-10-flabel">お名前</label>
              <input type="text" class="d04-09-10-finput" data-key="name" placeholder="山田 太郎">
            </div>
            <div class="d04-09-10-page">
              <label class="d04-09-10-flabel">メールアドレス</label>
              <input type="email" class="d04-09-10-finput" data-key="mail" placeholder="you@example.com">
            </div>
            <div class="d04-09-10-nav">
              <button type="button" class="d04-09-10-prevbtn" disabled>戻る</button>
              <button type="button" class="d04-09-10-nextbtn">確認へ</button>
            </div>
          </div>
          <div class="d04-09-10-summary">
            <p class="d04-09-10-stitle">入力内容の確認</p>
            <dl class="d04-09-10-list">
              <dt>お名前</dt><dd class="d04-09-10-vname">-</dd>
              <dt>メール</dt><dd class="d04-09-10-vmail">-</dd>
            </dl>
            <div class="d04-09-10-snav">
              <button type="button" class="d04-09-10-back">修正する</button>
              <button type="button" class="d04-09-10-submit">送信する</button>
            </div>
          </div>
        </div>

CSS

.d04-09-10-wrap{position:relative;width:min(280px,100%);min-height:190px}
        .d04-09-10-form,.d04-09-10-summary{
          position:absolute;inset:0;display:flex;flex-direction:column;
          opacity:0;transform:translateY(8px);pointer-events:none;
          transition:opacity .35s ease,transform .35s ease;
        }
        .d04-09-10-form.is-active,.d04-09-10-summary.is-active{
          opacity:1;transform:translateY(0);pointer-events:auto;
        }
        .d04-09-10-page{display:none;flex-direction:column;gap:6px;margin-bottom:12px}
        .d04-09-10-page.is-show{display:flex}
        .d04-09-10-flabel{font-size:11px;color:#8a93a3}
        .d04-09-10-finput{
          padding:10px 12px;font-size:13px;border:2px solid #d5d9e0;border-radius:8px;
          outline:none;background:#fff;font-family:inherit;
        }
        .d04-09-10-finput:focus{border-color:#4a6cf7}
        .d04-09-10-nav{display:flex;justify-content:space-between;gap:10px;margin-top:auto}
        .d04-09-10-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-10-nextbtn{background:#4a6cf7;border-color:#4a6cf7;color:#fff}
        .d04-09-10-nav button:disabled{opacity:.4;cursor:not-allowed}
        .d04-09-10-stitle{margin:0 0 10px;font-size:13px;font-weight:700;color:#333}
        .d04-09-10-list{margin:0 0 16px;font-size:12px;color:#445}
        .d04-09-10-list dt{color:#8a93a3;margin-top:8px}
        .d04-09-10-list dt:first-child{margin-top:0}
        .d04-09-10-list dd{margin:2px 0 0;font-weight:700;color:#333}
        .d04-09-10-snav{display:flex;justify-content:space-between;gap:10px;margin-top:auto}
        .d04-09-10-snav button{
          padding:9px 14px;font-size:12px;font-weight:700;border-radius:8px;cursor:pointer;
          border:2px solid #d5d9e0;background:#fff;color:#444;transition:background .2s;
        }
        .d04-09-10-submit{background:#4a6cf7;border-color:#4a6cf7;color:#fff}
        .d04-09-10-submit:hover{background:#3a58d6}
        .d04-09-10-submit.is-sent{background:#22b573;border-color:#22b573;cursor:default}

JavaScript

(function(){
        var wrap=document.querySelector('.d04-09-10-wrap');
        if(!wrap)return;
        var form=wrap.querySelector('.d04-09-10-form');
        var summary=wrap.querySelector('.d04-09-10-summary');
        var pages=wrap.querySelectorAll('.d04-09-10-page');
        var prevBtn=wrap.querySelector('.d04-09-10-prevbtn');
        var nextBtn=wrap.querySelector('.d04-09-10-nextbtn');
        var backBtn=wrap.querySelector('.d04-09-10-back');
        var submitBtn=wrap.querySelector('.d04-09-10-submit');
        var vname=wrap.querySelector('.d04-09-10-vname');
        var vmail=wrap.querySelector('.d04-09-10-vmail');
        var total=pages.length;
        var cur=0;
        form.classList.add('is-active');
        function paintPages(){
          pages.forEach(function(p,i){p.classList.toggle('is-show',i===cur);});
          prevBtn.disabled=cur===0;
        }
        prevBtn.addEventListener('click',function(){
          if(cur>0){cur--;paintPages();}
        });
        nextBtn.addEventListener('click',function(e){
          e.preventDefault();
          if(cur<total-1){
            cur++;
            paintPages();
            return;
          }
          var nameVal=wrap.querySelector('[data-key="name"]').value.trim();
          var mailVal=wrap.querySelector('[data-key="mail"]').value.trim();
          vname.textContent=nameVal||'(未入力)';
          vmail.textContent=mailVal||'(未入力)';
          form.classList.remove('is-active');
          summary.classList.add('is-active');
        });
        backBtn.addEventListener('click',function(){
          summary.classList.remove('is-active');
          form.classList.add('is-active');
        });
        submitBtn.addEventListener('click',function(e){
          e.preventDefault();
          submitBtn.textContent='送信しました';
          submitBtn.classList.add('is-sent');
        });
      })();

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