Darkmode - Switch ON/OFF
Ein Darkmode-Umschalter ist mittlerweile Standard auf modernen Webseiten. Dieses Tutorial stellt ein einfaches Grundgerüst vor und zeigt Möglichkeiten zur Erweiterung.
Grundgerüst
Das Grundgerüst umfasst den strukturellen Aufbau des Darkmode-Schalters sowie die dazugehörige Animation. Die folgende Vorschau demonstriert das gewünschte Ergebnis.
Teil 1 - Der HTML-Code
Zu Beginn wird der HTML-Code erstellt. Dieser besteht aus zwei Hauptabschnitten:
1) Die allgemeine Struktur der HTML-Datei:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Day/Night Toggle</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
2) Der Code für den Schalter selbst:
<label class="umschalter">
<input type="checkbox" id="nachtmodus" onclick="document.body.classList.toggle('nacht');">
<span class="schieber"></span>
</label>
</body>
</html>
<label class="umschalter">
Ein Container-Element, das den Schalter umgibt und gestylt wird.
<input type="checkbox" id="nachtmodus" onclick="document.body.classList.toggle('nacht');">
Ein Checkbox-Input, der als Schalter fungiert. Beim Klicken wird die Funktion ausgeführt, die der<body>
-Klasse die Klassenacht
hinzufügt oder entfernt - so wird der Darkmode ein- bzw. ausgeschaltet.<span class="schieber"></span>
Einspan
-Element, das das visuelle Element des Schiebereglers darstellt, der sich hin- und herbewegt, um den Wechsel des Darkmodes zu simulieren.
Zusätzlich wird dem Button im HTML ein onclick
-Attribut mit einer JavaScript-Funktion hinzugefügt, um beim Klick den Dark-Mode ein- oder auszuschalten.
Achtung: Der JavaScript-Code wird hier direkt in die HTML-Datei eingebunden, da es sich um ein kleines Projekt handelt. Bei größeren Projekten sollte er in eine separate Datei ausgelagert werden.
Teil 2 - Der CSS-Code
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: white;
margin: 0;
}
display: flex;
Aktiviert Flexbox, um den Inhalt flexibel anzuordnenjustify-content: center;
Zentriert den Inhalt horizontalalign-items: center;
Zentriert den Inhalt vertikalmargin: 0;
Entfernt den Standardabstand um den Body
Der gesamte Block sorgt dafür, dass der Inhalt im Browserfenster sowohl horizontal als auch vertikal zentriert wird, der Hintergrund weiß erscheint und der Standardabstand entfällt. Mit height: 100vh;
wird sichergestellt, dass der Body immer die volle Bildschirmhöhe einnimmt.
.umschalter {
width: 89px;
height: 40px;
background-color: black;
border-radius: 30px;
position: relative;
}
Dieser Block stylt den Umschalter und gibt ihm eine feste Größe und einen abgerundeten Rand. Durch position: relative
wird es möglich, die Position des Schiebers innerhalb des Umschalters zu steuern.
.schieber {
width: 30px;
height: 30px;
background-color: white;
border-radius: 50%;
position: absolute;
top: 5px;
left: 5px;
transition: left 0.7s ease;
}
top: 5px;
undleft: 5px;
Positionieren den Schieber 5 Pixel vom oberen bzw. linken Rand des Umschalters.transition: left 0.7s ease;
Ermöglicht eine sanfte Bewegung des Schiebers mit einem ease-Effekt.
Dieser Block definiert das Aussehen und die Animation des Schiebers, der sich innerhalb des Umschalters bewegt.
.umschalter input {
display: none;
}
display: none;
Versteckt die Checkbox
Die Regel sorgt dafür, dass das tatsächliche <input>
-Element (die Checkbox) nicht sichtbar ist. Es dient nur als interaktive Fläche.
.umschalter input:checked + .schieber {
left: 54px;
}
Diese Regel bewirkt, dass der Schieber nach rechts verschoben wird, wenn die Checkbox aktiviert ist. Dabei kommt der :checked
-Klassen-Selektor zum Einsatz, um den Zustand der Checkbox zu prüfen und den Schieber entsprechend zu animieren.
body.nacht {
background-color: black;
}
Diese CSS-Regel ändert den Hintergrund der Seite zu schwarz, wenn dem <body>
die Klasse nacht
hinzugefügt wird (also beim Aktivieren des Darkmode).
body.nacht .umschalter {
background-color: white;
}
Hier wird der Hintergrund des Umschalters mit background-color
im Nachtmodus auf weiß gesetzt.
body.nacht .schieber {
background-color: black;
}
Diese Regel sorgt dafür, dass der Schieber im Nachtmodus schwarz erscheint.
Vollständiger Code (Endversion)
HTML:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Day/Night Toggle</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<label class="umschalter">
<input type="checkbox" id="nachtmodus" onclick="document.body.classList.toggle('nacht');">
<span class="schieber"></span>
</label>
</body>
</html>
CSS:
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: white;
margin: 0;
}
.umschalter {
width: 89px;
height: 40px;
background-color: black;
border-radius: 30px;
position: relative;
}
.schieber {
width: 30px;
height: 30px;
background-color: white;
border-radius: 50%;
position: absolute;
top: 5px;
left: 5px;
transition: left 0.7s ease;
}
.umschalter input {
display: none;
}
.umschalter input:checked + .schieber {
left: 54px;
}
body.nacht {
background-color: black;
}
body.nacht .umschalter {
background-color: white;
}
body.nacht .schieber {
background-color: black;
}
Teil 3 - Mögliche Erweiterungen
Nachdem das Grundgerüst nun steht, können Design und Animation nach Belieben erweitert werden. Im Folgenden werden einige Erweiterungsmöglichkeiten vorgestellt:
Icons
Durch die Integration von Icons lässt sich der Schalter visuell ansprechender gestalten. Im folgenden Beispiel werden zwei SVG-Icons (ein Mond und eine Sonne) verwendet, die je nach Zustand des Nachtmodus angezeigt werden:
<span class="schieber">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="mond-icon">
<path fill-rule="evenodd" d="M7.455 2.004a.75.75 0 0 1 .26.77 7 7 0 0 0 9.958 7.967.75.75 0 0 1 1.067.853A8.5 8.5 0 1 1 6.647 1.921a.75.75 0 0 1 .808.083Z" clip-rule="evenodd" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="sonne-icon">
<path d="M10 2a.75.75 0 0 1 .75.75v1.5a.75.75 0 0 1-1.5 0v-1.5A.75.75 0 0 1 10 2ZM10 15a.75.75 0 0 1 .75.75v1.5a.75.75 0 0 1-1.5 0v-1.5A.75.75 0 0 1 10 15ZM10 7a3 3 0 1 0 0 6 3 3 0 0 0 0-6ZM15.657 5.404a.75.75 0 1 0-1.06-1.06l-1.061 1.06a.75.75 0 0 0 1.06 1.06l1.06-1.06ZM6.464 14.596a.75.75 0 1 0-1.06-1.06l-1.06 1.06a.75.75 0 0 0 1.06 1.06l1.06-1.06ZM18 10a.75.75 0 0 1-.75.75h-1.5a.75.75 0 0 1 0-1.5h1.5A.75.75 0 0 1 18 10ZM5 10a.75.75 0 0 1-.75.75h-1.5a.75.75 0 0 1 0-1.5h1.5A.75.75 0 0 1 5 10ZM14.596 15.657a.75.75 0 0 0 1.06-1.06l-1.06-1.061a.75.75 0 1 0-1.06 1.06l1.06 1.06ZM5.404 6.464a.75.75 0 0 0 1.06-1.06l-1.06-1.06a.75.75 0 1 0-1.061 1.06l1.06 1.06Z" />
</svg>
</span>
Diese Icons werden in der Klasse schieber
eingebaut und wechseln je nach dem Zustand des Darkmodes.
Im dazugehörigen CSS werden die Icons zunächst versteckt:
.mond-icon, .sonne-icon {
width: 20px;
height: 20px;
color: white;
position: absolute;
top: 5px;
left: 5px;
display: none;
}
Dann wird geregelt, welches Icon wann angezeigt wird:
body.nacht .mond-icon {
display: block;
}
body:not(.nacht) .sonne-icon {
display: block;
}
Das Mond-Icon erscheint nur, wenn das
<body>
die Klassenacht
besitzt.Das Sonnen-Icon wird nur angezeigt, wenn der Nachtmodus nicht aktiv ist.
Styling
Eine einfache, aber effektive Erweiterung ist die weitere Gestaltung des Schalter-Farbschemas. So kann der Schalter durch zusätzliche Farbanpassungen und Schatteneffekte optisch verbessert werden:
body.nacht .umschalter {
background-color: #0F2340;
}
Hier wird zunächst die farbe des schalters mit einer farbe im HEX format geändert.
body.nacht .umschalter {
box-shadow: 0 0px 8px white;
}
Anschließend wurde dann noch ein weißer schatten mit box-shadow
hinzugefügt.
Vollständiger Code mit Erweiterungen (Endversion)
HTML:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Day/Night Toggle</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<label class="umschalter">
<input type="checkbox" id="nachtmodus" onclick="document.body.classList.toggle('nacht');">
<span class="schieber">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="mond-icon"> <!-- Mond-SVG für Nachtmodus -->
<path fill-rule="evenodd" d="M7.455 2.004a.75.75 0 0 1 .26.77 7 7 0 0 0 9.958 7.967.75.75 0 0 1 1.067.853A8.5 8.5 0 1 1 6.647 1.921a.75.75 0 0 1 .808.083Z" clip-rule="evenodd" />
</svg>
<!-- Sonne-Icon, das angezeigt wird, wenn der Nachtmodus deaktiviert ist -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="sonne-icon"> <!-- Sonne-SVG für Tagmodus -->
<path d="M10 2a.75.75 0 0 1 .75.75v1.5a.75.75 0 0 1-1.5 0v-1.5A.75.75 0 0 1 10 2ZM10 15a.75.75 0 0 1 .75.75v1.5a.75.75 0 0 1-1.5 0v-1.5A.75.75 0 0 1 10 15ZM10 7a3 3 0 1 0 0 6 3 3 0 0 0 0-6ZM15.657 5.404a.75.75 0 1 0-1.06-1.06l-1.061 1.06a.75.75 0 0 0 1.06 1.06l1.06-1.06ZM6.464 14.596a.75.75 0 1 0-1.06-1.06l-1.06 1.06a.75.75 0 0 0 1.06 1.06l1.06-1.06ZM18 10a.75.75 0 0 1-.75.75h-1.5a.75.75 0 0 1 0-1.5h1.5A.75.75 0 0 1 18 10ZM5 10a.75.75 0 0 1-.75.75h-1.5a.75.75 0 0 1 0-1.5h1.5A.75.75 0 0 1 5 10ZM14.596 15.657a.75.75 0 0 0 1.06-1.06l-1.06-1.061a.75.75 0 1 0-1.06 1.06l1.06 1.06ZM5.404 6.464a.75.75 0 0 0 1.06-1.06l-1.06-1.06a.75.75 0 1 0-1.061 1.06l1.06 1.06Z" />
</svg>
</span>
</label>
</body>
</html>
CSS:
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.umschalter {
width: 89px;
height: 40px;
background-color: #FCFBED;
border-radius: 30px;
position: relative;
box-shadow: 0 0px 7px grey;
}
body.nacht .umschalter {
background-color: #0F2340;
box-shadow: 0 0px 8px white;
}
.schieber {
width: 30px;
height: 30px;
background-color: #FCCC54;
border-radius: 50%;
position: absolute;
top: 5px;
left: 5px;
transition: left 1.5s ease;
box-shadow: 0 2px 6px grey;
}
.umschalter input {
display: none;
}
.umschalter input:checked + .schieber {
left: 54px;
background-color: #AAD5FC;
}
body.nacht {
background-color: black;
}
.mond-icon, .sonne-icon {
width: 20px;
height: 20px;
color: white;
position: absolute;
top: 5px;
left: 5px;
display: none;
}
body.nacht .mond-icon {
display: block;
}
body:not(.nacht) .sonne-icon {
display: block;
}
So sieht das Endergebnis schließlich aus:
Fazit
Dieses Tutorial zeigt die grundlegende Umsetzung eines Darkmode-Umschalters mit HTML, CSS und JavaScript. Zur Weiterentwicklung bieten sich folgende Erweiterungen an:
Hinzufügen von CSS-Übergängen für weichere Wechsel
Verwendung von Icons und Bildern bzw. Grafiken zur besseren visuellen gestaltung
Das gezeigte Beispiel bietet eine solide Grundlage für eigene Experimente und kann leicht an individuelle Projekte angepasst werden.
Quellen
Icons
Hilfreiche Webseiten
How To Toggle Between Dark and Light Mode
(365) LIGHT/DARK THEME TOGGLE (HTML, CSS and JavaScript) Easily - YouTube
Link auf CodePen.io
https://codepen.io/darkmode/pen/RNNyyVa
https://codepen.io/darkmode/pen/XJJqzVV
Codes zum Herunterladen
darkmode-grundgeruest.zip
darkmode-erweitert.zip