W Starożytnym Egipcie hieroglify malowane byly jaskrawymi kolorami na kontrastowym tle - nie dla ozdoby, lecz po to, by można je bylo odczytac nawet w ciemnych komorach swiatyn. Dzis ta sama zasada obowiazuje w web designie: treści muszą być czytelne dla każdego.
WCAG definiuje minimalne wymagania dotyczace kontrastu miedzy tekstem a tlem:
| Poziom | Normalny tekst | Duzy tekst (18px bold / 24px) | |:---|:---|:---| | AA | 4.5:1 | 3:1 | | AAA | 7:1 | 4.5:1 |
1/* DOBRZE - wysoki kontrast */
2.good-contrast {
3 color: #1a1a2e; /* Ciemny tekst */
4 background-color: #f5f1e3; /* Jasne tło */
5 /* Kontrast: ~12:1 - spelnia AAA */
6}
7
8/* ŹLE - zbyt niski kontrast */
9.bad-contrast {
10 color: #999999; /* Szary tekst */
11 background-color: #cccccc; /* Szare tło */
12 /* Kontrast: ~1.8:1 - nie spelnia nawet AA */
13}
14
15/* POPRAWIONE */
16.fixed-contrast {
17 color: #595959; /* Ciemniejszy szary */
18 background-color: #ffffff; /* Biale tło */
19 /* Kontrast: ~5.9:1 - spelnia AA */
20}Kolor nie może być jedynym sposobem przekazywania informacji - osoby z daltonizmem mogą nie rozrozniac niektórych kolorow.
1<!-- ŹLE - tylko kolor wskazuje błąd -->
2<style>
3 .error-field { border-color: red; }
4</style>
5<input type="email" class="error-field">
6
7<!-- DOBRZE - kolor + ikona + tekst -->
8<style>
9 .error-field {
10 border: 2px solid #d32f2f;
11 background-image: url('error-icon.svg');
12 background-repeat: no-repeat;
13 background-position: right 8px center;
14 }
15</style>
16<input type="email" class="error-field"
17 aria-invalid="true"
18 aria-describedby="email-err">
19<p id="email-err" class="error-msg">
20 <span aria-hidden="true">❌</span>
21 Podaj poprawny adres e-mail
22</p>1/* Używaj jednostek relatywnych */
2body {
3 font-size: 100%; /* = 16px domyślnie */
4}
5
6h1 { font-size: 2rem; } /* 32px */
7h2 { font-size: 1.5rem; } /* 24px */
8p { font-size: 1rem; } /* 16px */
9small { font-size: 0.875rem; } /* 14px - minimum! */
10
11/* NIGDY nie blokuj powiekszania tekstu */
12/* ŹLE */
13html { font-size: 16px !important; }
14/* DOBRZE */
15html { font-size: 100%; }1/* WCAG wymaga minimum: */
2p {
3 line-height: 1.5; /* Interlinia: 1.5x rozmiar fontu */
4 letter-spacing: 0.12em; /* Odstepy miedzy literami */
5 word-spacing: 0.16em; /* Odstepy miedzy slowami */
6}
7
8/* Odstep miedzy akapitami >= 2x rozmiar fontu */
9p + p {
10 margin-top: 2em;
11}1/* Optymalna szerokosc linii: 50-80 znaków */
2.article-content {
3 max-width: 70ch; /* 70 znaków */
4 margin: 0 auto;
5}W CSS możesz użyć
color-contrast() (eksperymentalne) lub skorzystac z narzędzi:1/* Użyj zmiennych CSS dla spojnosci */
2:root {
3 --text-primary: #1a1a2e;
4 --text-secondary: #4a4a5a;
5 --bg-primary: #ffffff;
6 --bg-secondary: #f5f1e3;
7 --accent: #8b6914;
8 --error: #d32f2f;
9 --success: #2e7d32;
10}
11
12/* Tryb wysokiego kontrastu */
13@media (prefers-contrast: high) {
14 :root {
15 --text-primary: #000000;
16 --text-secondary: #1a1a1a;
17 --bg-primary: #ffffff;
18 --accent: #6b4c00;
19 }
20}
21
22/* Tryb ciemny */
23@media (prefers-color-scheme: dark) {
24 :root {
25 --text-primary: #e0e0e0;
26 --text-secondary: #b0b0b0;
27 --bg-primary: #1a1a2e;
28 --bg-secondary: #2d2d44;
29 }
30}1/* Tryb wysokiego kontrastu */
2@media (prefers-contrast: high) {
3 button {
4 border: 3px solid currentColor;
5 }
6}
7
8/* Tryb wymuszonych kolorow (np. Windows High Contrast) */
9@media (forced-colors: active) {
10 .card {
11 border: 2px solid ButtonText;
12 }
13
14 a {
15 color: LinkText;
16 }
17
18 /* Dekoracyjne tła są usuwane - dodaj obramowania */
19 .highlight {
20 forced-color-adjust: none;
21 /* LUB zachowaj oryginalne kolory */
22 }
23}Tak jak starorzytni Egipcjanie dbali o czytelnosc hieroglifów malowanych na scianach swiatyn, tak my musimy zadbac o czytelnosc tekstu na naszych stronach - aby każdy moglr odczytac nasz przekaz, niezależnie od warunkow.