这是一款纯CSS炫酷Neno样式开关按钮。该开关按钮的创意来自于Neno,它通过线条的运动来形成由线条组合为矩形的效果,看起来非常炫酷。
使用方法
HTML代码
.container { margin: 0; min-height: 60vh; display: flex; align-items: center; justify-content: center; flex-direction: column; background: #234; gap: 1rem; } @property --color { syntax: '<color>'; initial-value: #789; inherits: true; } @keyframes slideRight { 0% { background-position: 0% 0%, 0% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 10% { background-position: 100% 0%, 0% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 20% { background-position: 100% 0%, 100% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 30% { background-position: 100% 0%, 100% 11%, 100% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 40% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 50% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 60% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 70% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 0% 77%, 0% 86%, 0% 100%; } 80% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 0% 86%, 0% 100%; } 90% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 100% 86%, 0% 100%; } 100% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 100% 86%, 100% 100%; } } @keyframes slideLeft { 0% { background-position: 0% 0%, 0% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 10% { background-position: 100% 0%, 0% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 20% { background-position: 100% 0%, 100% 11%, 0% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 30% { background-position: 100% 0%, 100% 11%, 100% 22%, 0% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 40% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 0% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 50% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 0% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 60% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 0% 66%, 0% 77%, 0% 86%, 0% 100%; } 70% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 0% 77%, 0% 86%, 0% 100%; } 80% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 0% 86%, 0% 100%; } 90% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 100% 86%, 0% 100%; } 100% { background-position: 100% 0%, 100% 11%, 100% 22%, 100% 33%, 100% 44%, 100% 55%, 100% 66%, 100% 77%, 100% 86%, 100% 100%; } } .silky-smooth { --color: #789; --time: 1s; appearance: none; font-size: 1.5rem; width: 3em; aspect-ratio: 2; border: 0.05em solid var(--color); border-radius: 0.1em; background: repeating-linear-gradient(#0002 0 5%, #0004 0 10%); transition: --color 0.5s, box-shadow 0.5s; position: relative; box-shadow: 0 0 0em var(--color), inset 0 0 0em var(--color); &::before { content: ""; position: absolute; width: 85%; height: 70%; background: linear-gradient(var(--color) 0 0) 0 0 / 40% 15%, linear-gradient(var(--color) 0 0) 0 10% / 40% 15%, linear-gradient(var(--color) 0 0) 0 20% / 40% 15%, linear-gradient(var(--color) 0 0) 0 30% / 40% 15%, linear-gradient(var(--color) 0 0) 0 40% / 40% 15%, linear-gradient(var(--color) 0 0) 0 50% / 40% 15%, linear-gradient(var(--color) 0 0) 0 60% / 40% 15%, linear-gradient(var(--color) 0 0) 0 70% / 40% 15%, linear-gradient(var(--color) 0 0) 0 80% / 40% 15%, linear-gradient(var(--color) 0 0) 0 100% / 40% 15%; background-repeat: no-repeat; top: 50%; left: 7.5%; transform: translateY(-50%); animation: slideLeft var(--time) linear forwards reverse; transition: filter 0.5s; filter: drop-shadow(0 0 0 var(--color)); border: 1px solid #0000; box-sizing: border-box; } &:hover { --color: #58b; box-shadow: 0 0 0.1em var(--color), inset 0 0 0.1em var(--color); &::before { filter: drop-shadow(0 0 0.1em var(--color)); } } &:checked { --color: #76b3fa; box-shadow: 0 0 0.35em var(--color), inset 0 0 0.35em var(--color); &::before { animation: slideRight var(--time) forwards; filter: drop-shadow(0 0 0.25em var(--color)); } } &[disabled] { --color: #789 !important; opacity: 0.33; &, &::before { box-shadow: none !important; filter: none; animation-play-state: paused; animation-delay: calc(var(--time) * -1); } } } @media print { .silky-smooth { &, &::before, &::after { -webkit-print-color-adjust: exact; print-color-adjust: exact; } } } @media (prefers-reduced-motion) { .silky-smooth { &, &::before, &::after { transition-duration: 0s !important; animation-duration: 0s !important; } } }
CSS代码
<input type="checkbox" role="switch" class="silky-smooth" /> <input type="checkbox" role="switch" class="silky-smooth" checked /> <input type="checkbox" role="switch" class="silky-smooth" disabled /> <input type="checkbox" role="switch" class="silky-smooth" checked disabled />