EduFlow

الوحدة 4 · التصميم البصري والمحتوى

اللون والتباين

18 دقراءة 3 دبيئة تجريب الكود

الدرس في لمحة

قِس تباين النصوص وعناصر الواجهة وأصلحه وفق نسب WCAG 2.2، وتوقّف عن الاعتماد على اللون وحده، وافهم لماذا لم يصبح APCA جزءًا من المعيار بعد.

  1. 1نسبة التباين
  2. 2العتبات التي تحتاجها
  3. 3لا تعتمد على اللون وحده
  4. 4وماذا عن APCA؟

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

النص منخفض التباين هو أكثر إخفاقات إمكانية الوصول شيوعًا على الويب: وجدته WebAIM في 83.9% من أشهر مليون صفحة رئيسية عام 2026. وهو أيضًا الأسهل قياسًا، لأن التباين رقم. يحبّ مصمّمو Ticketly الرمادي الباهت على الأبيض، والأبيض على البرتقالي الفاتح. ومها، بتكبير 400% وضعف في البصر، لا تقرأ هذا ولا ذاك، ولا يقرؤهما أي شخص يتحقّق من تذكرته على هاتفه تحت الشمس.

نسبة التباين

تقارن WCAG الإضاءة النسبية (relative luminance) للونين، وهي مقياس للسطوع المُدرَك من 0 (الأسود) إلى 1 (الأبيض). تتراوح النسبة من 1:1 (لونان متطابقان) إلى 21:1 (أسود على أبيض). هذه هي طريقة الحساب، وهي نفسها التي تشغّلها كل أدوات فحص التباين:

JavaScript
function luminance(hex) {
  const [r, g, b] = [1, 3, 5].map((i) => {
    const c = parseInt(hex.slice(i, i + 2), 16) / 255;
    return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
  });
  return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}

function contrast(a, b) {
  const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x);
  return ((hi + 0.05) / (lo + 0.05)).toFixed(2);
}

console.log('price #9a9a9a on white:', contrast('#9a9a9a', '#ffffff'));
console.log('price #767676 on white:', contrast('#767676', '#ffffff'));
console.log('white on orange button:', contrast('#ffffff', '#f4a261'));
console.log('ink on orange button:  ', contrast('#1b1830', '#f4a261'));

القناة الخضراء هي الغالبة في الإضاءة، ولهذا يفشل النص الأبيض على البرتقالي أو الأصفر فشلًا ذريعًا حتى حين يبدو ساطعًا.

العتبات التي تحتاجها

ماذا المستوى AA المعيار
النص العادي 4.5:1 1.4.3 Contrast (Minimum)
النص الكبير: 24px على الأقل، أو 18.66px بخط عريض 3:1 1.4.3
إطارات الحقول، ومؤشّرات التركيز، والأيقونات، وخطوط الرسوم البيانية اللازمة لفهم المحتوى 3:1 1.4.11 Non-text Contrast
النص، المستوى المعزَّز 7:1 1.4.6 ‏(AAA)

الاستثناءات ضيّقة: الشعارات، والعناصر الزخرفية البحتة، وعناصر التحكّم المعطّلة. أما نص التلميح داخل الحقول، والتعليقات الرمادية «الثانوية»، وروابط التذييل، والنص فوق الصور، فكلها تُحتسب. وللنص فوق صورة، أضِف طبقة مصمتة أو شبه شفافة خلف النص، وقِس التباين مقابل أفتح جزء من الصورة يمكن أن يقع عليه النص.

إصلاحات Ticketly:

