Du har slått på et mørkt tema, og ved hver ny innlasting blinker siden hvitt et brøkdels sekund før den blir mørk. Dette er den vanligste feilen i en temabryter, og den rettes med ett lite skript på riktig sted. Nedenfor finner du hele oppskriften: kode du kan kopiere, en forklaring på hvordan den virker, og en måte å sjekke resultatet selv på.
Dette får du #
- Som standard følger temaet systemets tema (lyst eller mørkt) og virker selv med JavaScript slått av.
- En knapp bytter tema, og valget huskes i nettleseren.
- Det lagrede valget tas i bruk før første opptegning: ingen hvit blink ved ny innlasting.



Hvorfor siden blinker #
Nettleseren tegner siden mens den leser HTML-en. Hvis brukerens valg tas i bruk av et skript nederst på siden, eller etter innlasting, rekker nettleseren å tegne den lyse versjonen og tegner den deretter på nytt. Valget må være kjent før den første pikselen vises, så skriptet må stå helt i begynnelsen av siden, ihead.Trinn 1. Fortell at nettstedet har begge temaene #
Sett enmeta-linje i head og rett etter den et lite skript. Det leser det lagrede valget og skriver det, hvis det finnes, til attributtet data-theme på rotelementet:
<meta name="color-scheme" content="light dark">
<script>
(function () {
var saved = null;
try { saved = localStorage.getItem('theme'); } catch (e) {}
if (saved === 'light' || saved === 'dark') {
document.documentElement.dataset.theme = saved;
}
})();
</script>try-blokken er der fordi nettleseren kaster en feil i privat modus eller når lagring er blokkert, og uten den ville hele siden stått uten tema.Trinn 2. Beskriv fargene én gang #
Fargene i hvert tema er et verdipar i funksjonenlight-dark(): den første for det lyse temaet, den andre for det mørke. Egenskapen color-scheme velger den riktige:
:root {
color-scheme: light dark;
--bg: light-dark(#ffffff, #14161a);
--text: light-dark(#1b1f24, #e6e8eb);
--card: light-dark(#f3f5f8, #1e2228);
--line: light-dark(#d8dee6, #2c333c);
--accent: light-dark(#1a56db, #7aa7ff);
}
:root[data-theme="light"] { color-scheme: light; }
:root[data-theme="dark"] { color-scheme: dark; }
body { background: var(--bg); color: var(--text); }data-theme, virker color-scheme: light dark: siden tar systemets tema uten en eneste linje JavaScript. Når skriptet har skrevet brukerens valg, tvinger de to siste linjene fram riktig tema.Trinn 3. Legg til en knapp #
<button id="theme-toggle" type="button" aria-pressed="false"></button>(function () {
var root = document.documentElement;
var button = document.getElementById('theme-toggle');
var names = { dark: 'Dark', light: 'Light' };
function current() {
return root.dataset.theme ||
(matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
}
function show() {
var now = current();
button.textContent = names[now];
button.setAttribute('aria-pressed', now === 'dark');
}
button.addEventListener('click', function () {
var next = current() === 'dark' ? 'light' : 'dark';
root.dataset.theme = next;
try { localStorage.setItem('theme', next); } catch (e) {}
show();
});
show();
})();Sjekk det selv #
Vi testet oppskriften i en nettleser på en side med et tregt skript (to sekunder) før slutten, med valget «dark» lagret i lagringen og et lyst systemtema. 0,8 sekunder etter at innlastingen startet: med skriptet ihead er siden allerede mørk, med skriptet nederst er den hvit, og den forblir hvit til siden er lest helt ut. Dette er hva en person ser i det øyeblikket:

Resten er også sjekket: uten JavaScript tar siden systemets tema, etter et trykk på knappen og ny innlasting blir valget stående, og ved 390, 768 og 1280 punkter er det ingen vannrett rulling.
Du kan gjenta det slik:
- Åpne siden, trykk på knappen og velg det mørke temaet.
- Slå på nettverksstruping i utviklerverktøyene og last inn siden på nytt: bakgrunnen er mørk fra første bilde.
- Slå av JavaScript og tøm lagringen: siden følger systemets tema igjen.
Vanlige feil #
- Skriptet nederst på siden. Blinken kommer tilbake: valget blir kjent for sent.
- Ingen
color-schemepå:root. Uten den vet ikkelight-dark()hvilken verdi den skal ta. - Ingen
tryrundtlocalStorage. I privat modus går siden i stykker i enkelte nettlesere. - Temaet bare i JavaScript. Uten skriptet får den besøkende ikke noe mørkt tema, selv om det er slått på i systemet. Oppskriften løser dette med
color-scheme. - Kontrasten er ikke sjekket. Tekst og bakgrunn bør gi minst 4,5 til 1, tilgjengelighetskravet WCAG AA. Sjekk begge temaene, ikke bare ett.

Ingen har kommentert ennå. Bli den første.