2 Punkte von GN⁺ 2025-05-19 | Noch keine Kommentare. | Auf WhatsApp teilen
  • CSS contrast-color() lässt den Browser passend zu häufig wechselnden Farben wie einem Button-Hintergrund automatisch schwarzen oder weißen Text auswählen und reduziert so den Aufwand, Farbpaarungen getrennt zu verwalten
  • Übergibt man eine Basisfarbe wie in color: contrast-color(var(--button-color));, wird bei Änderungen der Hintergrundfarbe die Option mit dem höheren Kontrast neu berechnet
  • Die aktuelle Safari Technology Preview verwendet den WCAG-2-Kontrastalgorithmus und wählt bei einem #317CFF-Hintergrund schwarzen Text, obwohl Weiß für die menschliche Wahrnehmung natürlicher wirken kann
  • Die Funktion garantiert Barrierefreiheit nicht automatisch; Design-Prüfungen zu Palette, Schriftgröße, Schriftstärke und Dingen wie prefers-contrast bleiben nötig
  • Die CSS Working Group beschränkt die Funktion bis zum Abschluss der Diskussionen über den WCAG-3-Kontrastalgorithmus zunächst auf die Auswahl zwischen Schwarz und Weiß; komplexere Werkzeuge zur Farbauswahl könnten später folgen

Weniger Aufwand bei der Farbverwaltung mit contrast-color()

  • Wenn man auf einer Website oder in einer Web-App Buttons mit verschiedenen Hintergrundfarben baut, braucht man bei dunklem Hintergrund weißen Text und bei hellem Hintergrund schwarzen Text
  • Bisher musste man Farbpaare wie --button-color und --button-text-color gemeinsam definieren; in großen Projekten oder bei mehreren beteiligten Teams ist es schwer, diese Kombinationen dauerhaft korrekt zu halten
  • Mit contrast-color() kann man in CSS eine Basisfarbe übergeben, und der Browser wählt zwischen Schwarz und Weiß die Farbe mit dem höheren Kontrast
color: contrast-color(purple);
  • Bei Buttons lassen sich die Hintergrundfarbvariable und contrast-color() zusammen einsetzen
button {
  background-color: var(--button-color);
  color: contrast-color(var(--button-color));
}
  • Bei diesem Ansatz reicht es, nur eine Hintergrundfarbe zu definieren; die Textfarbe bestimmt der Browser passend dazu

Auch Zustandsfarben aus einer einzigen Variable ableiten

  • Mit der Relative Color Syntax lässt sich aus der Grundfarbe des Buttons auch eine Hover-Farbe erzeugen, und die Textfarbe für jeden Zustand kann ebenfalls mit contrast-color() berechnet werden
:root {
  --button-color: purple;
  --hover-color: oklch(from var(--button-color) calc(l + .2) c h);
}
button {
  background-color: var(--button-color);
  color: contrast-color(var(--button-color));
  text-box: cap alphabetic; /* vertically centers the text */
}
button:hover {
  background-color: var(--hover-color);
  color: contrast-color(var(--hover-color));
}

Unnatürliche Ergebnisse durch Berechnungen auf Basis von WCAG 2

  • contrast-color() löst Probleme mit Kontrast und Barrierefreiheit nicht automatisch vollständig
  • Bei manchen Hintergrundfarben entsteht weder mit Schwarz noch mit Weiß ein ausreichend hoher Kontrast; deshalb müssen Designer, Entwickler und Tester das weiterhin prüfen
  • Die Implementierung in Safari Technology Preview verwendet mit Stand Mai 2025 den WCAG-2-Algorithmus
    • Bei einem blauen #317CFF-Hintergrund berechnet WCAG 2 für schwarzen Text ein Kontrastverhältnis von 5.45:1
    • Für weißen Text auf demselben Hintergrund ergibt sich 3.84:1
    • contrast-color() wählt daher Schwarz, weil der Zahlenwert höher ist
  • Für die menschliche Wahrnehmung kann in dieser Kombination Weiß jedoch besser aussehen; der WCAG-2-Algorithmus für Farbkontrast steht seit Langem in der Kritik

