#e8e8e8
1.toggle-container { 2 --knob-size: 1.75em; 3 display: flex; 4 justify-content: center; 5 position: relative; 6} 7 8.toggle-input { 9 position: absolute; 10 z-index: 2; 11 bottom: 132.5%; 12 border-radius: 50%; 13 transform: rotate(-25deg); 14 transform-origin: 50% 4.75em; 15 width: var(--knob-size); 16 height: var(--knob-size); 17 opacity: 0; 18 /* fix em sizing */ 19 font: inherit; 20 transition: transform .24s cubic-bezier(.65, 1.35, .5, 1); 21 cursor: pointer; 22} 23 24.toggle-input:checked { 25 transform: rotate(25deg); 26} 27 28.toggle-handle-wrapper { 29 position: absolute; 30 z-index: 1; 31 bottom: -135%; 32 -webkit-mask-image: linear-gradient(to bottom, #000 62.125%, transparent 50%); 33 mask-image: linear-gradient(to bottom, #000 62.125%, transparent 50%); 34 width: 200%; 35 overflow: hidden; 36} 37 38.toggle-handle { 39 display: flex; 40 flex-direction: column; 41 align-items: center; 42 transform: rotate(-25deg); 43 transform-origin: bottom center; 44 transition: transform .24s cubic-bezier(.65, 1.35, .5, 1); 45} 46 47.toggle-input:checked + .toggle-handle-wrapper > .toggle-handle { 48 transform: rotate(25deg); 49} 50 51.toggle-handle-knob { 52 position: relative; 53 z-index: 1; 54 border-radius: 50%; 55 width: var(--knob-size); 56 height: var(--knob-size); 57 background-image: radial-gradient(farthest-corner at 70% 30%, #fedee2 4%, #d63534 12% 24%, #a81a1a 50% 65%, #d63534 75%); 58 transition: transform .24s cubic-bezier(.65, 1.35, .5, 1); 59} 60 61.toggle-input:checked + .toggle-handle-wrapper .toggle-handle-knob { 62 transform: rotate(-90deg); 63} 64 65/* toggle handle knob hover inner shadow */ 66.toggle-handle-knob::after { 67 content: ''; 68 position: absolute; 69 top: 0; 70 left: 0; 71 border-radius: inherit; 72 width: 100%; 73 height: 100%; 74 box-shadow: inset 0 0 8px 2px rgb(255 255 255 / .4); 75 opacity: 0; 76 transition: opacity .2s; 77} 78 79@media (hover: hover) { 80 .toggle-input:hover + .toggle-handle-wrapper .toggle-handle-knob::after, 81 .toggle-input:focus-visible + .toggle-handle-wrapper .toggle-handle-knob::after { 82 opacity: 1; 83 } 84} 85 86.toggle-handle-bar-wrapper { 87 position: relative; 88 width: .5em; 89 height: 3em; 90} 91 92.toggle-handle-bar { 93 position: absolute; 94 top: calc(var(--knob-size) / 2 * -1); 95 left: 0; 96 width: 100%; 97 height: calc(100% + var(--knob-size) / 2); 98 background-image: linear-gradient(to right, #777475, #a4a4a4, #fff 45% 55%, #a4a4a4, #777475); 99 background-position-x: .06125em; 100 transition: background-position-x .24s cubic-bezier(.65, 1.35, .5, 1); 101 box-shadow: inset 0 1em .25em rgb(0 0 0 / .4); 102} 103 104.toggle-input:checked + .toggle-handle-wrapper .toggle-handle-bar { 105 background-position-x: -.06125em; 106} 107 108.toggle-base { 109 position: relative; 110 border-radius: 3.125em; 111 padding: .25em; 112 width: 3.5em; 113 height: 1.125em; 114 background-color: #fff; 115 background-image: linear-gradient(to bottom, #fff, #d7d7d7); 116 box-shadow: 0 -.25em .5em #fff, 0 .25em .5em #d7d7d7; 117} 118 119.toggle-base-inside { 120 position: relative; 121 border-radius: inherit; 122 width: 100%; 123 height: 100%; 124 background-image: linear-gradient(to bottom, #a6a6a6, #7d7d7d); 125 box-shadow: inset 0 .0625em rgb(255 255 255 / .2), inset 0 -.03125em rgb(255 255 255 / 1), inset 0 -.0625em .25em rgb(0 0 0 / .1); 126} 127 128/* toggle base inside active */ 129.toggle-base-inside::after { 130 content: ''; 131 position: absolute; 132 border-radius: inherit; 133 width: 100%; 134 height: 100%; 135 background-image: linear-gradient(to bottom, #5ab054, #438c3c); 136 box-shadow: inherit; 137 opacity: 0; 138 transition: opacity .24s cubic-bezier(.65, 1.35, .5, 1); 139} 140 141.toggle-input:checked ~ .toggle-base .toggle-base-inside::after { 142 opacity: 1; 143}
3.8K views
3.8K views
Comments
Variations
1 MIT License