今回は、チェックボックスのデザインをHTMLとCSSのサンプルと共にご紹介します。汎用的なデザインを集めているのでフォームのコーディングやデザインの際にコピペして利用すると使い勝手もよく便利です。フロントエンド初学者でもカスタマイズしてコードを再利用できます。
input要素からチェックボックスをCSSでカスタマイズするのは難易度が少し高いです。
検索してもあまりでてこないアクセシビリティ対応のチェックボックスのカスタマイズ方法ですので、ぜひ活用してください。
基本のチェックボックス です。シンプルで使いやすいデザインにしています。
<label class="ECM_CheckboxInput"><input class="ECM_CheckboxInput-Input" type="checkbox"><span class="ECM_CheckboxInput-DummyInput"></span><span class="ECM_CheckboxInput-LabelText">利用規約に同意する</span></label>
.ECM_CheckboxInput {
padding: 12px 8px;
display: flex;
align-items: center;
cursor: pointer;
}
.ECM_CheckboxInput-Input {
margin: 0;
width: 0;
opacity: 0;
}
.ECM_CheckboxInput:hover > .ECM_CheckboxInput-DummyInput {
background: #DDDDDD !important;
border: solid 2px #333333;
}
.ECM_CheckboxInput-Input:focus + .ECM_CheckboxInput-DummyInput {
background: #DDDDDD !important;
border: solid 2px #333333;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput {
border: solid 2px #333333;
background: #FFFFFF;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::before {
content: "";
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItY2hlY2siPjxwb2x5bGluZSBwb2ludHM9IjIwIDYgOSAxNyA0IDEyIj48L3BvbHlsaW5lPjwvc3ZnPg==") no-repeat center;
background-size: contain;
}
.ECM_CheckboxInput-DummyInput {
position: relative;
top: 0;
left: 0;
display: block;
width: 32px;
height: 32px;
border: solid 2px #888888;
background: #FFFFFF;
border-radius: 4px;
}
.ECM_CheckboxInput-LabelText {
margin-left: 12px;
display: block;
font-size: 18px;
font-weight: bold;
}
borderの色を変更してカスタマイズしてみましょう。
このチェックボックス は、チェックアイコンをbackgroundにインラインSVG画像を指定して埋め込んでいます。
黒背景に白のチェックマークのチェックボックス です。こちらも使いやすいデザインにしています。
<label class="ECM_CheckboxInput"><input class="ECM_CheckboxInput-Input" type="checkbox"><span class="ECM_CheckboxInput-DummyInput"></span><span class="ECM_CheckboxInput-LabelText">利用規約に同意する</span></label>
.ECM_CheckboxInput {
padding: 12px 8px;
display: flex;
align-items: center;
cursor: pointer;
}
.ECM_CheckboxInput-Input {
margin: 0;
width: 0;
opacity: 0;
}
.ECM_CheckboxInput:hover{
background: rgba(0,0,0,.05) !important;
}
.ECM_CheckboxInput-Input:focus + .ECM_CheckboxInput-DummyInput{
border: dashed 2px #333333;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput {
background: #333333;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::before {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 40%;
height: 4px;
border-radius: 2px;
transform: translate(-6px, 5px) rotateZ(-135deg);
transform-origin: 2px 2px;
background: #FFFFFF;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::after {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 76%;
height: 4px;
border-radius: 2px;
transform: translate(-6px, 5px) rotateZ(-45deg);
transform-origin: 2px 2px;
background: #FFFFFF;
}
.ECM_CheckboxInput-DummyInput {
position: relative;
top: 0;
left: 0;
display: block;
width: 32px;
height: 32px;
border: solid 2px transparent;
background: rgba(0,0,0, .1);
border-radius: 4px;
}
.ECM_CheckboxInput-LabelText {
margin-left: 12px;
display: block;
font-size: 18px;
font-weight: bold;
}
背景色をカスタマイズしてみましょう。
また、チェックアイコンの色や大きさもbefore要素とafter要素で線をつくって実現してるため、カスタマイズできます。
スタイリッシュなチェックボックス です。細い線と影が特徴です。
<label class="ECM_CheckboxInput"><input class="ECM_CheckboxInput-Input" type="checkbox"><span class="ECM_CheckboxInput-DummyInput"></span><span class="ECM_CheckboxInput-LabelText">利用規約に同意する</span></label>
.ECM_CheckboxInput {
padding: 12px 8px;
display: flex;
align-items: center;
cursor: pointer;
}
.ECM_CheckboxInput-Input {
margin: 0;
width: 0;
opacity: 0;
}
.ECM_CheckboxInput:hover > .ECM_CheckboxInput-DummyInput{
background: #CCCCCC;
}
.ECM_CheckboxInput-Input:focus + .ECM_CheckboxInput-DummyInput{
background: #CCCCCC;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput {
background: #555555;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::before {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 35%;
height: 2px;
transform: translate(-5px, 6px) rotateZ(-135deg);
transform-origin: 1px 1px;
background: #FFFFFF;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::after {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 70%;
height: 2px;
transform: translate(-5px, 6px) rotateZ(-45deg);
transform-origin: 1px 1px;
background: #FFFFFF;
}
.ECM_CheckboxInput-DummyInput {
position: relative;
top: 0;
left: 0;
display: block;
width: 32px;
height: 32px;
background: #F5F5F5;
box-shadow: 0 1px 4px rgba(0,0,0, .4) inset;
}
.ECM_CheckboxInput-LabelText {
margin-left: 12px;
display: block;
font-size: 18px;
font-weight: bold;
}
キュートな円形のチェックボックスです。ポップでかわいいデザインに仕上げました。
<label class="ECM_CheckboxInput"><input class="ECM_CheckboxInput-Input" type="checkbox"><span class="ECM_CheckboxInput-DummyInput"></span><span class="ECM_CheckboxInput-LabelText">利用規約に同意する</span></label>
.ECM_CheckboxInput {
padding: 12px 8px;
display: flex;
align-items: center;
cursor: pointer;
}
.ECM_CheckboxInput-Input {
margin: 0;
width: 0;
opacity: 0;
}
.ECM_CheckboxInput:hover{
background: rgba(0,0,0,.05) !important;
}
.ECM_CheckboxInput:hover > .ECM_CheckboxInput-DummyInput{
transform: scale(1.1);
}
.ECM_CheckboxInput-Input:focus + .ECM_CheckboxInput-DummyInput{
transform: scale(1.1);
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput {
background: rgba(107, 26, 250, 1);
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::before {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 35%;
height: 4px;
border-radius: 2px;
transform: translate(-6px, 5px) rotateZ(-135deg);
transform-origin: 2px 2px;
background: #FFFFFF;
}
.ECM_CheckboxInput-Input:checked + .ECM_CheckboxInput-DummyInput::after {
content: "";
display: block;
position: absolute;
top: 50%;
left: 50%;
width: 70%;
height: 4px;
border-radius: 2px;
transform: translate(-6px, 5px) rotateZ(-45deg);
transform-origin: 2px 2px;
background: #FFFFFF;
}
.ECM_CheckboxInput-DummyInput {
position: relative;
top: 0;
left: 0;
display: block;
width: 32px;
height: 32px;
border: solid 2px transparent;
background: rgba(0, 0, 0, .15);
border-radius: 50%;
transition: all .15s linear;
}
.ECM_CheckboxInput-LabelText {
margin-left: 12px;
display: block;
font-size: 18px;
font-weight: bold;
}
HTMLとCSSの解説
今回のチェックボックスのHTMLは全て同じものを使っています。CSSの書き方次第で様々なデザインが表現できます。
多くのサイトで紹介されているチェックボックスはdisplay: none;を使ったカスタマイズであるため、キーボードを使った選択操作ができません。アクセシビリティに対応していないということです。また、hoverやfocusなどinputを選択している時のスタイルも指定されていないため、ユーザーにとってわかりにくいものとなってしまいます。
解決方法は簡単です。input要素をdisplay: none;にするのではなく、widthを0にします。こうすることでタブによるフォーカスやスペースによる選択ができるようになります。今回、紹介しているチェックボックス はすべて対応しています。
ラジオボタンのコピペ実装記事はこちら
【コピペ可】HTMLとCSSでラジオボタンのデザイン4選この記事をかいてみての感想
僕もかつては「CSS チェックボックス 」と毎度毎度検索してはその度にHTMLとCSSを読み解いていた記憶があります。他の記事を読んでいてもHTML構造が複雑であったり、カスタマイズがしづらかったりして困っていました。ということで、記事にしてみました。
チェックボックスにチェックすると、送信が可能になるボタンの実装方法がわかりません。
助けてください。
コメントありがとうございます。
チェックボックスがチェックされている時に、
隣のボタンを有効にするというのはCSSだけでできます。
pointer-eventsというプロパティでイベントの取得を無効にすることで送信可否を振り分けます。
▼以下のようなコードで実現できます。
input(type="checkbox") + button{
pointer-events: none;
}
input(type="checkbox"):checked + button{
pointer-events: auto;
}
チェックボックスとボタンが離れている場合は、
チェックボックスを切り替えた時にjQuery等でイベントを取得する必要がありますね。
詳細の回答は改めて記事にてご紹介できたらと思います。