ToggleSwitch.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <label class='toggle_switch'>
  3. <input type='checkbox' v-model='proxyValue' />
  4. <span></span>
  5. </label>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'ToggleSwitch',
  10. props: ['value'],
  11. data () {
  12. return {
  13. proxyValue: this.value
  14. }
  15. },
  16. watch: {
  17. value () {
  18. this.proxyValue = this.value
  19. },
  20. proxyValue () {
  21. this.$emit('input', this.proxyValue)
  22. }
  23. }
  24. }
  25. </script>
  26. <style lang='scss' scoped>
  27. @import '../assets/scss/variables.scss';
  28. .toggle_switch {
  29. position: relative;
  30. display: inline-block;
  31. width: 4rem;
  32. height: 2rem;
  33. cursor: pointer;
  34. &:active {
  35. span::before {
  36. width: 1.5rem;
  37. }
  38. input:checked + span::before {
  39. left: calc(100% - 1.85rem);
  40. }
  41. }
  42. &:hover {
  43. span {
  44. background-color: $color__lightgray--primary;
  45. }
  46. input:checked + span {
  47. background-color: darken(rgba(109, 210, 91, 0.9), 7.5%);
  48. border-color: darken(rgba(25, 165, 35, 0.2), 5%);
  49. &::before {
  50. opacity: 0.95;
  51. }
  52. }
  53. }
  54. input {
  55. display: none;
  56. }
  57. span {
  58. background-color: #fff;
  59. border-radius: 5rem;
  60. display: block;
  61. width: 100%;
  62. height: 100%;
  63. border: 0.2rem solid $color__gray--darker;
  64. transition: all 0.2s ease;
  65. &::before {
  66. content: '';
  67. position: absolute;
  68. left: 0.4rem;
  69. top: 0.35rem;
  70. height: 1.3rem;
  71. width: 1.3rem;
  72. background-color: $color__gray--darkest;
  73. border-radius: 100%;
  74. box-shadow: 0px 0px 2px 0 #cacacacc;
  75. transition: all 0.2s ease;
  76. }
  77. }
  78. input:checked + span {
  79. background-color: rgba(109, 210, 91, 0.9);
  80. border-color: rgba(25, 165, 35, 0.2);
  81. &::before {
  82. left: calc(100% - 1.65rem);
  83. background-color: #fff;
  84. }
  85. }
  86. }
  87. </style>