Customize checkbox elements

Web developers could style form elemets with CSS pseudo class & pseudo elements and other modern CSS properties.

HTML structure

<div class="checkbox-set"> <input id="my-checkbox" type="checkbox" name="checkbox[]" value="0" /> <label class="checkbox-set__label" for="my-checkbox"></label> </div>

Style Customization

Apply accent-color to <input />'s style.

<style> .checkbox-set { --size: 1.25em; --border-radius: 2px; --mask-checkmark: path('m8.229 14.062-3.521-3.541L5.75 9.479l2.479 2.459 6.021-6L15.292 7Z'); --duration: 100ms; --timing-function: cubic-bezier(.4,0,.2,1); /* normal */ --accent-color: var(--default-accent-color, rgba(42 108 246)); --border-color: var(--default-border-color, rgba(131 138 146)); --background-color: var(--default-background-color, rgba(255 255 255)); --checkmark-color: var(--default-checkmark-color, rgba(255 255 255)); /* disabled */ --border-color--disabled: var(--default-border-color--disabled, rgba(178 185 192)); --background-color--disabled: var(--default-background-color--disabled, rgba(255 255 255)); --checkmark-color--disabled: var(--default-checkmark-color--disabled, rgba(178 185 192)); } .checkbox-set__label { --checkmark-opacity-normal: 0; --checkmark-opacity-active: 1; --checkmark-opacity: var(--checkmark-opacity-normal); } .checkbox-set input:checked~.checkbox-set__label { --border-color: var(--accent-color); --background-color: var(--accent-color); --checkmark-opacity: var(--checkmark-opacity-active); } .checkbox-set input:not(:disabled):focus-visible~.checkbox-set__label { --border-color: var(--accent-color); } [inert] .checkbox-set input~.checkbox-set__label, .checkbox-set input:disabled~.checkbox-set__label { --border-color: var(--border-color--disabled); --background-color: var(--background-color--disabled); --checkmark-color: var(--checkmark-color--disabled); } .checkbox-set{position:relative;inline-size:var(--size);aspect-ratio:1/1;overflow:hidden;} .checkbox-set input{position:absolute;top:-100%;outline:0 none;} .checkbox-set__label{position:relative;inline-size:100%;block-size:100%;background-color:var(--background-color);display:block;border-radius:var(--border-radius);overflow:hidden;transition:background-color var(--duration) var(--timing-function);will-change:background-color;} .checkbox-set__label::before{position:absolute;inset-inline-start:0;inset-block-start:0;content:'';inline-size:100%;block-size:100%;border-radius:var(--border-radius);box-shadow:inset 0 0 0 2px var(--border-color);box-sizing:border-box;transition:box-shadow var(--duration) var(--timing-function);will-change:box-shadow;} .checkbox-set__label::after{position:absolute;inset-inline-start:0;inset-block-start:0;content:'';inline-size:100%;block-size:100%;background-color:var(--checkmark-color);clip-path:var(--mask-checkmark);transition:opacity var(--duration) var(--timing-function);will-change:opacity;opacity:var(--checkmark-opacity);} @media (hover: hover) { .checkbox-set input:not(:disabled)~.checkbox-set__label:hover { --border-color: var(--accent-color); } } @media (prefers-color-scheme: dark) { .checkbox-set { --default-accent-color: rgba(75 168 248); --default-border-color: rgba(131 138 146); --default-background-color: rgba(0 0 0); --default-border-color--disabled: rgba(131 138 146); --default-background-color--disabled: rgba(44 54 63); } } </style>