<input type="checkbox" role="switch" class="neon" />
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ... </head>
<body>
</body>
body {
display: grid;
place-items: center;
overflow: hidden;
margin: 0;
height: 100vh;
background-image: linear-gradient(45deg, #223, #112);
background:
radial-gradient(at 100% 0, #fff2, #fff0 50%),
radial-gradient(at 0% 100%, #0002, #0000 50%),
#545153;
}
@property --x {
syntax: '<angle>';
inherits: true;
initial-value: 1deg;
}
@property --c {
syntax: '<color>';
inherits: true;
initial-value: #0000;
}
.neon {
--x: 1deg;
--c: #0000;
font-size: 3rem;
appearance: none;
position: relative;
aspect-ratio: 2;
border-radius: 100em;
background:
linear-gradient(to bottom right, #0001, #0000),
#444143;
width: 3em;
box-shadow:
inset 0 0 0.25em -0.25em #0008,
inset 0.05em 0.05em 0.2em #000811,
inset -0.05em -0.05em 0.15em 0.05em #ccc1,
0 0 0 0.11em #545153;
transition: --x 0.5s, --c 0.35s, box-shadow 0.5s;
filter: drop-shadow(0 0 0.2em var(--c));
&::before {
content: "";
position: absolute;
height: 80%;
aspect-ratio: 1;
top: 50%;
left: 25%;
transform: translate(-50%, -50%);
background: #545153;
box-shadow:
inset -0.05em -0.05em 0.1em #0008,
inset 0.05em 0.05em 0.1em #ffffff22,
inset 0.05em 0em 0.1em -0.065em var(--c),
0.1em 0.1em 0.15em #000c;
border-radius: 50%;
transition: left 0.5s, box-shadow 0.15s;
}
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: calc(100% + 0.25em);
height: calc(100% + 0.25em);
border: 0.1em solid #0ff;
border-radius: 100em;
-webkit-mask: conic-gradient(from calc(270deg - var(--x)), #000 calc(2 * var(--x)), #0001 0);
box-shadow: 0 0 0 2em #0000;
/* hack for safari */
}
&:hover {
--x: 3deg;
--c: #0ff5;
box-shadow:
inset 0 0 0.25em -0.25em #0008,
inset 0.05em 0.05em 0.2em #000811,
inset -0.05em -0.05em 0.15em 0.05em #ccc1,
0 0 0.05em 0.075em #545153;
}
&:checked {
--x: 180deg;
--c: #0fff;
box-shadow:
inset 0 0 0.25em -0.25em #0008,
inset 0.05em 0.05em 0.2em #000811,
inset -0.05em -0.05em 0.15em 0.05em #ccc1,
0 0 0.1em 0.05em #545153;
&::before {
left: 75%;
box-shadow:
inset -0.05em -0.05em 0.1em #0008,
inset 0.05em 0.05em 0.1em #ffffff22,
inset -0.05em 0em 0.1em -0.035em var(--c),
0.1em 0.1em 0.15em #000c;
}
}
&[disabled] {
opacity: 0.25;
}
}
@media print {
.neon {
background: none;
&,
&::before,
&::after {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}
}
@media (prefers-reduced-motion) {
.neon,
.neon::before,
.neon::after {
transition: none !important;
animation: none !important;
}
}