رنگهای حالت تاریک: انتخاب پسزمینه، متن و رنگ تأکیدی
بهجای سیاه خالص از پسزمینه خاکستری تیرهای مثل #121212 استفاده کنید، بهجای سفید خالص از متن سفید شکستهای مثل #e5e5e5، و از نسخههای روشنتر و کماشباعتر رنگهای برندتان. متن را علاوه بر WCAG 2 با APCA هم بسنجید، چون WCAG 2 کنتراست را روی پسزمینههای تیره بیش از واقع نشان میدهد.
6 دقیقه مطالعه
چرا سفید خالص روی سیاه خالص چشم را خسته میکند
سفید #ffffff روی سیاه #000000 بیشترین کنتراستی است که یک صفحهنمایش میتواند نشان دهد: 21:1 در WCAG 2 و Lc -107.9 در APCA. برای برچسب یک دکمه اشکالی ندارد. برای پاراگرافها زیادی است.
مشکل، هالهزدگی (halation) است. حروف روشن روی زمینه سیاه انگار نورشان را به تاریکی اطراف پخش میکنند، پس خطوط ضخیمتر و تار به نظر میرسند، بهخصوص برای کسانی که آستیگمات دارند. چشم هم مدام بین متن خیرهکننده و فاصلههای سیاه تطبیق پیدا میکند که در مطالعه طولانی خستهکننده است.
پایین آوردن هر دو سر، مشکل را بدون آسیب به خوانایی حل میکند. #e5e5e5 روی #121212 هنوز 14.87:1 و Lc -90.4 میدهد که بالاتر از سطح ترجیحی APCA یعنی Lc 90 برای متن اصلی است.
بهترین رنگ پسزمینه برای حالت تاریک
بیشتر تمهای تیره پسزمینهای با روشنایی OKLCH بین 0.14 و 0.28 دارند. جدول انتخابهای رایج را با دو رنگ متن روی آنها نشان میدهد: #e5e5e5 برای متن اصلی راحت و #fafafa برای بیشترین تأکید.
| سطح | OKLCH L | شناختهشده به نام | متن #e5e5e5 | متن #fafafa |
|---|---|---|---|---|
| #000000 | 0 | سیاه خالص | 16.67:1, Lc -91.0 | 20.12:1, Lc -104.6 |
| #0a0a0a | 0.145 | neutral-950 در Tailwind v3 | 15.72:1, Lc -90.9 | 18.97:1, Lc -104.4 |
| #121212 | 0.182 | سطح تیره Material Design | 14.87:1, Lc -90.4 | 17.95:1, Lc -104.0 |
| #18181b | 0.210 | zinc-900 در Tailwind v3 | 14.06:1, Lc -89.9 | 16.97:1, Lc -103.4 |
| #1f2937 | 0.278 | gray-800 در Tailwind v3 | 11.65:1, Lc -87.5 | 14.06:1, Lc -101.0 |
رفتن از سیاه خالص به #18181b از نظر APCA تقریباً هزینهای ندارد: متن #e5e5e5 از Lc -91.0 به -89.9 میرسد. در عوض زیر پسزمینه برای سایهها جا باز میشود و بالای آن برای سطحهای بالاتر. #1f2937 کمی آبی است (کرومای 0.03)، که اگر برندتان سرد باشد خوب کار میکند و کنار رنگهای تأکیدی گرم ناجور به نظر میرسد.
WCAG 2 کنتراست را روی پسزمینه تیره بیش از واقع نشان میدهد
فرمول WCAG 2 با یک نسبت یکسان رفتار میکند، چه رنگها روشن باشند چه تیره. بینایی انسان اینطور نیست: تفاوت بین رنگهای تیره سختتر دیده میشود. APCA این را مدل میکند و فاصله زیاد است. جدول نشان میدهد روی هر پسزمینه به کدام خاکستری نیاز دارید تا به WCAG AA و دو سطح APCA برسید.
| پسزمینه | روشنترین خاکستری با 4.5:1 | APCA همان خاکستری | خاکستری برای Lc 60 | خاکستری برای Lc 75 |
|---|---|---|---|---|
| #ffffff | #767676 | Lc 71.6 | #8e8e8e, 3.28:1 | #6e6e6e, 5.10:1 |
| #121212 | #7d7d7d | Lc -32.8 | #b2b2b2, 8.84:1 | #cccccc, 11.67:1 |
| #000000 | #757575 | Lc -29.6 | #b1b1b1, 9.79:1 | #cbcbcb, 12.94:1 |
روی سفید، خاکستریای که تازه AA را پاس میکند همین حالا به Lc 71.6 میرسد. روی #121212، خاکستریای که تازه AA را پاس میکند فقط به Lc -32.8 میرسد، کمتر از حداقل Lc 45 در APCA برای تیترهای بزرگ. برای رسیدن به همان سطح APCA برای متن اصلی، یعنی Lc 75، روی سفید 5.10:1 کافی است اما روی #121212 به 11.67:1 نیاز دارید.
با رنگها هم همین اتفاق میافتد. آبی #4a83f0 روی #121212 با 5.17:1 از WCAG AA پاس میکند، اما مقدار APCA آن Lc -37.6 است. در حالت تاریک 4.5:1 را فقط حداقل بدانید. برای متن اصلی حدود 9:1 یا بیشتر را هدف بگیرید، یعنی جایی که خاکستری روی #121212 به Lc 60 میرسد، یا مستقیماً APCA را بسنجید.
چرا نمیشود پالت روشن را ساده معکوس کرد
رنگ برندی که برای پسزمینه سفید تنظیم شده معمولاً برای پسزمینه تیره زیادی تیره و زیادی اشباع است. آبی #2f6bdf را از یک تم روشن در نظر بگیرید. روی سفید با 4.90:1 بهعنوان متن لینک پاس میکند. روی #121212 به 3.83:1 و Lc -27.7 افت میکند که برای متن در هر اندازهای رد است.
راهحل، بالا رفتن در مقیاس برند است: روشنایی بیشتر، کرومای کمتر. جدول چهار درجه از همان مقیاس آبی را روی هر دو پسزمینه مقایسه میکند.
| درجه | رنگ | OKLCH | روی #ffffff | روی #121212 |
|---|---|---|---|---|
| 600 | #2f6bdf | oklch(55.5% 0.188 261.8) | 4.90:1, Lc 73.4 | 3.83:1, Lc -27.7 |
| 500 | #4a83f0 | oklch(62.7% 0.175 261.9) | 3.62:1, Lc 63.5 | 5.17:1, Lc -37.6 |
| 400 | #6f9ef4 | oklch(70.3% 0.137 261.7) | 2.67:1, Lc 51.7 | 7.02:1, Lc -49.6 |
| 300 | #a3c0f5 | oklch(80.5% 0.082 262.3) | 1.84:1, Lc 34.5 | 10.18:1, Lc -67.5 |
درجهٔ 300 در حالت تاریک همان نقش درجهٔ 600 را برای لینکها و متن رنگی دارد: روشنایی از 0.555 به 0.805 میرسد و کروما از 0.188 به 0.082 کم میشود، یعنی کمتر از نصف. کمتر شدن کروما هم مهم است، چون رنگهای اشباع روی پسزمینه تیره انگار میدرخشند و لبههایشان میلرزد.
دکمههای توپر فرق دارند، چون دکمه پسزمینه خودش را همراه دارد. متن سفید روی #2f6bdf در هر دو تم 4.90:1 میماند، پس دکمه اصلی میتواند همان بماند. فقط متن رنگی، آیکونها و خطوط دور (outline) به درجه روشنتر نیاز دارند.
ارتفاع (elevation): سطحهای روشنتر بهجای سایه
سایه روی پسزمینه تیره بهسختی دیده میشود، پس تمهای تیره ارتفاع را با روشنایی نشان میدهند: هر سطح هرچه به بیننده نزدیکتر باشد، روشنتر است. تم تیره اولیه Material Design این کار را با یک لایه سفید روی #121212 انجام میداد، از 5% در ارتفاع 1 dp برای کارتها تا 16% در 24 dp برای دیالوگها.
| تراز | لایه سفید | نتیجه | OKLCH L | نسبت به پایه | متن #e5e5e5 |
|---|---|---|---|---|---|
| 0 dp، پسزمینه | 0% | #121212 | 0.182 | 1:1 | 14.87:1 |
| 1 dp، کارت | 5% | #1e1e1e | 0.235 | 1.12:1 | 13.23:1 |
| 3 dp | 8% | #252525 | 0.264 | 1.22:1 | 12.17:1 |
| 6 dp | 11% | #2c2c2c | 0.293 | 1.34:1 | 11.09:1 |
| 12 dp | 14% | #333333 | 0.321 | 1.48:1 | 10.03:1 |
| 24 dp، دیالوگ | 16% | #383838 | 0.341 | 1.60:1 | 9.31:1 |
هر تراز حدود 0.02 تا 0.05 به روشنایی OKLCH اضافه میکند. حتی بالاترین تراز فقط 1.60:1 با پسزمینه فرق دارد، پس به سطحهایی که باید متمایز شوند یک حاشیه 1 px بدهید. در OKLCH میتوانید همین سیستم را بدون لایه بنویسید: کروما و فام را ثابت نگه دارید و L را در هر تراز حدود 0.03 بالا ببرید.
prefers-color-scheme و ویژگی color-scheme
مدیا کوئری prefers-color-scheme به شما میگوید سیستمعامل روی حالت روشن تنظیم شده یا تاریک. ویژگی color-scheme به مرورگر میگوید صفحه شما از کدام طرحهای رنگ پشتیبانی میکند تا نوار اسکرول، کنترلهای فرم و بوم پیشفرض را با رنگهای هماهنگ نمایش دهد.
color-scheme را روی ریشه تنظیم کنید، بعد متغیرهای رنگ را داخل مدیا کوئری بازنویسی کنید.
CSS
:root {
color-scheme: light dark;
--bg: #ffffff;
--surface: #f4f5f6;
--text: #15171b;
--text-muted: #6e7279;
--link: #2f6bdf;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #121212;
--surface: #1e1e1e;
--text: #e5e5e5;
--text-muted: #b2b2b2;
--link: #a3c0f5;
}
}
body {
background: var(--bg);
color: var(--text);
}بدون color-scheme، در بیشتر مرورگرها صفحه تیره هنوز نوار اسکرول روشن و فیلدهای سفید نشان میدهد. فقط یک خط است و بهراحتی فراموش میشود.
تابع light-dark() در CSS
light-dark() دو رنگ میگیرد و در طرح رنگ روشن اولی و در طرح رنگ تیره دومی را برمیگرداند. از سال 2024 در همه مرورگرهای اصلی کار میکند: Chrome و Edge 123، Firefox 120 و Safari 17.5. این تابع ویژگی color-scheme را میخواند: بدون color-scheme: light dark همیشه مقدار روشن را برمیگرداند.
هر رنگ یک بار و کنار جفت تیرهاش تعریف میشود، و برای تغییر تم کافی است فقط color-scheme عوض شود.
CSS
:root {
color-scheme: light dark;
--bg: light-dark(#ffffff, #121212);
--surface: light-dark(#f4f5f6, #1e1e1e);
--text: light-dark(#15171b, #e5e5e5);
--text-muted: light-dark(#6e7279, #b2b2b2);
--link: light-dark(#2f6bdf, #a3c0f5);
--primary: #2f6bdf;
--on-primary: #ffffff;
}
:root[data-theme='light'] {
color-scheme: light;
}
:root[data-theme='dark'] {
color-scheme: dark;
}روی پسزمینه صفحه، همه رنگهای متن این بلوک در هر دو تم AA را پاس میکنند. در تم روشن: متن 17.94:1، متن کمرنگ 4.83:1، لینکها 4.90:1. در تم تیره: متن 14.87:1، متن کمرنگ 8.84:1 با Lc -60.1، لینکها 10.18:1. هر جفت دلخواه خودتان را میتوانید در ابزار بررسی کنتراست PickShade بسنجید که WCAG 2 و APCA را کنار هم نشان میدهد.
پرسش و پاسخ
بهترین رنگ پسزمینه برای حالت تاریک چیست؟
یک خاکستری خیلی تیره بهتر از سیاه خالص جواب میدهد. #121212 که Material Design پیشنهاد میکند و #18181b انتخابهای رایجی هستند. متن سفید شکستهای مثل #e5e5e5 روی #121212 در WCAG 2 نسبت 14.87:1 و در APCA مقدار Lc -90.4 میدهد: خوانا و بدون خیرگی سفید روی سیاه.
آیا برای حالت تاریک از سیاه خالص #000000 استفاده کنم؟
برای صفحههای پرمتن معمولاً نه. متن سفید روی سیاه خالص بیشترین کنتراست ممکن یعنی 21:1 را دارد که باعث هالهزدگی میشود: حروف روشن انگار در سیاهی پخش میشوند و تار دیده میشوند، بهخصوص برای کسانی که آستیگمات دارند. پسزمینه خاکستری تیره با متن سفید شکسته راحتتر خوانده میشود.
در حالت تاریک از چه رنگی برای متن استفاده کنم؟
برای متن اصلی از سفید شکستهای مثل #e5e5e5 و برای متن ثانویه از خاکستری روشنی حدود #b2b2b2 استفاده کنید. روی #121212 این دو به 14.87:1 و 8.84:1 میرسند. از خاکستریهای میانی که تازه از 4.5:1 رد میشوند پرهیز کنید، چون روی پسزمینه تیره خیلی سختتر از آنچه نسبت نشان میدهد خوانده میشوند.
رنگهای برند را چطور برای حالت تاریک تنظیم کنم؟
از درجه روشنتر و کماشباعتر همان مقیاس استفاده کنید. آبیای مثل #2f6bdf روی سفید با 4.90:1 پاس میکند، اما روی #121212 فقط 3.83:1 میگیرد. درجه روشنتر آن، #a3c0f5، روی #121212 به 10.18:1 میرسد، چون روشنایی OKLCH از 0.555 به 0.805 بالا رفته و کروما از 0.188 به 0.082 پایین آمده است.
آیا نسبت کنتراست WCAG برای حالت تاریک دقیق است؟
WCAG 2 کنتراست بین رنگهای تیره را بیش از واقع نشان میدهد. خاکستریای که روی #121212 تازه به 4.5:1 میرسد در APCA فقط Lc -32.8 میگیرد، در حالی که خاکستریای که روی سفید به 4.5:1 میرسد Lc 71.6 میگیرد. در حالت تاریک برای متن اصلی حدود 9:1 یا بیشتر را هدف بگیرید یا APCA را هم بسنجید.
تابع light-dark() در CSS چه کار میکند؟
light-dark() وقتی عنصر از طرح رنگ روشن استفاده میکند رنگ اولش را برمیگرداند و وقتی از طرح رنگ تیره استفاده میکند رنگ دومش را. برای کار کردن باید ویژگی color-scheme تنظیم شده باشد، مثلاً color-scheme: light dark روی :root، و از سال 2024 در همه مرورگرهای اصلی کار میکند.