这是一款纯CSS线条运动开关按钮特效。该特效通过CSS将开关按钮制作为线条状态,每次点击都会有线条运动的漂亮效果,非常炫酷。
使用方法
HTML代码
<input type="checkbox" role="switch" class="toggle" /> <input type="checkbox" role="switch" class="toggle" style="--angle: -45deg" /> <input type="checkbox" role="switch" class="toggle" style="--angle: 0deg" /> <input type="checkbox" role="switch" class="toggle" style="--angle: 90deg" /> <input type="checkbox" role="switch" class="toggle" disabled />
CSS代码
.toggle {
/* the speed at which each line slides in/out of the toggle */
--speed: 0.4s;
/* the delay between each line starting its animation*/
--innerdelay: 0.05s;
/* the delay between one box and the other animating*/
--delay: 0.4s;
/* the angle at which the lines will be */
--angle: 45deg;
--x0: 0.1em; --x1: 0.1em; --x2: 0.1em;
--x3: 0.1em; --x4: 0.1em; --x5: 0.1em;
--x6: 0.1em; --x7: 0.1em; --x8: 0.1em;
--y0: 0.1em; --y1: 0.1em; --y2: 0.1em;
--y3: 0.1em; --y4: 0.1em; --y5: 0.1em;
--y6: 0.1em; --y7: 0.1em; --y8: 0.1em;
--x10: -0.4em; --x11: -0.4em; --x12: -0.4em;
--x13: -0.4em; --x14: -0.4em; --x15: -0.4em;
--x16: -0.4em; --x17: -0.4em; --x18: -0.4em;
--y10: -1.9em; --y11: -1.9em; --y12: -1.9em;
--y13: -1.9em; --y14: -1.9em; --y15: -1.9em;
--y16: -1.9em; --y17: -1.9em; --y18: -1.9em;
appearance: none;
position: relative;
font-size: 1em;
box-sizing: content-box;
border: max(1px, 0.05em) solid currentcolor;
width: 2.5em;
height: 1em;
color: currentcolor;
transition:
--x0 var(--speed) calc(var(--delay) + var(--innerdelay) * 0),
--x1 var(--speed) calc(var(--delay) + var(--innerdelay) * 1),
--x2 var(--speed) calc(var(--delay) + var(--innerdelay) * 2),
--x3 var(--speed) calc(var(--delay) + var(--innerdelay) * 3),
--x4 var(--speed) calc(var(--delay) + var(--innerdelay) * 4),
--x5 var(--speed) calc(var(--delay) + var(--innerdelay) * 5),
--x6 var(--speed) calc(var(--delay) + var(--innerdelay) * 6),
--x7 var(--speed) calc(var(--delay) + var(--innerdelay) * 7),
--x8 var(--speed) calc(var(--delay) + var(--innerdelay) * 8),
--y0 var(--speed) calc(var(--delay) + var(--innerdelay) * 0),
--y1 var(--speed) calc(var(--delay) + var(--innerdelay) * 1),
--y2 var(--speed) calc(var(--delay) + var(--innerdelay) * 2),
--y3 var(--speed) calc(var(--delay) + var(--innerdelay) * 3),
--y4 var(--speed) calc(var(--delay) + var(--innerdelay) * 4),
--y5 var(--speed) calc(var(--delay) + var(--innerdelay) * 5),
--y6 var(--speed) calc(var(--delay) + var(--innerdelay) * 6),
--y7 var(--speed) calc(var(--delay) + var(--innerdelay) * 7),
--y8 var(--speed) calc(var(--delay) + var(--innerdelay) * 8),
--x10 var(--speed) calc(var(--innerdelay) * 0),
--x11 var(--speed) calc(var(--innerdelay) * 1),
--x12 var(--speed) calc(var(--innerdelay) * 2),
--x13 var(--speed) calc(var(--innerdelay) * 3),
--x14 var(--speed) calc(var(--innerdelay) * 4),
--x15 var(--speed) calc(var(--innerdelay) * 5),
--x16 var(--speed) calc(var(--innerdelay) * 6),
--x17 var(--speed) calc(var(--innerdelay) * 7),
--x18 var(--speed) calc(var(--innerdelay) * 8),
--y10 var(--speed) calc(var(--innerdelay) * 0),
--y11 var(--speed) calc(var(--innerdelay) * 1),
--y12 var(--speed) calc(var(--innerdelay) * 2),
--y13 var(--speed) calc(var(--innerdelay) * 3),
--y14 var(--speed) calc(var(--innerdelay) * 4),
--y15 var(--speed) calc(var(--innerdelay) * 5),
--y16 var(--speed) calc(var(--innerdelay) * 6),
--y17 var(--speed) calc(var(--innerdelay) * 7),
--y18 var(--speed) calc(var(--innerdelay) * 8);
&::before {
content: "";
width: 0.8em;
height: 0.8em;
position: absolute;
top: 0.1em;
left: 0.1em;
box-sizing: border-box;
border: 0.15em solid #f000;
}
&::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
/* off lines */
linear-gradient(var(--angle), #0000 8%, currentcolor 0 12%, #0000 0) var(--x0) var(--y0),
linear-gradient(var(--angle), #0000 18%, currentcolor 0 22%, #0000 0) var(--x1) var(--y1),
linear-gradient(var(--angle), #0000 28%, currentcolor 0 32%, #0000 0) var(--x2) var(--y2),
linear-gradient(var(--angle), #0000 38%, currentcolor 0 42%, #0000 0) var(--x3) var(--y3),
linear-gradient(var(--angle), #0000 48%, currentcolor 0 52%, #0000 0) var(--x4) var(--y4),
linear-gradient(var(--angle), #0000 58%, currentcolor 0 62%, #0000 0) var(--x5) var(--y5),
linear-gradient(var(--angle), #0000 68%, currentcolor 0 72%, #0000 0) var(--x6) var(--y6),
linear-gradient(var(--angle), #0000 78%, currentcolor 0 82%, #0000 0) var(--x7) var(--y7),
linear-gradient(var(--angle), #0000 88%, currentcolor 0 92%, #0000 0) var(--x8) var(--y8),
/* on lines */
linear-gradient(var(--angle), #0000 8%, currentcolor 0 12%, #0000 0) var(--x10) var(--y10),
linear-gradient(var(--angle), #0000 18%, currentcolor 0 22%, #0000 0) var(--x11) var(--y11),
linear-gradient(var(--angle), #0000 28%, currentcolor 0 32%, #0000 0) var(--x12) var(--y12),
linear-gradient(var(--angle), #0000 38%, currentcolor 0 42%, #0000 0) var(--x13) var(--y13),
linear-gradient(var(--angle), #0000 48%, currentcolor 0 52%, #0000 0) var(--x14) var(--y14),
linear-gradient(var(--angle), #0000 58%, currentcolor 0 62%, #0000 0) var(--x15) var(--y15),
linear-gradient(var(--angle), #0000 68%, currentcolor 0 72%, #0000 0) var(--x16) var(--y16),
linear-gradient(var(--angle), #0000 78%, currentcolor 0 82%, #0000 0) var(--x17) var(--y17),
linear-gradient(var(--angle), #0000 88%, currentcolor 0 92%, #0000 0) var(--x18) var(--y18),
#0000;
background-size: 0.8em 0.8em;
background-repeat: no-repeat;
}
&:checked {
--x0: 2.1em; --x1: 2.1em; --x2: 2.1em;
--x3: 2.1em; --x4: 2.1em; --x5: 2.1em;
--x6: 2.1em; --x7: 2.1em; --x8: 2.1em;
--y0: 2.1em; --y1: 2.1em; --y2: 2.1em;
--y3: 2.1em; --y4: 2.1em; --y5: 2.1em;
--y6: 2.1em; --y7: 2.1em; --y8: 2.1em;
--x10: 1.6em; --x11: 1.6em; --x12: 1.6em;
--x13: 1.6em; --x14: 1.6em; --x15: 1.6em;
--x16: 1.6em; --x17: 1.6em; --x18: 1.6em;
--y10: 0.1em; --y11: 0.1em; --y12: 0.1em;
--y13: 0.1em; --y14: 0.1em; --y15: 0.1em;
--y16: 0.1em; --y17: 0.1em; --y18: 0.1em;
transition:
--x0 var(--speed) calc(var(--innerdelay) * 0),
--x1 var(--speed) calc(var(--innerdelay) * 1),
--x2 var(--speed) calc(var(--innerdelay) * 2),
--x3 var(--speed) calc(var(--innerdelay) * 3),
--x4 var(--speed) calc(var(--innerdelay) * 4),
--x5 var(--speed) calc(var(--innerdelay) * 5),
--x6 var(--speed) calc(var(--innerdelay) * 6),
--x7 var(--speed) calc(var(--innerdelay) * 7),
--x8 var(--speed) calc(var(--innerdelay) * 8),
--y0 var(--speed) calc(var(--innerdelay) * 0),
--y1 var(--speed) calc(var(--innerdelay) * 1),
--y2 var(--speed) calc(var(--innerdelay) * 2),
--y3 var(--speed) calc(var(--innerdelay) * 3),
--y4 var(--speed) calc(var(--innerdelay) * 4),
--y5 var(--speed) calc(var(--innerdelay) * 5),
--y6 var(--speed) calc(var(--innerdelay) * 6),
--y7 var(--speed) calc(var(--innerdelay) * 7),
--y8 var(--speed) calc(var(--innerdelay) * 8),
--x10 var(--speed) calc(var(--delay) + var(--innerdelay) * 0),
--x11 var(--speed) calc(var(--delay) + var(--innerdelay) * 1),
--x12 var(--speed) calc(var(--delay) + var(--innerdelay) * 2),
--x13 var(--speed) calc(var(--delay) + var(--innerdelay) * 3),
--x14 var(--speed) calc(var(--delay) + var(--innerdelay) * 4),
--x15 var(--speed) calc(var(--delay) + var(--innerdelay) * 5),
--x16 var(--speed) calc(var(--delay) + var(--innerdelay) * 6),
--x17 var(--speed) calc(var(--delay) + var(--innerdelay) * 7),
--x18 var(--speed) calc(var(--delay) + var(--innerdelay) * 8),
--y10 var(--speed) calc(var(--delay) + var(--innerdelay) * 0),
--y11 var(--speed) calc(var(--delay) + var(--innerdelay) * 1),
--y12 var(--speed) calc(var(--delay) + var(--innerdelay) * 2),
--y13 var(--speed) calc(var(--delay) + var(--innerdelay) * 3),
--y14 var(--speed) calc(var(--delay) + var(--innerdelay) * 4),
--y15 var(--speed) calc(var(--delay) + var(--innerdelay) * 5),
--y16 var(--speed) calc(var(--delay) + var(--innerdelay) * 6),
--y17 var(--speed) calc(var(--delay) + var(--innerdelay) * 7),
--y18 var(--speed) calc(var(--delay) + var(--innerdelay) * 8);
&::before {
left: 1.6em;
}
}
&[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;
}
}
}
@property --speed { syntax: '<time>'; initial-value: 0.4s; inherits: true; }
@property --innerdelay { syntax: '<time>'; initial-value: 0.05s; inherits: true; }
@property --delay { syntax: '<time>'; initial-value: 0.3s; inherits: true; }
@property --angle { syntax: '<angle>'; initial-value: 45deg; inherits: true; }
@property --x0 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x1 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x2 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x3 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x4 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x5 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x6 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x7 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x8 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y0 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y1 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y2 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y3 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y4 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y5 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y6 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y7 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y8 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x10 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x11 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x12 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x13 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x14 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x15 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x16 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x17 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --x18 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y10 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y11 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y12 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y13 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y14 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y15 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y16 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y17 { syntax: '<length>'; initial-value: 1px; inherits: true; }
@property --y18 { syntax: '<length>'; initial-value: 1px; inherits: true; }