197 lines
4.8 KiB
SCSS
197 lines
4.8 KiB
SCSS
@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%);
|
||
}
|
||
}
|