こんな方に読んでほしい
[記事の内容]

お問い合わせフォームでは、個人情報の取り扱いに同意してもらったうえで送信してもらうケースが多くあります。
デモサイトはコチラから。
そこで、「同意する」にチェックを入れるまで、送信ボタンを押せないようにする仕組みを実装します。
完成イメージは以下のようになります。

チェックを入れる前は送信ボタンがグレーで押せず、チェックを入れると黒色になり押せるようになります。
まずは、ベースとなるHTML構造を作成します。
プライバシーポリシー、同意チェックボックス、送信ボタンの3つを用意することがポイントです。
書き方は以下のようになります。
<div class="policy-area" role="region" aria-label="個人情報に関する取り扱いについて" tabindex="0">
<h3 class="policy-ttl">個人情報に関する取り扱いについて</h3>
<p>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</p>
<p>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</p>
</div>
<div class="contactForm__agree">
<label class="contactForm__agreeLabel">
<input id="agree" class="contactForm__agreeCheck" name="agree" type="checkbox" value="1" />
<span class="contactForm__agreeText">個人情報に関する取り扱いについて同意する</span>
</label>
</div>
<p class="submitbtn">
<input id="submitbtn" type="submit" value="送信する" disabled />
</p>
<input type="hidden" name="mailToNum" value="0" />
<input type="hidden" name="mode" value="confirm" />
role="region"とaria-labelを指定し、スクリーンリーダーでも内容が分かるようにしています。labelで囲むことで、テキストをクリックしてもチェックを切り替えられます。disabledを指定しておくことで、初期状態では押せないようにします。mailToNumとmodeを指定しています。ご利用のフォームに合わせて変更してください。※<form>タグの中に記述してください。tabindex="0"を指定しているため、キーボード操作でもポリシーエリアにフォーカスできます。
次に、CSSでチェックボックスと送信ボタンのデザインを調整します。
チェックボックスはブラウザ標準の見た目を消して、オリジナルのデザインにしています。
書き方は以下のようになります。
/* --- 同意チェックボックス --- */
.contactForm__agree {
display: flex;
justify-content: center;
margin-bottom: 20px;
}
.contactForm__agreeLabel {
display: inline-flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.contactForm__agreeCheck {
appearance: none;
position: relative;
flex-shrink: 0;
width: 30px;
height: 30px;
margin: 0;
border: 1px solid #CCC;
border-radius: 8px;
background-color: #fff;
cursor: pointer;
transition: background-color 0.08s ease-out, border-color 0.2s ease;
}
.contactForm__agreeCheck:checked {
background-color: #007bff;
border-color: #007bff;
}
.contactForm__agreeCheck:checked::after {
content: "";
position: absolute;
top: 5px;
left: 10px;
width: 7px;
height: 13px;
border: solid #fff;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
}
.contactForm__agreeText {
font-size: 1.6rem;
font-weight: bold;
letter-spacing: 0.02em;
white-space: nowrap;
line-height: 1;
}
/* --- 送信ボタン --- */
.submitbtn {
text-align: center;
}
/* 非活性(無効)時:グレー */
.submitbtn input[type="submit"]:disabled {
background-color: #ccc;
color: #666;
cursor: not-allowed;
border: none;
}
/* 有効時:黒 */
.submitbtn input[type="submit"] {
background-color: #000;
color: #fff;
cursor: pointer;
border: none;
padding: 12px 40px;
font-size: 1.6rem;
font-weight: bold;
border-radius: 4px;
transition: background-color 0.2s ease;
}
widthやborderで自由にデザインできるようにします。rotate(45deg)で回転させることで「✓」の形になります。cursor: not-allowed;で押せないことを分かりやすくします。デザインの数値や色は、ご自身のサイトに合わせて自由に変更してください。
最後に、JavaScriptでチェックボックスの状態に合わせて、送信ボタンの有効・無効を切り替えます。
書き方は以下のようになります。
document.addEventListener('DOMContentLoaded', () => {
const agreeCheckbox = document.getElementById('agree');
const submitBtn = document.getElementById('submitbtn');
// ボタンの有効・無効を切り替える関数
const toggleSubmitButton = () => {
submitBtn.disabled = !agreeCheckbox.checked;
};
// ページ読み込み時の初期状態を反映(リロード対策)
toggleSubmitButton();
// チェックボックス操作時に状態を反映
agreeCheckbox.addEventListener('change', toggleSubmitButton);
});
getElementById()を使用して、チェックボックスと送信ボタンを取得します。agreeCheckbox.checkedは、チェックが入っているとtrueになります。!で反転させて、disabledに代入しています。addEventListener('change', ...)を使用して、チェックの状態が変わるたびに、送信ボタンの状態を更新します。JavaScriptの制御は、あくまで画面上の補助的な仕組みです。ブラウザの開発者ツールなどでdisabledを外すと、同意なしでも送信できてしまいます。必要な場合は、サーバー側でもagreeの値を確認するようにしましょう。
今回はこれで以上です。
今回は、お問い合わせフォームの「同意する」チェックボックスと、送信ボタンを連動させる方法を解説しました。
HTMLでdisabled付きの送信ボタンを用意し、CSSで状態ごとのデザインを調整し、JavaScriptでchangeイベントに合わせて切り替えるだけで実装できます。
ぜひ、ご自身のフォームにも取り入れてみてください。
disabledを指定します。labelで囲むと、テキストをクリックしてもチェックできます。:checkedで、チェック時のデザインを指定します。:disabledで、無効時のボタンをグレーにします。changeイベントで、ボタンの状態を切り替えます。2026.10.21
2026.10.20
2026.10.19
2026.10.15
2026.10.14
2026.10.13
2026.10.10
2026.08.14
2026.08.12
2026.04.05

© 2026 shu-naka-blog