パーツ番号 04-09-05 ・ JavaScript使用
矢印送りカルーセル型フォーム
左右の矢印ボタンでステップを行き来できるカルーセル型の予約フォームです。日付・時間・人数など項目数の多い予約フォームをコンパクトな1画面にまとめたいときに便利です。
プレビュー
ソースコード
HTML
<div class="d04-09-05-wrap">
<div class="d04-09-05-carousel">
<button type="button" class="d04-09-05-arrow d04-09-05-arrow-l" aria-label="前のステップへ" disabled>‹</button>
<div class="d04-09-05-viewport">
<div class="d04-09-05-track">
<div class="d04-09-05-pane">
<span class="d04-09-05-tag">STEP 1</span>
<p>ご希望の来店日</p>
<input type="date" class="d04-09-05-input">
</div>
<div class="d04-09-05-pane">
<span class="d04-09-05-tag">STEP 2</span>
<p>ご希望の時間帯</p>
<select class="d04-09-05-input"><option>午前</option><option>午後</option></select>
</div>
<div class="d04-09-05-pane">
<span class="d04-09-05-tag">STEP 3</span>
<p>ご来店人数</p>
<input type="number" class="d04-09-05-input" value="1" min="1">
</div>
</div>
</div>
<button type="button" class="d04-09-05-arrow d04-09-05-arrow-r" aria-label="次のステップへ">›</button>
</div>
<div class="d04-09-05-dots">
<span class="d04-09-05-dot is-active"></span><span class="d04-09-05-dot"></span><span class="d04-09-05-dot"></span>
</div>
</div>CSS
.d04-09-05-wrap{width:min(280px,100%)}
.d04-09-05-carousel{display:flex;align-items:center;gap:8px}
.d04-09-05-arrow{
flex:0 0 auto;width:30px;height:30px;border-radius:50%;border:2px solid #d5d9e0;
background:#fff;color:#444;font-size:16px;line-height:1;cursor:pointer;
transition:opacity .2s,background .2s,border-color .2s,color .2s;
display:flex;align-items:center;justify-content:center;
}
.d04-09-05-arrow:hover{background:#eef2ff;border-color:#4a6cf7;color:#4a6cf7}
.d04-09-05-arrow:disabled{opacity:.35;cursor:not-allowed}
.d04-09-05-viewport{flex:1;overflow:hidden}
.d04-09-05-track{display:flex;transition:transform .4s cubic-bezier(.4,0,.2,1)}
.d04-09-05-pane{flex:0 0 100%;box-sizing:border-box;padding:0 4px;text-align:center}
.d04-09-05-tag{
display:inline-block;font-size:10px;font-weight:700;color:#4a6cf7;
background:#eef2ff;padding:2px 8px;border-radius:99px;margin-bottom:8px;
}
.d04-09-05-pane p{margin:0 0 8px;font-size:13px;color:#333;font-weight:700}
.d04-09-05-input{
width:100%;box-sizing:border-box;padding:9px 10px;font-size:13px;
border:2px solid #d5d9e0;border-radius:8px;outline:none;background:#fff;font-family:inherit;
}
.d04-09-05-input:focus{border-color:#4a6cf7}
.d04-09-05-dots{display:flex;justify-content:center;gap:6px;margin-top:14px}
.d04-09-05-dot{width:6px;height:6px;border-radius:50%;background:#e4e8ef;transition:background .3s,transform .3s}
.d04-09-05-dot.is-active{background:#4a6cf7;transform:scale(1.3)}JavaScript
(function(){
var wrap=document.querySelector('.d04-09-05-wrap');
if(!wrap)return;
var track=wrap.querySelector('.d04-09-05-track');
var panes=wrap.querySelectorAll('.d04-09-05-pane');
var dots=wrap.querySelectorAll('.d04-09-05-dot');
var l=wrap.querySelector('.d04-09-05-arrow-l');
var r=wrap.querySelector('.d04-09-05-arrow-r');
var total=panes.length;
var cur=0;
function paint(){
track.style.transform='translateX(-'+(cur*100)+'%)';
dots.forEach(function(d,i){d.classList.toggle('is-active',i===cur);});
l.disabled=cur===0;
r.disabled=cur===total-1;
}
l.addEventListener('click',function(){
if(cur>0){cur--;paint();}
});
r.addEventListener('click',function(){
if(cur<total-1){cur++;paint();}
});
})();クラス名 .d04-09-05 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。