پیشنمایش زنده
کد HTML
<label class="finance-toggle">
<input type="checkbox" class="finance-toggle__input" />
<div class="finance-toggle__track">
<span class="finance-toggle__label finance-toggle__label--off">OFF</span>
<span class="finance-toggle__label finance-toggle__label--on">ON</span>
</div>
<span class="finance-toggle__thumb"></span>
</label>
کد CSS
.finance-toggle {
/* sizing tokens */
--w: 100px;
--h: 50px;
--gap: 4px;
--thumb: calc(var(--h) - var(--gap) * 2);
/* colour tokens */
--track-off: #343434;
--track-gradient-1: #8a5cff;
--track-gradient-2: #0078ff;
--track-gradient-3: #00eaff;
--thumb-bg: #ffffff;
--label-col: #d0d0d0;
position: relative;
display: inline-block;
width: var(--w);
height: var(--h);
border-radius: calc(var(--h) / 2);
cursor: pointer;
user-select: none;
}
/* invisible but accessible checkbox */
.finance-toggle__input {
position: absolute;
inset: 0;
margin: 0;
opacity: 0;
width: 100%;
height: 100%;
}
/* track */
.finance-toggle__track {
position: absolute;
inset: 0;
border-radius: inherit;
background: var(--track-off);
overflow: hidden;
box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.35);
}
.finance-toggle__track::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
130deg,
var(--track-gradient-1),
var(--track-gradient-2),
var(--track-gradient-3)
);
background-size: 250% 250%;
opacity: 0;
transition: opacity 0.35s ease;
}
/* labels */
.finance-toggle__label {
position: absolute;
top: 50%;
transform: translateY(-50%);
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 1px;
color: var(--label-col);
text-shadow: 0 1px 0 #000;
pointer-events: none;
transition: opacity 0.25s ease;
}
.finance-toggle__label--off {
left: 14px;
opacity: 1;
}
.finance-toggle__label--on {
right: 14px;
opacity: 0;
}
/* thumb */
.finance-toggle__thumb {
position: absolute;
top: var(--gap);
left: var(--gap);
width: var(--thumb);
height: var(--thumb);
border-radius: 50%;
background: var(--thumb-bg);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.45);
transition: left 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}
.finance-toggle__thumb::after {
content: "";
position: absolute;
inset: 4px;
border-radius: 50%;
background: #f5f5f5;
box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.15);
}
/* animation */
@keyframes gradientMove {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
/* checked state */
.finance-toggle__input:checked + .finance-toggle__track::after {
opacity: 1;
animation: gradientMove 6s ease infinite;
}
.finance-toggle__input:checked ~ .finance-toggle__thumb {
left: calc(100% - var(--thumb) - var(--gap));
}
.finance-toggle__input:checked
+ .finance-toggle__track
.finance-toggle__label--on {
opacity: 1;
}
.finance-toggle__input:checked
+ .finance-toggle__track
.finance-toggle__label--off {
opacity: 0;
}
/* focus ring (keyboard) */
.finance-toggle__input:focus-visible + .finance-toggle__track {
outline: 3px solid var(--track-gradient-3);
outline-offset: 3px;
}