Die Diskussion um Kontrastalgorithmen mit APCA und WCAG 3

  • Der Accessible Perceptual Contrast Algorithm (APCA) ist einer der Kandidaten, die in WCAG 3 aufgenommen werden könnten
  • Der APCA Contrast Calculator bewertet bei einem #317CFF-Hintergrund schwarzen Text mit Lc 38.7 und weißen Text mit Lc -70.9
    • Ein negativer APCA-Wert bedeutet, dass der Text heller ist als der Hintergrund
    • Für die Stärke des Kontrasts werden hier 38.7 und 70.9 ohne Vorzeichen verglichen
    • In diesem Ergebnis hat weißer Text den stärkeren Kontrast
  • APCA legt den Schwerpunkt auf wahrnehmungsbasierten Kontrast statt auf ein rein mathematisches Verhältnis und berücksichtigt, dass Menschen Kontrast je nach Farbe und Helligkeit nicht linear wahrnehmen
  • Der CSS-Standard verlangt derzeit noch die Verwendung des bisherigen Algorithmus, enthält aber einen Hinweis darauf, dass künftig andere Kontrastalgorithmen hinzukommen könnten
  • Welcher Algorithmus in WCAG 3 verwendet werden soll und wie die Lizenzen der Kandidaten behandelt werden, ist weiterhin Gegenstand der Diskussion

Was im echten Design zusätzlich geprüft werden muss

  • Dass contrast-color() die bessere Farbe auswählt, ist nicht dasselbe wie die Garantie für ausreichenden Kontrast
  • Vor allem bei Mitteltönen können sich die Ergebnisse je nach Algorithmus deutlich unterscheiden
  • Für Nutzer, die höheren Kontrast wünschen, kann zusätzlich die Media Query prefers-contrast verwendet werden
@media (prefers-contrast: more) {
  /* styling with more contrast */
}
  • Im Beispiel wird #2DAD4E als Marken-Button-Hintergrundfarbe für die Website einer Baumschule verwendet
    • Nach APCA beträgt der Kontrast zu weißem Text Lc -60.4
    • Ob dieser Wert ausreicht, hängt von Schriftgröße und Schriftstärke ab
    • APCA verwendet statt des Verhältnisses aus WCAG 2 einen Einzelwert von Lc -108 bis 106
  • Das APCA Readability Criterion bietet Zielwerte in den Stufen Bronze, Silver und Gold und hilft bei der Wahl von Schriftgröße und -stärke
  • In der Beispielrechnung funktioniert die Kombination aus weißem Text und #2DAD4E bei 24px Text mit font-weight 400 oder höher; für font-weight 300 sind mindestens 41px nötig
  • Für Nutzer, die mehr Kontrast anfordern, lassen sich für Light Mode und Dark Mode getrennte Farben festlegen
    • Light Mode: dunkleres Grün mit weißem Text, Lc -76.1
    • Dark Mode: helleres Grün mit schwarzem Text, Lc 75.2
--button-color: #2DAD4E; /* brand green background */
@media (prefers-contrast: more) {
  @media (prefers-color-scheme: light) {
    --button-color: #419543; /* darker green background */
  }
  @media (prefers-color-scheme: dark) {
    --button-color: #77CA8B; /* lighter green background */
  }
}
button {
  background-color: var(--button-color);
  color: contrast-color(var(--button-color));
  font-size: 1.5rem; /* 1.5 * 16 = 24px at normal zoom */
  font-weight: 500;
}
  • Da contrast-color() derzeit mit dem WCAG-2-Algorithmus arbeitet, könnte es in diesem Beispiel für die Website schwer einsetzbar sein
  • In Projekten mit einer dunkleren Markenfarbe Grün, bei denen die Auswahl zwischen Schwarz und Weiß korrekt ausfällt, kann die Funktion schon heute nützlich sein
  • Besonders hilfreich ist contrast-color(), wenn Farben für viele Zustände oder Optionen definiert werden müssen, etwa enabled/disabled, Light/Dark Mode oder prefers-contrast

Warum es zunächst auf Schwarz und Weiß beschränkt wurde

  • Das aktuelle contrast-color() ist deutlich einfacher als color-contrast(), das in Safari Technology Preview 122 enthalten war
  • Die CSS Working Group verfolgt den Ansatz, angesichts der noch offenen Diskussion um den WCAG-3-Kontrastalgorithmus zunächst nur ein Werkzeug bereitzustellen, das zur Basisfarbe Schwarz oder Weiß auswählt
  • Wenn die Auswahl auf Schwarz und Weiß festgelegt ist, sinkt die Wahrscheinlichkeit, dass Websites später durch Änderungen am WCAG-2-Algorithmus kaputtgehen
  • Künftig könnten leistungsfähigere Werkzeuge folgen, bei denen der Browser aus einer benutzerdefinierten Farbliste auswählt oder ein gewünschtes Kontrastniveau vorgegeben wird
  • contrast-color() lässt sich nicht nur für Textfarben, sondern auch für viele andere Eigenschaften verwenden, die Farben festlegen, etwa Hintergrund oder Rahmen

Noch keine Kommentare.

Noch keine Kommentare.