来店予約フォーム
Shopify用の来店予約フォームデモページです。店舗選択はカード形式のUIで視認性が高く、来店目的は複数選択に対応。希望日時は第1・第2希望まで入力でき、時間帯はボタン形式で直感的に選択できます。来店人数の指定、お名前・メールアドレス・電話番号の入力欄、自由記述のご要望欄も完備。実店舗を持つECサイトの予約受付業務を効率化し、顧客とのスムーズなコミュニケーションを実現します。HTML・CSSをコピーしてすぐにご利用いただけます。
プレビュー
※プレビューのため送信ボタンは押せません
コード
HTML
<h1>来店予約</h1>
<p class="form-description">ご来店日時をご予約いただけます。<br>スタッフが丁寧にご案内いたします。</p>
<div class="info-box">
<div class="info-box-title">営業時間</div>
<div class="info-box-content">
平日 10:00〜19:00 / 土日祝 10:00〜18:00<br>
定休日:水曜日
</div>
</div>
<form action="#" method="POST">
<div class="form-group">
<label class="required">ご来店店舗</label>
<div class="store-cards">
<label class="store-card">
<input type="radio" name="store" value="shibuya" required>
<div class="store-name">渋谷店</div>
<div class="store-address">東京都渋谷区〇〇1-2-3</div>
</label>
<label class="store-card">
<input type="radio" name="store" value="shinjuku">
<div class="store-name">新宿店</div>
<div class="store-address">東京都新宿区〇〇4-5-6</div>
</label>
</div>
</div>
<div class="form-group">
<label class="required">ご来店目的</label>
<div class="checkbox-group">
<label class="checkbox-item">
<input type="checkbox" name="purpose[]" value="purchase">
<span>購入相談</span>
</label>
<label class="checkbox-item">
<input type="checkbox" name="purpose[]" value="try">
<span>試着・試用</span>
</label>
<label class="checkbox-item">
<input type="checkbox" name="purpose[]" value="repair">
<span>修理・メンテナンス</span>
</label>
<label class="checkbox-item">
<input type="checkbox" name="purpose[]" value="pickup">
<span>商品受け取り</span>
</label>
<label class="checkbox-item">
<input type="checkbox" name="purpose[]" value="other">
<span>その他</span>
</label>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="date1" class="required">第1希望日</label>
<input type="date" id="date1" name="date1" required>
</div>
<div class="form-group">
<label class="required">第1希望時間</label>
<div class="time-slots">
<div class="time-slot">
<input type="radio" name="time1" value="10:00" id="time1-1" required>
<label for="time1-1">10:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="11:00" id="time1-2">
<label for="time1-2">11:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="12:00" id="time1-3">
<label for="time1-3">12:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="13:00" id="time1-4">
<label for="time1-4">13:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="14:00" id="time1-5">
<label for="time1-5">14:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="15:00" id="time1-6">
<label for="time1-6">15:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="16:00" id="time1-7">
<label for="time1-7">16:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time1" value="17:00" id="time1-8">
<label for="time1-8">17:00</label>
</div>
</div>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="date2">第2希望日</label>
<input type="date" id="date2" name="date2">
</div>
<div class="form-group">
<label>第2希望時間</label>
<div class="time-slots">
<div class="time-slot">
<input type="radio" name="time2" value="10:00" id="time2-1">
<label for="time2-1">10:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="11:00" id="time2-2">
<label for="time2-2">11:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="12:00" id="time2-3">
<label for="time2-3">12:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="13:00" id="time2-4">
<label for="time2-4">13:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="14:00" id="time2-5">
<label for="time2-5">14:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="15:00" id="time2-6">
<label for="time2-6">15:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="16:00" id="time2-7">
<label for="time2-7">16:00</label>
</div>
<div class="time-slot">
<input type="radio" name="time2" value="17:00" id="time2-8">
<label for="time2-8">17:00</label>
</div>
</div>
</div>
</div>
<div class="form-group">
<label for="guests" class="required">ご来店人数</label>
<select id="guests" name="guests" required style="max-width: 200px;">
<option value="">選択</option>
<option value="1">1名</option>
<option value="2">2名</option>
<option value="3">3名</option>
<option value="4">4名以上</option>
</select>
</div>
<div class="form-row">
<div class="form-group">
<label for="name" class="required">お名前</label>
<input type="text" id="name" name="name" required autocomplete="name">
</div>
<div class="form-group">
<label for="kana">フリガナ</label>
<input type="text" id="kana" name="kana" placeholder="ヤマダ タロウ">
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="email" class="required">メールアドレス</label>
<input type="email" id="email" name="email" required autocomplete="email">
</div>
<div class="form-group">
<label for="phone" class="required">電話番号</label>
<input type="tel" id="phone" name="phone" required autocomplete="tel">
</div>
</div>
<div class="form-group">
<label for="message">ご要望・ご質問</label>
<textarea id="message" name="message" placeholder="事前にお伝えしたいことがあればご記入ください"></textarea>
</div>
<button type="submit" class="btn-submit">予約する</button>
</form>
CSS
.form-description {
color: #666;
margin-bottom: 32px;
font-size: 14px;
}
.form-group {
margin-bottom: 24px;
}
label {
display: block;
font-weight: 500;
margin-bottom: 8px;
font-size: 14px;
}
.required::after {
content: "*";
color: #e53935;
margin-left: 4px;
}
input[type="text"],
input[type="email"],
input[type="tel"],
input[type="date"],
select,
textarea {
width: 100%;
padding: 12px 16px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 16px;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
}
input:focus,
select:focus,
textarea:focus {
outline: none;
border-color: #2563eb;
box-shadow: 0 0 0 3px rgba(37,99,235,0.1);
}
textarea {
min-height: 100px;
resize: vertical;
}
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
@media (max-width: 540px) {
.form-row {
grid-template-columns: 1fr;
}
}
/* チェックボックスグループ(カード型) */
.checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
padding: 10px 16px;
border: 1px solid #ddd;
border-radius: 6px;
transition: border-color 0.2s, background 0.2s;
}
.checkbox-item:hover {
border-color: #2563eb;
}
.checkbox-item:has(input:checked) {
border-color: #2563eb;
background: #eff6ff;
}
.checkbox-item input[type="checkbox"] {
width: 18px;
height: 18px;
accent-color: #2563eb;
}
/* 店舗選択カード */
.store-cards {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
@media (max-width: 540px) {
.store-cards {
grid-template-columns: 1fr;
}
}
.store-card {
position: relative;
border: 2px solid #ddd;
border-radius: 8px;
padding: 16px;
cursor: pointer;
transition: border-color 0.2s, background 0.2s;
}
.store-card:hover {
border-color: #2563eb;
}
.store-card:has(input:checked) {
border-color: #2563eb;
background: #eff6ff;
}
.store-card input[type="radio"] {
position: absolute;
top: 16px;
right: 16px;
width: 18px;
height: 18px;
accent-color: #2563eb;
}
.store-name {
font-weight: 600;
margin-bottom: 4px;
}
.store-address {
font-size: 13px;
color: #666;
}
/* 時間選択スロット */
.time-slots {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;
}
@media (max-width: 540px) {
.time-slots {
grid-template-columns: repeat(3, 1fr);
}
}
.time-slot {
position: relative;
}
.time-slot input[type="radio"] {
position: absolute;
opacity: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
.time-slot label {
display: block;
text-align: center;
padding: 10px 8px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s;
margin-bottom: 0;
}
.time-slot:hover label {
border-color: #2563eb;
}
.time-slot input:checked + label {
border-color: #2563eb;
background: #2563eb;
color: #fff;
}
/* 送信ボタン */
.btn-submit {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px 32px;
background: #2563eb;
color: #fff;
border: none;
border-radius: 6px;
font-size: 16px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s, transform 0.1s;
}
.btn-submit:hover {
background: #1d4ed8;
}
.btn-submit:active {
transform: translateY(1px);
}
/* インフォボックス */
.info-box {
background: #f0f9ff;
border: 1px solid #bae6fd;
border-radius: 8px;
padding: 16px;
margin-bottom: 24px;
}
.info-box-title {
font-weight: 600;
font-size: 14px;
margin-bottom: 8px;
color: #0369a1;
}
.info-box-content {
font-size: 13px;
color: #0c4a6e;
}