@use 'sass:map'; @use '../mixins/mixins' as *; @use '../var/size.scss' as *; $switch-sizes: () !default; $switch-sizes: map-merge( ( 'sm': ( width: 70rpx, height: 40rpx, font-size: 24rpx, padding: 4rpx, ), '': ( width: 100rpx, height: 50rpx, font-size: 28rpx, padding: 6rpx, ), 'lg': ( width: 120rpx, height: 60rpx, font-size: 36rpx, padding: 8rpx, ), ), $switch-sizes ); @include b(switch) { display: inline-flex; position: relative; min-width: map-get(map-get($switch-sizes, ''), width); height: map-get(map-get($switch-sizes, ''), height); font-size: map-get(map-get($switch-sizes, ''), font-size); padding: 0 map-get(map-get($switch-sizes, ''), padding); transition: all 0.3s ease; color: #fff; /* 内部切换点 start */ @include e(dot) { display: flex; align-items: center; justify-content: center; position: absolute; top: 50%; left: map-get(map-get($switch-sizes, ''), padding); width: calc(map-get(map-get($switch-sizes, ''), height) * 0.8); height: calc(map-get(map-get($switch-sizes, ''), height) * 0.8); background-color: #fff; transform: translate(0, -50%); transition: all 0.3s ease-in-out; @include m(checked) { left: calc(100% - map-get(map-get($switch-sizes, ''), padding)); transform: translate(-100%, -50%); } } /* 内部切换点 end */ /* 按钮内部文字 start */ &__active-content, &__inactive-content { height: 100%; display: flex; align-items: center; opacity: 0; animation-duration: 0.3s; animation-timing-function: ease; animation-fill-mode: forwards; &--icon { transform-origin: center; transform: scale(1.1); } } /* 未激活 start */ @include e(inactive-content) { padding-left: calc( map-get(map-get($switch-sizes, ''), height) * 0.9 + map-get(map-get($switch-sizes, ''), padding) ); padding-right: map-get(map-get($switch-sizes, ''), padding); transform: scale(0) translateX(-100%); animation-name: switch-content-animation-inactive; } /* 未激活 end */ /* 激活 start */ @include e(active-content) { padding-right: calc( map-get(map-get($switch-sizes, ''), height) * 0.9 + map-get(map-get($switch-sizes, ''), padding) ); padding-left: map-get(map-get($switch-sizes, ''), padding); transform: scale(0) translateX(100%); animation-name: switch-content-animation-active; } /* 激活 end */ /* 按钮内部文字 end */ /* 按钮形状 start */ @include m(square) { border-radius: 6rpx; @include e(dot) { border-radius: 6rpx; } } @include m(round) { border-radius: 1000rpx; @include e(dot) { border-radius: 50%; } } /* 按钮形状 end */ /* 按钮尺寸 start */ @each $size in $tn-form-sizes { @include m($size) { min-width: map-get(map-get($switch-sizes, $size), width); height: map-get(map-get($switch-sizes, $size), height); font-size: map-get(map-get($switch-sizes, $size), font-size); padding: 0 map-get(map-get($switch-sizes, $size), padding); @include e(dot) { left: map-get(map-get($switch-sizes, $size), padding); width: calc(map-get(map-get($switch-sizes, $size), height) * 0.8); height: calc(map-get(map-get($switch-sizes, $size), height) * 0.8); @include m(checked) { left: calc(100% - map-get(map-get($switch-sizes, $size), padding)); } } /* 未激活 start */ @include e(inactive-content) { padding-left: calc( map-get(map-get($switch-sizes, $size), height) * 0.9 + map-get(map-get($switch-sizes, $size), padding) ); padding-right: map-get(map-get($switch-sizes, $size), padding); } /* 未激活 end */ /* 激活 start */ @include e(active-content) { padding-right: calc( map-get(map-get($switch-sizes, $size), height) * 0.9 + map-get(map-get($switch-sizes, $size), padding) ); padding-left: map-get(map-get($switch-sizes, $size), padding); } /* 激活 end */ } } /* 按钮尺寸 end */ /* 禁用 start */ @include m(disabled) { opacity: 0.6; } /* 禁用 end */ // 如果Switch开关存在内容,则根据内容去设置开关的宽度 @include when(content) { min-width: auto; } } @keyframes switch-content-animation-active { from { opacity: 0; transform: scale(0) translateX(100%); } to { opacity: 1; transform: scale(1) translateX(0%); } } @keyframes switch-content-animation-inactive { from { opacity: 0; transform: scale(0) translateX(-100%); } to { opacity: 1; transform: scale(1) translateX(0%); } }