ticketly/styles.css
.price { color: #595959; }                 /* was #9a9a9a: 2.81:1 → 7.00:1 */
.btn { background: #f4a261; color: #1b1830; } /* was white text: 2.06:1 → 8.35:1 */
input { border: 1px solid #77708f; }        /* was #ddd: 1.36:1 → 4.67:1 */

يحتفظ الزر البرتقالي بلون العلامة التجارية؛ ولم يتغيّر إلا لون النص. وهذا عادةً أرخص إصلاح.

لا تعتمد على اللون وحده

يطلب معيار WCAG ‏1.4.1 Use of Color ‏(A) ألا يكون اللون أبدًا الطريقة الوحيدة لنقل المعلومات. نحو رجل من كل 12 وامرأة من كل 200 لديهم شكل من أشكال قصور رؤية الألوان، وأكثرها شيوعًا عمى الأحمر والأخضر.

في Ticketly يستبعد هذا:

  • الروابط داخل النص التي لا تختلف عن النص المحيط إلا باللون. أبقِ الخط السفلي (أو اضمن تباين 3:1 مع النص المحيط إضافةً إلى إشارة أخرى عند التمرير والتركيز؛ والخط السفلي أبسط بكثير).
  • الأخطاء التي تظهر كإطار أحمر فقط. أضِف رسالة نصية وأيقونة، مربوطتين كما فعلت في درس نماذج سهلة الوصول.
  • إتاحة المقاعد كنقاط خضراء وحمراء. أضِف نقشًا أو تسمية: “available”، “taken”.
إلى اليسار: نقاط المقاعد التي لا تختلف إلا باللون تبدو متطابقة بالتدرّج الرمادي. إلى اليمين: المقاعد المتاحة دوائر مفرّغة والمقاعد المحجوزة دوائر ممتلئة عليها علامة ×، فتبقى مميّزة دون لون، مع مفتاح بالكلمات. اللون فقط أيّ المقاعد متاح؟ الشكل + التسمية متاح محجوز
المعلومات نفسها، مع اللون ومن دونه

وماذا عن APCA؟

ستصادف خوارزمية التباين الإدراكي سهلة الوصول (APCA) في أدوات التصميم. إنها تحاكي الإدراك أفضل من نسبة WCAG 2: تأخذ في الحسبان حجم الخط وسماكته، وتعامل النص الفاتح على الداكن معاملة مختلفة عن الداكن على الفاتح، وهذا مهم للوضع الداكن. وقد دُرست من أجل WCAG 3، التي ما زالت مسودة عمل في W3C.

APCA ليست جزءًا من WCAG 2.2، ولا يستند إليها أي قانون. سيختبر المدقّق صفحاتك بنسبتي 4.5:1 و3:1. استخدم APCA كأداة مساعدة إضافية إن أعجبت فريقك، وخاصةً للخطوط الرفيعة والسمات الداكنة، لكن كل زوج ألوان يجب أن يظلّ ينجح وفق نسبة WCAG 2.

التباين القوي يساعد الناس على رؤية Ticketly بحجمه الافتراضي. ويسأل الدرس التالي ماذا يحدث حين يغيّرون ذلك الحجم، وماذا يحدث حين تتحرّك الصفحة.

أهم النقاط

  • النص العادي يحتاج إلى نسبة تباين لا تقلّ عن 4.5:1 مع خلفيته؛ والنص الكبير (24px، أو 18.66px بخط عريض) يحتاج إلى 3:1.
  • إطارات حقول الإدخال ومؤشّرات التركيز والأيقونات وخطوط الرسوم البيانية التي يحتاج الناس إلى رؤيتها تتطلّب 3:1 مع ما يحيط بها (1.4.11 Non-text Contrast).
  • لا يجوز أن يكون اللون الطريقة الوحيدة لعرض المعلومات؛ أرفقه بنص أو أيقونة أو خط سفلي أو نقش.
  • APCA نموذج واعد لقياس التباين الإدراكي يُدرَس لـ WCAG 3، لكن WCAG 2.2 والقوانين التي تستند إليها تستخدم نسبتي 4.5:1 و3:1.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

أسعار Ticketly بلون #767676 على خلفية بيضاء، بنسبة 4.54:1، وبحجم 16px وخط عادي. هل يحقّق ذلك معيار 1.4.3 Contrast (Minimum)؟

السؤال 2 من 4

إطار حقل في نموذج بلون #dddddd على صفحة بيضاء (1.36:1). نص الـ label تباينه ممتاز. ما الذي يفشل؟

السؤال 3 من 4

تعلِّم صفحة الدفع في Ticketly الحقول غير الصالحة بإطار أحمر ولا شيء غيره. من يخذله هذا التصميم بأوضح صورة؟

السؤال 4 من 4

تقترح مصمّمة فحص كل زوج ألوان بـ APCA بدلًا من نسبة التباين في WCAG 2. ماذا تقول لها؟

تدريب

بيئة تجريب الكود

أصلح ألوان تذكرة عطلة نهاية الأسبوع

عدّل الـ CSS فقط لتحقّق بطاقة Weekend pass معيار WCAG 2.2 بالمستوى AA:

  • نص .price يحتاج إلى 4.5:1 على الأقل مقابل الخلفية البيضاء.
  • نص .btn يحتاج إلى 4.5:1 على الأقل مقابل خلفية الزر (يمكنك الإبقاء على البرتقالي).
  • إطار input الكمية يحتاج إلى 3:1 على الأقل مقابل خلفية البطاقة.
  • الرابط داخل .note لا يختلف عن الفقرة إلا بسماكة الخط؛ أعطِه إشارة لا تعتمد على اللون، مثل خط سفلي، وأبقِ تباين نصه 4.5:1.

تحسب الفحوص نسب تباين حقيقية من الأنماط المحسوبة، فتُقبل أي ألوان تنجح.

<article class="pass">
  <h2>Weekend pass</h2>
  <p class="price">SAR 320 for both nights</p>
  <p class="note">Includes entry to the <a href="#lounge">harbour lounge</a> and a free drink token.</p>
  <label for="qty">Quantity</label>
  <input id="qty" type="number" min="1" max="6" value="1">
  <button type="button" class="btn">Add to basket</button>
</article>جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

المعاينة

الـ console

(لا مخرجات)

الفحوص

  • نص السعر يصل إلى 4.5:1 مقابل خلفيته
  • نص الزر يصل إلى 4.5:1 مقابل لون الزر
  • إطار الحقل يصل إلى 3:1 مقابل خلفية البطاقة
  • للرابط خط سفلي (أو إطار سفلي) وتباين نصي 4.5:1