Benutzerdefinierter Toggle-Schalter
Ein Implementierungsbeispiel für einen ästhetisch animierten, benutzerdefinierten Toggle-Schalter, der die native HTML-Checkbox nahtlos ersetzt.
Dieses Snippet ersetzt die standardmäßige Checkbox des Browsers durch einen modernen und visuell ansprechenden Toggle-Schalter. Durch den raffinierten Einsatz von CSS-Pseudoelementen und der Pseudoklasse :checked wird eine fließende Animation erzeugt – komplett ohne JavaScript.
Code
<label class="custom-toggle">
<input type="checkbox" class="custom-toggle-input" aria-label="Toggle Switch" />
<span class="custom-toggle-slider"></span>
</label>/* Container des Toggle-Schalters */
.custom-toggle {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
/* Versteckt die Standard-Checkbox */
.custom-toggle-input {
opacity: 0;
width: 0;
height: 0;
}
/* Hintergrund des Sliders */
.custom-toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #e2e8f0;
transition: background-color 0.4s;
border-radius: 34px;
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Schalterkopf des Sliders */
.custom-toggle-slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
border-radius: 50%;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
/* Hintergrundfarbe bei Aktivierung */
.custom-toggle-input:checked + .custom-toggle-slider {
background-color: #3b82f6;
}
/* Outline bei Tastaturfokus */
.custom-toggle-input:focus-visible + .custom-toggle-slider {
outline: 2px solid #3b82f6;
outline-offset: 2px;
}
/* Verschiebung des Schalterkopfs bei Aktivierung */
.custom-toggle-input:checked + .custom-toggle-slider:before {
transform: translateX(26px);
} Implementierungspunkte
Da die native <input type="checkbox"> je nach Browser und Betriebssystem sehr unterschiedlich gerendert wird und kaum Styling-Möglichkeiten bietet, verbirgt dieser Ansatz die eigentliche Checkbox und nutzt stattdessen ein benachbartes <span>-Element (den Slider), um das UI zu zeichnen.
- Verbergen der Checkbox: Anstatt
display: nonezu verwenden, setzen wiropacity: 0sowie Breite und Höhe auf0. So wird das Element unsichtbar, behält aber seine Funktionalität für Tastatursteuerung und Screenreader. - Styling des Sliders: Das Pseudoelement
::beforedient dazu, den runden „Schalterkopf“ (den Indikator) darzustellen. - Fließende Animation: Durch die Definition von
transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55)erhält der Schalter eine sehr dynamische, natürliche Animation, bei der der Schalterkopf am Ende der Bewegung leicht nachfedert (Bouncing-Effekt). - Berücksichtigung der Barrierefreiheit (a11y): Damit bei der Tastaturnavigation stets erkennbar ist, dass das Element den Fokus hat, fügen wir mithilfe von
:focus-visibleeinen deutlich sichtbaren Fokusring (Outline) hinzu.
Dieser Toggle-Schalter eignet sich exzellent für Szenarien, die klare Ein-/Ausschaltvorgänge erfordern, beispielsweise in Einstellungsmenüs oder für einen Dark-Mode-Umschalter.