前置き
input type="checkbox"
といえばこのデザイン
これをカスタムすると
色や形も自由に変更できます✨
ただCSSでデザインできる💫
とわかっていても
毎回ググっては読み解くのに
時間がかかったため
シンプルに理解できるよう
記事にしました🔍📚
また、ほとんどのサイトではinput
をlabel
で囲まず、label
に装飾をするパターンです。input
をdisplay: none;
しlabel::before
で枠線label::after
でチェック部分を装飾。
ただ個人的にそれだけCSSを書くなら
コンポーネントにしたい❗️
そしてNuxtの場合template
の直下タグを
1つにできるならそうしたいのでtemplate
> label
> input
にしたいのです💡
それからdisplay: none;
キーボード操作ができない💥
ということを知りました。
そう、アクセシビリティ
(利用のしやすさ)が低いのです🤔💭
こちらを参考にしています👇
多くのサイトで紹介されているチェックボックスはdisplay: none;を使ったカスタマイズであるため、キーボードを使った選択操作ができません。
解決方法はシンプルです。input要素をdisplay: none;にするのではなく、widthを0にします。こうすることでタブによるフォーカスやスペースによる選択ができるようになります。
【コピペ可】HTMLとCSSでチェックボックスのコーディング4選
⬇️以前switchボタンで
input type="checkbox"
の
装飾をしているのですが…
【Nuxt.js】props実践編:switchボタンを作ろう!
まずはチェックボックスを
どうデザインするのか
説明がわかりにくいと思ったので
チェックボックスに要点を絞ったものを
書きたいな〜✍️
と思っていたのです🍀
ということで今回は
ディレクティブなどは置いておき、
コンポーネントの大まかな構造と
CSSをどうあてるかを書いています❗️
$emit
などもまとめて書いたコードは
今度公開予定です🌟
参考:
【コピペ可】HTMLとCSSでチェックボックスのコーディング4選
アクセシビリティで気をつけるcheckbox,radioのCSS
構造理解
全体の構成を理解していきます。input
自体に装飾はできないため、span
で装飾をしていきます。
1 2 3 4 5 6 7 |
<template> <label class="label"> <input class="input" type="checkbox" /> <span class="mark"></span> <span class="text">{{ text }}</span> </label> </template> |
そのためinput
はCSSで
非表示にする必要がありますが、
今の段階では、
あえて隠していません。input
とspan
を
連動させることを
分かりやすくするためです🪐
あとは
擬似クラス:checked
や
擬似要素::before
などを使用してinput
と連動させながら装飾をしていくだけです🌟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<style lang="scss" scoped> .label { // コンポーネント全体 &:hover > .mark { // hoverした時 } .input { margin: 0; // width: 0; // opacity: 0; } .input:focus + .mark { // focusした時の装飾枠 } .input:checked + .mark { // checkした時の装飾枠 } .input:checked + .mark::before { // checkした時の装飾枠内のチェック } .mark { // 装飾枠 } } </style> |
.input:focus + .mark
:focus
隣接セレクタ(+)input
をクリックした時のmark
となるため、mark
部分がinput
と連動するわけです💫☝️
.input:checked + .mark
:checked
こちらも:focus
と同様にinput
をチェックした時のmark
ということで連動しています
&:hover > .mark
子セレクタ、直下セレクタ(>)&
はscssで親を指すので.label
のことです。label
をhover
した時のmark
⬇️セレクタについては
こちらも参考になります
2011年の記事ですが、
一覧で見れるのはメリットです🌟
意外と知らない!?CSSセレクタ20個のおさらい
コード
そしてinput
をdisplay: none;
にはしていないので、
キーボード操作が可能です。
tabキーでinput
まで移動し
スペースを押すと選択ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
<template> <label class="label"> <input class="input" type="checkbox" /> <span class="mark"></span> <span class="text">{{ text }}</span> </label> </template> <script> export default { props: { text: { type: String, required: false, default: '', }, }, } </script> <style lang="scss" scoped> .label { padding: 12px 8px; display: flex; align-items: center; cursor: pointer; &:hover > .mark { background: #dddddd !important; border: solid 2px #008eff; } .input { margin: 0; width: 0; opacity: 0; } .input:focus + .mark { background: #dddddd !important; border: solid 2px #008eff; } .input:checked + .mark { border: solid 2px #008eff; background: #ffffff; } .input:checked + .mark::before { content: ''; display: block; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -45%); width: 80%; height: 80%; background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="%23008EFF" d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>') no-repeat center; background-size: contain; } .mark { position: relative; top: 0; left: 0; display: block; width: 32px; height: 32px; border: solid 2px #93cfff; background: #ffffff; border-radius: 4px; } .text { margin-left: 12px; display: block; font-size: 18px; font-weight: bold; } } </style> |
1 2 3 4 5 |
<template> <div class="page"> <FormItemInputCheck text="同意する" /> </div> </template> |
アイコンはiconmonstrを使用🍒background-image
にsvg
を適応させています。svg
コードはiconmonstrコピペしてpath
の後ろにfill
を追加するだけです。
カラーコードの#
は%23
にする必要があります。#008EFF
を使用したかったので%23008EFF
になります。
とりあえずdata:image/svg+xml
してsvg
コードつけてfill
で色つければOKです🙆♀️
ベースのコードはこちら❗️
1 |
background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="%23008EFF" d="省略"/></svg>')no-repeat center; |
まとめ
これでアクセシビリティを高め
コンポーネントの作成もしやすく
スタイリングも
分かりやすくなりました✨👏