Markt
Prijzen
InloggenBegin
PraktijkgidsCSS en web
CSS en web

CSS-variabelenthema: licht, donker en merkkleuren

Thema’s gaan mis als kleuren worden genoemd naar hoe ze eruitzien in plaats van wat ze doen. Benoem de rollen, wijs ze naar een palet, en lichte modus, donkere modus en een tweede merk worden elk een paar regels.

GradientlyGeverifieerd Gradiently-account·1 oktober 2026·5 min lezen
Cover: Modal Compass · GR·5TEZ·Q9

De korte versie

  • Een CSS-variabelenthema werkt het best in twee lagen: palet-variabelen met ruwe kleuren en semantische variabelen die beschrijven waar elke kleur voor dient.
  • Componenten zouden alleen semantische variabelen moeten lezen, zoals --color-text of --color-surface, nooit rechtstreeks paletwaarden.
  • Een donkere modus is dan een kwestie van de semantische variabelen naar andere paletwaarden laten wijzen, onder een mediaquery of een data-attribuut.
  • De functie light-dark() en de eigenschap color-scheme laten in huidige browsers één declaratie beide modi bevatten.
  • Een klein inline script in de head dat het opgeslagen thema instelt voordat de pagina wordt getekend, voorkomt de flits van het verkeerde thema.
Op deze pagina
Twee lagen: palet en rollenEen donkere modus toevoegen met CSS-variabelenEen themaschakelaar die niet flitstMerkthema’s voorbij licht en donkerHoud het web en je ontwerpen op één palet

Een CSS-variabelenthema is een set custom properties, zoals --color-surface en --color-text, die elk component leest in plaats van vastgecodeerde kleuren. Om het thema te veranderen verander je de variabelen, meestal op :root of op een data-theme-attribuut, en de hele interface volgt. De truc die het schaalbaar maakt is het splitsen van de variabelen in twee lagen: een palet van ruwe kleuren en semantische rollen die naar dat palet wijzen.

Twee lagen: palet en rollen

Paletvariabelen heten naar wat ze zijn: --violet-600, --ink-900. Semantische variabelen heten naar wat ze doen: --color-accent, --color-text-muted. Componenten lezen alleen de tweede soort. Als de donkere modus komt, wijs je de rollen opnieuw toe en blijft elk component onaangeroerd. Het is hetzelfde idee als design tokens, rechtstreeks in CSS uitgedrukt.

Palet--violet-600: #7c3aed

Wie het leest

Alleen de rollaag

Verandert wanneer

Het merk opnieuw wordt ontworpen
Rol--color-accent: var(--violet-600)

Wie het leest

Elk component

Verandert wanneer

Het thema of de modus verandert
Component

Voorbeeld

--button-bg: var(--color-accent)

Wie het leest

Eén component

Verandert wanneer

Eén component een lokale afwijking nodig heeft
LaagVoorbeeldWie het leestVerandert wanneer
Palet--violet-600: #7c3aedAlleen de rollaagHet merk opnieuw wordt ontworpen
Rol--color-accent: var(--violet-600)Elk componentHet thema of de modus verandert
Component--button-bg: var(--color-accent)Eén componentEén component een lokale afwijking nodig heeft
De componentlaag is optioneel. Gebruik hem alleen waar één component echt moet afwijken van de rol.
css
:root {
  /* Palette: raw values, named for what they are */
  --paper-50: #faf8f5;
  --paper-100: #f1ede6;
  --ink-900: #14121f;
  --ink-700: #3d3a4f;
  --ink-500: #6b6880;
  --violet-600: #6d28d9;
  --violet-300: #c4b5fd;
  --night-950: #0d0b16;
  --night-900: #17142a;
  --night-800: #221e3a;

  /* Roles: what each colour is for (light mode) */
  --color-bg: var(--paper-50);
  --color-surface: var(--paper-100);
  --color-text: var(--ink-900);
  --color-text-muted: var(--ink-500);
  --color-border: color-mix(in oklab, var(--ink-900) 12%, transparent);
  --color-accent: var(--violet-600);
  --color-on-accent: #ffffff;
}

body { background: var(--color-bg); color: var(--color-text); }
.card { background: var(--color-surface); border: 1px solid var(--color-border); }
.button { background: var(--color-accent); color: var(--color-on-accent); }
Componenten noemen nooit violet of inkt. Die ene regel maakt het thema verwisselbaar.
De rollen van het lichte thema. Een warme papieren achtergrond in plaats van puur wit laat het violette accent rustiger aanvoelen.

Rollen benoemen die een herontwerp overleven

Een rolnaam moet nog waar zijn nadat de kleuren veranderen. --light-grey is in de donkere modus niet meer licht, en --blue liegt de dag dat het merk groen wordt. Benoem in plaats daarvan de taak en de combinatie, zodat wie de stylesheet daarna leest weet welke kleur waarop komt.

Namen die breken

  • --blue, --purple-button
  • --light-grey-bg
  • --white-text
  • --dark-border

