// http://codepen.io/rosskevin/pen/EPPwRR?editors=110 .switch { label { position: relative; padding-left: $bmd-switch-width + $bmd-switch-label-padding; // absolutely positioned so add the radio size .bmd-switch-track { position: absolute; top: calc-top($line-height-base, $font-size-base, $bmd-switch-height); left: 0; display: inline-block; width: $bmd-switch-width; height: $bmd-switch-height; cursor: pointer; background-image: linear-gradient( to right, $bmd-switch-unchecked-bg 0%, $bmd-switch-unchecked-bg 50%, $bmd-switch-checked-bg 50%, $bmd-switch-checked-bg 100% ); background-position: 0%; background-size: $bmd-switch-width * 2 $bmd-switch-height; border-radius: $bmd-switch-width; transition: background-position 0.2s ease-in; &::after { position: absolute; top: 50%; left: 0; display: block; align-self: center; width: $bmd-switch-handle-size; height: $bmd-switch-handle-size; content: ""; background: $bmd-switch-handle-unchecked-bg; border-radius: 100%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); transition: left 0.2s ease-in, background-color 0.2s ease-in, transform 0.3s ease; transform: translateY(-50%); } // Jelly effect on click &:active::after { transform: translateY(-50%) scale3d(1.15, 0.85, 1); } } input { // Hide original checkbox, but don't use `display: none` to allow focus on it using keyboard position: absolute; display: block; width: 0; height: 0; opacity: 0; &:checked { + .bmd-switch-track { background-position: -100%; &::after { left: unquote( "calc(100% - #{$bmd-switch-handle-size})" ); //calc(100% - $bmd-switch-handle-size); background-color: $bmd-switch-handle-checked-bg; } } } &:disabled { // No jelly effect on disabled switchs + .bmd-switch-track:active::after { transform: translateY(-50%); } + .bmd-switch-track { cursor: default; background: $bmd-switch-disabled-bg; &::after { background: $bmd-switch-handle-disabled-bg; } } } } } }