<input type="checkbox" role="switch" class="toggle" />
<input type="checkbox" role="switch" class="toggle" checked />
<input type="checkbox" role="switch" class="toggle indeterminate" />
<input type="checkbox" role="switch" class="toggle" disabled />
<input type="checkbox" role="switch" class="toggle" disabled checked />
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ... </head>
<body>
</body>
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
margin: 0;
min-height: 100vh;
font-size: 6vmin;
gap: 0.25em;
}
@property --angle {
syntax: '<angle>';
initial-value: 20deg;
inherits: true;
}
.toggle {
--stem: #1a36;
--flower: #fe0;
--petal: #dad;
--time: 0.4s;
appearance: none;
position: relative;
font-size: 1em;
box-sizing: content-box;
height: 1em;
width: 2.5em;
border: max(1px, 0.05em) solid;
border-radius: 2em;
overflow: hidden;
&::after {
content: "";
position: absolute;
width: 0.7em;
height: 0.7em;
top: 50%;
left: 0.5em;
transform: translate(-50%, -50%);
border-radius: 2em;
border: 1px solid #0000;
background:
radial-gradient(var(--flower) 0.15em, #0000 0),
radial-gradient(circle at 50% 0.12em, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 50% 0.58em, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.12em 50%, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.58em 50%, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.18em 0.18em, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.18em 0.52em, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.52em 0.18em, var(--petal) 0.12em, #0000 0),
radial-gradient(circle at 0.52em 0.52em, var(--petal) 0.12em, #0000 0);
background-repeat: no-repeat;
transition: left var(--time);
}
&::before {
--angle: 20deg;
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
/* stem */
radial-gradient(farthest-side at 70% 100%, #0000 80%, var(--stem) 0 99%, #0000) 0.3em 100% / 0.4em 0.5em,
radial-gradient(76% 45% at 50% 0%, #0000 70%, var(--stem) 0 99%, #0000) 0.7em 98% / 0.4em 0.5em,
radial-gradient(73% 45% at 50% 100%, #0000 76%, var(--stem) 0 96%, #0000 0) 1.1em 0.06em / 0.6em 0.7em,
radial-gradient(74% 35% at 50% 0%, #0000 65%, var(--stem) 0 96%, #0000 0) 1.7em 105% / 0.4em 0.5em,
/* leaves */
radial-gradient(50% 50% at 110% 50%, var(--stem) 99%, #0000) 0.85em 0.1em / 0.25em 0.5em,
radial-gradient(50% 50% at -10% 50%, var(--stem) 99%, #0000) 1.08em 0.1em / 0.25em 0.5em,
radial-gradient(50% 50% at 110% 50%, var(--stem) 99%, #0000) 1.5em 0.6em / 0.2em 0.35em,
radial-gradient(50% 50% at -10% 50%, var(--stem) 99%, #0000) 1.69em 0.6em / 0.2em 0.35em;
background-repeat: no-repeat;
clip-path: polygon(0 0, 20% 0, 20% 100%, 0 100%);
mask: conic-gradient(from -0.25turn at 50% 100%, red var(--angle), #0000 0);
transition: clip-path var(--time), --angle var(--time);
}
&:checked {
&::after {
left: calc(100% - 0.5em);
}
&::before {
--angle: 180deg;
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
transition-duration: calc(var(--time) * 1.2)
}
}
&:indeterminate {
&::after {
left: 50%;
}
&::before {
--angle: 90deg;
clip-path: polygon(0 0, 50% 0, 50% 100%, 0 100%);
}
}
&[disabled] {
opacity: 0.25;
}
}
@media print {
.toggle {
&, &::before, &::after {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}
}
@media (prefers-reduced-motion) {
.toggle {
&, &::before, &::after {
transition: none !important;
animation: none !important;
}
}
}
document.querySelector(".indeterminate").indeterminate = true;