Namen die blijven

  • --color-accent, --color-on-accent
  • --color-surface
  • --color-text
  • --color-border

Een donkere modus toevoegen met CSS-variabelen

De donkere modus wijst de rollen opnieuw toe. Respecteer standaard de instelling van het besturingssysteem en laat een data-theme-attribuut die overschrijven wanneer de lezer kiest. Stel ook color-scheme in, zodat scrollbalken, formulierbesturing en het standaardcanvas passen.

css
:root { color-scheme: light; }

/* Follow the system unless the reader picked light */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --color-bg: var(--night-950);
    --color-surface: var(--night-900);
    --color-text: #f2f0fa;
    --color-text-muted: #a5a1bd;
    --color-border: color-mix(in oklab, #ffffff 12%, transparent);
    --color-accent: var(--violet-300);
    --color-on-accent: var(--ink-900);
  }
}

/* The reader picked dark explicitly */
:root[data-theme="dark"] {
  color-scheme: dark;
  --color-bg: var(--night-950);
  --color-surface: var(--night-900);
  --color-text: #f2f0fa;
  --color-text-muted: #a5a1bd;
  --color-border: color-mix(in oklab, #ffffff 12%, transparent);
  --color-accent: var(--violet-300);
  --color-on-accent: var(--ink-900);
}
De donkere waarden staan twee keer: eenmaal voor de systeemvoorkeur en eenmaal voor een expliciete keuze. Een preprocessor-mixin of light-dark() haalt de herhaling weg.
De rollen van het donkere thema. Het accent wordt een lichter violet, omdat het violet van de lichte modus te donker is om te lezen op een bijna zwarte ondergrond.

Een donkere modus is geen omgekeerde lichte modus. Oppervlakken worden lichter naarmate ze hoger liggen, accenten lichten op en schaduwen maken plaats voor randen. Ontwerp voor de donkere modus en verlopen in de donkere modus behandelen de visuele kant.

De light-dark()-snelkoppeling

Huidige browsers ondersteunen light-dark(), dat een lichte en een donkere waarde neemt en er een kiest op basis van het color-scheme van het element. Stel color-scheme: light dark in op de root om het systeem te volgen, of forceer er een met het attribuut, en elke rol wordt één regel: --color-bg: light-dark(var(--paper-50), var(--night-950)). Houd de langere vorm aan als je browsers van vóór 2024 moet ondersteunen.

Een themaschakelaar die niet flitst

Als de opgeslagen keuze wordt toegepast nadat de pagina is getekend, zien lezers die donker kozen bij elke keer laden een witte flits. Stel het attribuut in met een klein inline script in de head, voordat een stylesheet de body tekent.

html
<head>
  <script>
    (function () {
      var saved = localStorage.getItem("theme");
      if (saved === "light" || saved === "dark") {
        document.documentElement.dataset.theme = saved;
      }
    })();
  </script>
  <link rel="stylesheet" href="/styles.css">
</head>
Draait vóór de eerste weergave. De schakelknop hoeft dan alleen dataset.theme in te stellen en de waarde in localStorage op te slaan.
  1. 1

    Bied drie keuzes

    Licht, donker en systeem. Het attribuut verwijderen geeft de controle terug aan prefers-color-scheme.

  2. 2

    Sla alleen expliciete keuzes op

    Bewaar light of dark; verwijder de sleutel voor systeem, zodat een latere wijziging in het besturingssysteem wordt gerespecteerd.

  3. 3

    Vermijd overgangen bij het laden

    Als kleuren overgaan, schakel de overgang dan pas in na de eerste weergave, anders animeert de pagina tijdens het laden van licht naar donker.

Merkthema’s voorbij licht en donker

Dezelfde twee lagen regelen meerdere merken in één codebase. Elk merk levert zijn eigen palet en rolwaarden onder een data-brand-attribuut, en modi werken er nog steeds bovenop. Met color-mix() kun je hoverstaten en tinten afleiden uit één accent per merk, zoals getoond in color-mix() in CSS.

css
[data-brand="harbour"] {
  --color-accent: #0f766e;
  --gradient-hero: linear-gradient(150deg, #042f2e 0%, #0f766e 55%, #5eead4 100%);
}

[data-brand="ember"] {
  --color-accent: #c2410c;
  --gradient-hero: linear-gradient(150deg, #431407 0%, #c2410c 55%, #fdba74 100%);
}

.button:hover { background: color-mix(in oklab, var(--color-accent), black 12%); }
.hero { background: var(--gradient-hero); }
Verlopen kunnen ook tokens zijn. Sla de hele waarde op in één variabele en de hero verandert mee met het merk.
De twee hero-tokens uit de code hierboven. Dezelfde structuur, dezelfde hoek, ander merk.

Omdat custom properties worden geërfd, hoeft een thema niet de hele pagina te beslaan. Zet data-theme="dark" op één sectie, zoals een promotieband of een footer, en alles erbinnen leest de donkere rollen terwijl de rest van de pagina licht blijft. Schrijf de donkere selector als [data-theme="dark"] in plaats van :root[data-theme="dark"] als je wilt dat dat werkt, en stel ook color-scheme op de sectie in.

Verlopen gaan niet uit zichzelf over

Een verloopvariabele veranderen wisselt de achtergrond direct. Om tussen twee verlopen te animeren registreer je de kleurstops met @property, uitgelegd in CSS @property.

Houd het web en je ontwerpen op één palet

Een thema in CSS is maar de helft van een merk. Dezelfde kleuren horen terug te komen in je social posts, decks en e-mails. De merkkit van Gradiently bevat je paletten, logo’s en kop- en broodlettertypen, en de Designer past hem toe bij het opmaken van een ontwerp, zodat de post die je maandag maakt hetzelfde accent gebruikt als je site. Kies je die kleuren nog, begin dan met merkkleuren kiezen.

Vraag het de Designer

Beschrijf wat je nodig hebt en de AI van Gradiently maakt het, op jouw Mark.

Probeer de Designer

Vragen die mensen stellen

Hoe maak ik een thema met CSS-variabelen?

Definieer paletvariabelen met ruwe kleuren en daarna semantische variabelen zoals --color-bg die ernaar wijzen. Componenten lezen alleen de semantische en thema’s wijzen ze opnieuw toe.

Hoe voeg ik een donkere modus toe met CSS-variabelen?

Overschrijf de semantische variabelen binnen @media (prefers-color-scheme: dark) en onder een [data-theme="dark"]-selector voor lezers die dat kiezen.

Hoe voorkom ik dat het thema flitst bij het laden van de pagina?

Lees het opgeslagen thema in een klein inline script in de head en stel het attribuut in voordat de stylesheet de pagina tekent.

Wat doet light-dark() in CSS?

Het geeft zijn eerste waarde in de lichte modus en zijn tweede in de donkere, op basis van het color-scheme van het element. Het werkt in huidige grote browsers.

Kan ik een verloop in een CSS-variabele opslaan?

Ja. Sla het hele verloop als waarde op en gebruik het in background. Om tussen verlopen te animeren registreer je de stops met @property.

Deel deze gids

Geschreven door GradientlyGeverifieerd Gradiently-account

Het team achter Gradiently, een ontwerptool rond Marks: levende kleurverlopen die alles wat je ontwerpt op jou laten lijken.

Bekijk ons profiel

Op deze pagina

Twee lagen: palet en rollenEen donkere modus toevoegen met CSS-variabelenEen themaschakelaar die niet flitstMerkthema’s voorbij licht en donkerHoud het web en je ontwerpen op één palet

Deel deze gids

Volgende in CSS en web

CSS-verloopgenerator: schrijf verlopen met de hand of met tools

Lees verder

Alle gidsen over CSS en web
CSS en web

Design tokens: één bron voor kleur en typografie

5 min lezen

Een merkkleur die in veertig bestanden staat, gaat afwijken. Een token staat op één plek en elk platform leest ervan. Zo structureer je design tokens, benoem je ze zodat ze blijven werken en lever je ze aan code en ontwerptools.

Achtergronden

Dark mode-ontwerp: achtergronden, kleur en contrast

5 min lezen

Dark mode is geen omgekeerde lichte modus. Oppervlakken, tekst, accenten en kleurverlopen hebben elk hun eigen waarden nodig, en de regels verschillen van wat je kent.

CSS en web

color-mix() in CSS: kleuren mengen in de browser

5 min lezen

color-mix() laat de browser het kleurwerk doen dat je vroeger in een preprocessor of op het oog deed. Kies de juiste kleurruimte en één merkkleur levert een heel palet aan tinten, schakeringen en doorschijnende versies.

Vind de look die alleen van jou is.

Elke Mark is een levende achtergrond met één eigenaar. Probeer een beschikbare Mark en claim de jouwe als het goed voelt.

Begin met ontwerpen

Controleer een certificaat

Typ een certificaatnummer of de code van een Mark om te zien wie hem bezit.

Werkt met ChatGPT en Claude

Vraag je AI om een ontwerp. Hij maakt het in jouw Mark, klaar om te bewerken.

ChatGPTClaude
Zo verbind je

Product

  • Markt
  • Verkennen
  • Prijzen
  • Certificaten

Leren

  • Praktijkgids
  • Helpcentrum
  • Wat is er nieuw

Ontwikkelaars

  • Overzicht
  • ChatGPT en Claude
  • API-referentie
  • API-keys

Bedrijf

  • Over ons
  • Contact
  • Inloggen

Juridisch

  • Voorwaarden
  • Privacy
  • Terugbetalingen
  • Mark-bescherming
  • Cookies
  • Alle beleidsstukken
Beweeg over de letters. Elke letter draagt een echte Mark.Raak een letter aan om zijn Mark te zien.Eén naam. Tien Marks erin.
© 2026 Gradiently