Ich versuche, diese Dunkelmodus-Funktion in meine App einzufügen. Es verwendet localstorage, um die Präferenz des Benutzers für die zukünftige Verwendung zu speichern. Das Problem ist jetzt also, wenn der Dunkelmodus aktiviert ist und die Seite aus irgendeinem Grund neu geladen wird, z. Wenn der Benutzer die Seite absichtlich neu lädt oder ein Formular absendet, flackert auf der gesamten Seite ein weißer Hintergrund, bevor er dunkel wird. Es bleibt ein Bruchteil einer Sekunde. Es sieht einfach nicht professionell aus.
Habe noch keine Lösung gefunden. Also bitte helft mir.
PS. Das folgende Snippet funktioniert hier in SO nicht, da der Code enthält localStorage
Objekt.
Hier ist der Code:
const toggleSwitch = document.querySelector('#dark-mode-button input[type="checkbox"]');
const currentTheme = localStorage.getItem('theme');
if (currentTheme) {
document.documentElement.setAttribute('data-theme', currentTheme);
if (currentTheme === 'dark') {
toggleSwitch.checked = true;
}
}
function switchTheme(e) {
if (e.target.checked) {
document.documentElement.setAttribute('data-theme', 'dark');
localStorage.setItem('theme', 'dark');
}else {
document.documentElement.setAttribute('data-theme', 'light');
localStorage.setItem('theme', 'light');
}
}
toggleSwitch.addEventListener('change', switchTheme, false);
:root {
--primary-color: #495057;
--bg-color-primary: #F5F5F5;
}
body{
background-color: var(--bg-color-primary);
}
[data-theme="dark"] {
--primary-color: #8899A6;
--bg-color-primary: #15202B;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
background-color: #fff;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
<div id="dark-mode-button">
<input id="chck" type="checkbox">Dark Mode
<label for="chck" class="check-trail">
<span class="check-handler"></span>
</label>
</div>
<table class="table">
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alfreds Futterkiste</td>
<td>Maria Anders</td>
<td>Germany</td>
</tr>
</tbody>
</table>
Es liegt höchstwahrscheinlich daran, dass das JS die Prüfung noch nicht geladen und ausgeführt hat. Die Seite wird also im normalen Modus geladen, JS initialisiert, stellt den dunklen Modus ein und ändert sich dann.
– Emre Koc
22. Juli 2020 um 11:47 Uhr
Was @EmreKoc sagt, ist richtig. Ich würde empfehlen, das Theme-Erkennungsskript als eines der ersten Dinge auf Ihrer Seite zu platzieren. Abgesehen davon, laden Sie nicht die gesamte Seite in der Navigation neu – ersetzen Sie einfach den Teil, der geändert wurde, durch Ajax-Anforderungen.
– Maurice Nino
22. Juli 2020 um 11:49 Uhr
Leute, tut mir leid, aber können Sie mir bitte sagen, welchen Teil des Codes ich trennen und wo ich das einfügen soll?
– Zack
22. Juli 2020 um 11:51 Uhr
Verschieben Sie den Teil des Codes, der den Dark-Light-Modus in einer Render-blockierenden Weise festlegt – das heißt, innerhalb der
<head>
Ihres Dokuments. Platzieren Sie die restlichen Skripte wie gewohnt kurz vor dem Schließen</body>
Schild. Auf diese Weise hört der Browser auf, Ihr JS im Kopf zu interpretieren, und weist das benötigte zudata-theme
Attribut zu Ihrem<html>
Schild.– Roko C. Buljan
22. Juli 2020 um 11:59 Uhr
@RokoC.Buljan ist richtig. Aber bedenke deine
querySelector
Möglicherweise benötigen Sie eine Ereignisdelegierung, wenn Sie das Laden dieses Skripts priorisieren möchten– 95faf8e76605e973
22. Juli 2020 um 12:06 Uhr