Haben Sie schon einmal Stunden damit verbracht, den Dunkelmodus umzuschalten, nur um ihn bei der Seitenaktualisierung blendend weiß zu blinken? Oder schlimmer noch, hat es die Systemeinstellungen Ihres Benutzers völlig ignoriert? Ja, ich auch. ?
Hier ist die Sache: Der Dunkelmodus ist nicht mehr nur ein trendiges Feature. Da immer mehr Menschen nachts programmieren (schuldig im Sinne der Anklage) und Zugänglichkeit immer wichtiger wird, ist ein gut implementierter Dunkelmodus praktisch ein Muss für moderne Websites oder Web-Apps. Aber es richtig zu machen, kann überraschend schwierig sein.
Die gute Nachricht? Nachdem ich verschiedene Implementierungen durchforstet und mit localStorage gekämpft habe, habe ich endlich den Code für einen Dark-Mode-Schalter geknackt, der:
In diesem Beitrag werde ich Sie durch die Erstellung eines Dunkelmodus-Schalters führen, den Sie tatsächlich verwenden möchten. Keine überkomplizierten Lösungen, keine unnötigen Abhängigkeiten – nur sauberer, funktionierender Code, den Sie sofort implementieren können.
Lassen Sie uns zuerst den langweiligen Teil aus dem Weg räumen – aber ich verspreche, mich kurz zu fassen!
Wahrscheinlich haben Sie bereits alles, was Sie brauchen, aber nur um sicherzustellen, dass wir auf dem gleichen Stand sind:
Bevor wir loslegen, hier ein kurzer Blick darauf, was am Ende auf uns zukommen wird. Keine ausgefallenen UI-Bibliotheken oder komplizierten Setups – nur ein einfacher, reibungsloser Schalter, der etwa so aussieht:
Machen Sie sich keine Sorgen darüber, dass es genau so aussieht – das Wichtigste ist, dass es einwandfrei funktioniert. Wir konzentrieren uns zunächst auf die Funktion, dann können Sie es so gestalten, wie Sie möchten.
Das Beste daran? Alles, was wir bauen werden, funktioniert mit:
Bereit, sich die Hände schmutzig zu machen? Beginnen wir mit dem Fundament!
Okay, machen wir uns die Hände schmutzig! Zuerst richten wir die Grundstruktur ein.
Wir beginnen mit etwas absolut einfachem HTML. Über diesen Teil müssen Sie nicht zu viel nachdenken:
<button> <h3> The CSS </h3> <p>Here's where things get interesting. We'll use CSS variables (aka custom properties) to handle our color scheme. Drop this in your CSS file:<br> </p> <pre class="brush:php;toolbar:false">:root { --background: #ffffff; --text-primary: #222222; --toggle-bg: #e4e4e7; --toggle-hover: #d4d4d8; } [data-theme="dark"] { --background: #121212; --text-primary: #ffffff; --toggle-bg: #3f3f46; --toggle-hover: #52525b; } body { background-color: var(--background); color: var(--text-primary); transition: background-color 0.3s ease, color 0.3s ease; height: 100vh; display: flex; align-items: center; justify-content: center; } .theme-toggle { border: none; padding: 0.5rem; border-radius: 9999px; background-color: var(--toggle-bg); cursor: pointer; transition: background-color 0.2s ease; align-self: flex-start; position: absolute; right: 20px; } .theme-toggle:hover { background-color: var(--toggle-hover); } .theme-toggle svg { transform-origin: center; transition: transform 0.3s ease; } .theme-toggle:active svg { transform: rotate(30deg); } h1 { display: flex; } .sun-icon { display: none; width: 24px; height: 24px; } .moon-icon { width: 24px; height: 24px; } [data-theme="dark"] .sun-icon { display: block; } [data-theme="dark"] .moon-icon { display: none; }
Profi-Tipp: Ist Ihnen aufgefallen, dass wir Datenthemen anstelle von Klassen verwenden? Dadurch wird sehr deutlich, wozu das Attribut dient, und mögliche Konflikte bei der Klassenbenennung werden verhindert.
Für die Symbole können Sie entweder Ihre eigenen SVGs verwenden oder sich einige aus Ihrer bevorzugten Symbolbibliothek holen. Ich verwende gerne einfache, also habe ich Chatgpt gebeten, sich Folgendes auszudenken:
<!-- Replace the empty SVGs with these --> <svg> <p>At this point, your toggle should look pretty decent, but it won't actually do anything yet. Don't worry though - in the next section, we'll add the JavaScript that makes it all work!</p> <p><strong>A quick heads-up:</strong> I've kept the styling minimal on purpose. Feel free to spice it up with your own creative touches. Want a sliding animation? Go for it! Prefer a different icon style? Make it yours!</p> <p>Ready to make this thing actually work? Let's move on to the JavaScript implementation!</p> <h2> The JavaScript Implementation (Where It All Comes Together!) </h2> <p>Alright, this is where we make our toggle actually, you know... toggle. But don't worry - we're keeping it clean and simple.<br> </p> <pre class="brush:php;toolbar:false">const themeToggle = document.querySelector('.theme-toggle'); function toggleTheme() { const currentTheme = document.documentElement.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; document.documentElement.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); } // Listen for clicks on our toggle themeToggle.addEventListener('click', toggleTheme); function initializeTheme() { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme); } else { const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; document.documentElement.setAttribute( 'data-theme', prefersDark ? 'dark' : 'light' ); localStorage.setItem('theme', prefersDark ? 'dark' : 'light'); } } // Run on page load initializeTheme(); // Listen for system theme change window.matchMedia('(prefers-color-scheme: dark)') .addEventListener('change', (e) => { // Only update if user hasn't manually set a preference if (!localStorage.getItem('theme')) { document.documentElement.setAttribute( 'data-theme', e.matches ? 'dark' : 'light' ); } });
Lassen Sie uns zusammenfassen, was hier passiert, denn tatsächlich sind einige ziemlich coole Dinge im Gange:
Hier ist ein häufiges Problem: Manchmal sehen Benutzer beim Laden der Seite ein Aufblitzen des falschen Themas. Super nervig, oder? Lassen Sie uns das beheben, indem wir dieses Skript im
hinzufügen. Ihres HTML:<script> // Add this to your <head> before any style sheets (function() { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme); } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.setAttribute('data-theme', 'dark'); } })(); </script>
Dies wird sofort ausgeführt, bevor etwas anderes geladen wird, wodurch das lästige Flashen verhindert wird.
Und... das ist es! Sie haben einen funktionierenden Dunkelmodus-Schalter:
Möchten Sie es noch besser machen? Kommen wir zu einigen hilfreichen Tipps, die Ihnen dabei helfen werden, von „gut“ zu „großartig“ zu wechseln!
Lassen Sie uns von „es funktioniert“ zu „es funktioniert wunderbar“ wechseln, mit einigen wichtigen, aber oft übersehenen Verbesserungen. Das sind die Details, die eine professionelle Implementierung von einem schnellen Hack unterscheiden.
Stellen wir zunächst sicher, dass jeder unseren Schalter nutzen kann, unabhängig davon, wie er mit seinem Gerät interagiert:
// Add this to your existing JavaScript themeToggle.addEventListener('keydown', (e) => { // Toggle on Enter or Space if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleTheme(); } });
Übergänge deaktivieren, wenn der Benutzer reduzierte Bewegung bevorzugt:
@media (prefers-reduced-motion: reduce) { body { transition: none; } }
Das ist etwas, was viele Entwickler übersehen: Einige Inhalte müssen je nach Thema möglicherweise geändert werden. Denken Sie an Bilder mit unterschiedlichen Versionen für Hell-/Dunkel-Modi:
// Add this to your toggleTheme function function updateThemeSpecificContent(theme) { // Find all theme-aware images const themeImages = document.querySelectorAll('[data-theme-image]'); themeImages.forEach(img => { const lightSrc = img.getAttribute('data-light-src'); const darkSrc = img.getAttribute('data-dark-src'); img.src = theme === 'dark' ? darkSrc : lightSrc; }); }
Verwenden Sie es in Ihrem HTML wie folgt:
<img data-theme-image data-light-src="/path/to/light-logo.png" data-dark-src="/path/to/dark-logo.png" alt="Erstellen Sie in wenigen Minuten einen Dunkelmodus-Schalter (der tatsächlich funktioniert)">
Manchmal kann es vorkommen, dass das gespeicherte Thema nicht mehr mit dem übereinstimmt, was tatsächlich angezeigt wird. Fügen wir eine Sicherheitsüberprüfung hinzu:
<button> <h3> The CSS </h3> <p>Here's where things get interesting. We'll use CSS variables (aka custom properties) to handle our color scheme. Drop this in your CSS file:<br> </p> <pre class="brush:php;toolbar:false">:root { --background: #ffffff; --text-primary: #222222; --toggle-bg: #e4e4e7; --toggle-hover: #d4d4d8; } [data-theme="dark"] { --background: #121212; --text-primary: #ffffff; --toggle-bg: #3f3f46; --toggle-hover: #52525b; } body { background-color: var(--background); color: var(--text-primary); transition: background-color 0.3s ease, color 0.3s ease; height: 100vh; display: flex; align-items: center; justify-content: center; } .theme-toggle { border: none; padding: 0.5rem; border-radius: 9999px; background-color: var(--toggle-bg); cursor: pointer; transition: background-color 0.2s ease; align-self: flex-start; position: absolute; right: 20px; } .theme-toggle:hover { background-color: var(--toggle-hover); } .theme-toggle svg { transform-origin: center; transition: transform 0.3s ease; } .theme-toggle:active svg { transform: rotate(30deg); } h1 { display: flex; } .sun-icon { display: none; width: 24px; height: 24px; } .moon-icon { width: 24px; height: 24px; } [data-theme="dark"] .sun-icon { display: block; } [data-theme="dark"] .moon-icon { display: none; }
Hier ist ein netter Trick, um Layoutverschiebungen beim Laden benutzerdefinierter Schriftarten in verschiedenen Designs zu verhindern:
<!-- Replace the empty SVGs with these --> <svg> <p>At this point, your toggle should look pretty decent, but it won't actually do anything yet. Don't worry though - in the next section, we'll add the JavaScript that makes it all work!</p> <p><strong>A quick heads-up:</strong> I've kept the styling minimal on purpose. Feel free to spice it up with your own creative touches. Want a sliding animation? Go for it! Prefer a different icon style? Make it yours!</p> <p>Ready to make this thing actually work? Let's move on to the JavaScript implementation!</p> <h2> The JavaScript Implementation (Where It All Comes Together!) </h2> <p>Alright, this is where we make our toggle actually, you know... toggle. But don't worry - we're keeping it clean and simple.<br> </p> <pre class="brush:php;toolbar:false">const themeToggle = document.querySelector('.theme-toggle'); function toggleTheme() { const currentTheme = document.documentElement.getAttribute('data-theme'); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; document.documentElement.setAttribute('data-theme', newTheme); localStorage.setItem('theme', newTheme); } // Listen for clicks on our toggle themeToggle.addEventListener('click', toggleTheme); function initializeTheme() { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme); } else { const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; document.documentElement.setAttribute( 'data-theme', prefersDark ? 'dark' : 'light' ); localStorage.setItem('theme', prefersDark ? 'dark' : 'light'); } } // Run on page load initializeTheme(); // Listen for system theme change window.matchMedia('(prefers-color-scheme: dark)') .addEventListener('change', (e) => { // Only update if user hasn't manually set a preference if (!localStorage.getItem('theme')) { document.documentElement.setAttribute( 'data-theme', e.matches ? 'dark' : 'light' ); } });
Bevor Sie versenden, testen Sie unbedingt diese Szenarien:
<script> // Add this to your <head> before any style sheets (function() { const savedTheme = localStorage.getItem('theme'); if (savedTheme) { document.documentElement.setAttribute('data-theme', savedTheme); } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.setAttribute('data-theme', 'dark'); } })(); </script>
// Add this to your existing JavaScript themeToggle.addEventListener('keydown', (e) => { // Toggle on Enter or Space if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleTheme(); } });
Das ist es! Sie verfügen jetzt über eine robuste, zugängliche und benutzerfreundliche Dark-Mode-Implementierung, die verschiedene Szenarien wie ein Champion bewältigt.
Nun, da haben Sie es! Wir haben einen Dunkelmodus-Schalter entwickelt, der nicht nur funktioniert, sondern wirklich gut funktioniert.
Lassen Sie uns kurz zusammenfassen, was wir erreicht haben:
Nehmen Sie diesen Code gerne und machen Sie ihn zu Ihrem eigenen. Fügen Sie vielleicht ein paar ausgefallene Animationen hinzu, probieren Sie verschiedene Farbschemata aus oder integrieren Sie es in Ihr bestehendes Design. Das von uns geschaffene Fundament ist solide genug, um alle kreativen Ideen zu bewältigen, die Sie ihm entgegenbringen.
Der Dunkelmodus mag wie ein kleines Detail erscheinen, aber es sind diese kleinen Details, die zeigen, dass Ihnen das Benutzererlebnis am Herzen liegt. Außerdem ist es einfach cool. Wer liebt nicht einen guten dunklen Modus?
Wenn Sie dies hilfreich fanden, können Sie es gerne mit anderen Entwicklern teilen. Und wenn Ihnen coole Verbesserungen einfallen, würde ich mich freuen, davon zu hören!
Wenn Ihnen dieser Leitfaden gefallen hat und Sie mehr Web-Entwickler-Tipps, Hacks und gelegentliche Papa-Witze zum Thema Programmieren wünschen, kommen Sie mit mir auf X! Ich teile schnelle Tipps, Einblicke in die Programmierung und praktische Lösungen aus meiner Entwicklerreise.
? Folge mir @Peboydcoder
Ich poste regelmäßig über:
Kommen Sie vorbei und sagen Sie Hallo! Ich freue mich immer, mit anderen Entwicklern in Kontakt zu treten, denen die Schaffung besserer Web-Erlebnisse am Herzen liegt.
Das obige ist der detaillierte Inhalt vonErstellen Sie in wenigen Minuten einen Dunkelmodus-Schalter (der tatsächlich funktioniert). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!