تم تحسين النمط التلقائي للوضع الداكن من خلال خاصية CSS لنظام الألوان والعلامة الوصفية المقابلة لها.

تتيح سمة CSS color-scheme والعلامة الوصفية المقابلة للمطوّرين أن يفعّلوا الإعدادات التلقائية الخاصة بالمظهر لورقة أنماط وكيل المستخدم.

الخلفية

ميزة الوسائط المفضّلة لدى المستخدم "prefers-color-scheme"

تتيح ميزة الوسائط المفضّلة للمستخدم prefers-color-scheme لمطوّري البرامج التحكّم بشكل كامل في مظهر صفحاتهم. وإذا لم تكن معتادًا على ذلك، يُرجى قراءة مقالتي prefers-color-scheme: مرحبًا بقصة الظلام يا صديقي القديم، حيث وثّقتُ كل المعلومات التي أعرفها عن كيفية إنشاء تجارب مذهلة للوضع الداكن.

من بين الأجزاء التي تم ذكرها باختصار في المقالة هي السمة color-scheme CSS والعلامة الوصفية المقابلة التي تحمل الاسم نفسه. وهما يجعلان حياتك كمطوّر أكثر سهولة من خلال السماح لك بضبط الإعدادات التلقائية لموضوع معيّن في ورقة أنماط وكيل المستخدم، مثل عناصر التحكّم في النماذج وأشرطة التمرير وألوان نظام CSS. وفي الوقت نفسه، تمنع هذه الميزة المتصفّحات من تطبيق أي عمليات تحويل من تلقاء نفسها.

المتصفحات المتوافقة

prefers-color-scheme

دعم المتصفح

  • 76
  • 79
  • 67
  • 12.1

المصدر

color-scheme

دعم المتصفح

  • 81
  • 81
  • 96
  • 13

المصدر

ورقة أنماط وكيل المستخدم

قبل المتابعة، سأشرح بإيجاز ماهية ورقة أنماط وكيل المستخدم. في معظم الأحيان، يمكنك اعتبار كلمة وكيل المستخدم (UA) ككلمة متصفّح بطريقة رائعة. تحدِّد ورقة أنماط UA الشكل والأسلوب التلقائيَين للصفحة. كما يشير الاسم، فإن ورقة أنماط UA هي شيء يعتمد على UA المعني. يمكنك إلقاء نظرة على ورقة أنماط UA الخاصة بـ Chrome (وChromium) ومقارنتها بمتصفح Firefox أو Safari (وWebKit). عادةً ما تتفق أوراق أنماط UA على معظم الأشياء. فعلى سبيل المثال، تجعل جميع هذه الرموز الروابط باللون الأزرق والنص العام باللون الأسود ولون الخلفية الأبيض، ولكن هناك أيضًا اختلافات مهمة (ومزعجة أحيانًا)، مثل كيفية تصميم عناصر التحكم في النماذج.

يمكنك إلقاء نظرة فاحصة على ورقة أنماط UA على WebKit ووظيفة هذا الوضع في ما يتعلّق بالوضع الداكن. (ابحث في النص الكامل عن كلمة "داكن" في ورقة الأنماط). يتغيّر الإعداد التلقائي الذي توفّره ورقة الأنماط بناءً على تفعيل الوضع الداكن أو إيقافه. لتوضيح ذلك، في ما يلي إحدى قواعد CSS التي تستخدم الفئة الصورية :matches ومتغيّرات WebKit-internal مثل -apple-system-control-background، بالإضافة إلى توجيه WebKit-internal Preprocessor #if defined:

input,
input:matches([type="password"], [type="search"]) {
  -webkit-appearance: textfield;
  #if defined(HAVE_OS_DARK_MODE_SUPPORT) &&
      HAVE_OS_DARK_MODE_SUPPORT
    color: text;
    background-color: -apple-system-control-background;
  #else
    background-color: white;
  #endif
  /* snip */
}

ستلاحظ بعض القيم غير العادية للسمتَين color وbackground-color أعلاه. لا تُعد text أو -apple-system-control-background ألوان CSS صالحة. تكون ألوان دلالية داخلية في مجموعة WebKit.

تبين أن CSS لديها ألوان نظام دلالية موحَّدة. ويتم تحديدها في المستوى 4 من وحدة ألوان CSS. على سبيل المثال، Canvas (يجب عدم الخلط بينها وبين العلامة <canvas>) تشير إلى خلفية محتوى التطبيق أو المستندات، في حين تُستخدم CanvasText للنص في محتوى التطبيق أو المستندات. فالمحتوىان مرتبطان معًا ويجب عدم استخدامهما بمعزل عن الآخر.

يمكن أن تستخدم أوراق أنماط UA ألوان النظام الدلالي الخاصة بها أو الخاصة بها، لتحديد كيفية عرض عناصر HTML تلقائيًا. وإذا تم ضبط نظام التشغيل على الوضع الداكن أو استخدام مظهر داكن، سيتم ضبط CanvasText (أو text) بشكل مشروط على اللون الأبيض، وضبط Canvas (أو -apple-system-control-background) على اللون الأسود. تُعيِّن ورقة أنماط UA بعد ذلك CSS التالية مرة واحدة فقط، وتغطي كلاً من الوضع الفاتح والوضع الداكن.

/**
  Not actual UA stylesheet code.
  For illustrative purposes only.
*/
body {
  color: CanvasText;
  background-color: Canvas
}

سمة color-scheme في CSS

تقدم مواصفات المستوى 1 من وحدة تعديل الألوان في CSS نموذجًا وعناصر تحكم في الضبط التلقائي للألوان بواسطة وكيل المستخدم بهدف التعامل مع الإعدادات المفضّلة للمستخدم مثل الوضع الداكن أو تعديل التباين أو أنظمة الألوان المحددة المطلوبة.

تتيح السمة color-scheme المحددة فيها للعنصر الإشارة إلى أنظمة الألوان المناسبة للعرض. يتم التفاوض على هذه القيم مع الخيارات المفضّلة للمستخدم، ما يؤدي إلى اختيار نظام ألوان يؤثر في عناصر واجهة المستخدم (UI) مثل الألوان التلقائية لعناصر التحكم في النموذج وأشرطة التمرير، بالإضافة إلى القيم المستخدمة لألوان نظام CSS. القيم التالية متاحة حاليًا:

  • يشير الرمز normal إلى أنّ العنصر ليس على عِلم بأنظمة الألوان على الإطلاق، لذا يجب عرض العنصر باستخدام نظام الألوان التلقائي للمتصفّح.

  • تشير القيمة [ light | dark ]+ إلى أنّ العنصر على عِلم بأنظمة الألوان المدرَجة ويمكنه التعامل معها، كما يعبّر عن تفضيل مرتَّب بينها.

في هذه القائمة، يمثّل light ألوانًا فاتحة باستخدام ألوان خلفية فاتحة وألوان واجهة داكنة، في حين يمثّل dark عكس ذلك، حيث تكون ألوان خلفية داكنة وألوان فاتحة للمقدّمة.

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

في العنصر :root، يجب أن يؤثر العرض باستخدام نظام الألوان أيضًا على لون سطح اللوحة (أي لون الخلفية العام) والقيمة الأولية للسمة color والقيم المستخدمة لألوان النظام، ويجب أن يؤثر أيضًا في أشرطة التمرير في إطار العرض.

/*
  The page supports both dark and light color schemes,
  and the page author prefers dark.
*/
:root {
  color-scheme: dark light;
}

العلامة الوصفية color-scheme

للالتزام بسمة color-scheme في CSS، يجب تنزيل خدمة CSS أولاً (إذا تمت الإشارة إليها عبر <link rel="stylesheet">) وتحليلها. لمساعدة وكلاء المستخدمين في عرض خلفية الصفحة باستخدام نظام الألوان المطلوب على الفور، يمكن أيضًا توفير القيمة color-scheme في عنصر <meta name="color-scheme">.

<!--
  The page supports both dark and light color schemes,
  and the page author prefers dark.
-->
<meta name="color-scheme" content="dark light">

الجمع بين color-scheme وprefers-color-scheme

وبما أنّ العلامة الوصفية وسمة CSS (في حال تطبيقهما على العنصر :root) ينتجان عن السلوك نفسه في النهاية، أنصح دائمًا بتحديد نظام الألوان من خلال العلامة الوصفية كي يتمكّن المتصفّح من الانتقال إلى المخطط المفضّل بشكل أسرع.

على الرغم من أنّه لا حاجة إلى استخدام قواعد CSS إضافية للصفحات الأساسية المطلقة، عليك دائمًا دمج color-scheme مع prefers-color-scheme بشكل عام. على سبيل المثال، يمتلك لون WebKit CSS -webkit-link، المستخدم بواسطة WebKit وChrome للرابط الكلاسيكي الأزرق rgb(0,0,238)، نسبة تباين غير كافية تبلغ 2.23:1 على خلفية سوداء ويفشل كل من WCAG AA ومتطلبات WCAG AAA.

لقد فتحتُ أخطاءً في Chrome وWebKit وFirefox، فضلاً عن مشكلة وصفية في HTML Standard لحلّ هذه المشكلة.

التفاعل مع "prefers-color-scheme"

قد يبدو التفاعل بين سمة CSS color-scheme والعلامة الوصفية المقابلة مع ميزة الوسائط المفضّلة للمستخدم prefers-color-scheme مربكًا في البداية. في الواقع، يلعبان معًا بشكل جيد. وأهم شيء يجب فهمه هو أنّ color-scheme يحدّد بشكل حصري المظهر التلقائي، في حين أنّ prefers-color-scheme يحدّد المظهر القابل للتحديد. لتوضيح ذلك بشكل أفضل، افترض الصفحة التالية:

<head>
  <meta name="color-scheme" content="dark light">
  <style>
    fieldset {
      background-color: gainsboro;
    }
    @media (prefers-color-scheme: dark) {
      fieldset {
        background-color: darkslategray;
      }
    }
  </style>
</head>
<body>
  <p>
    Lorem ipsum dolor sit amet, legere ancillae ne vis.
  </p>
  <form>
    <fieldset>
      <legend>Lorem ipsum</legend>
      <button type="button">Lorem ipsum</button>
    </fieldset>
  </form>
</body>

يضبط رمز CSS المضمّن في الصفحة background-color للعنصر <fieldset> على gainsboro في الحالة العامة، وعلى darkslategray إذا كان المستخدم يفضّل نظام ألوان dark وفقًا لميزة الوسائط المفضّلة للمستخدم prefers-color-scheme.

من خلال العنصر <meta name="color-scheme" content="dark light">، تخبر الصفحة المتصفّح أنّها تتيح المظهر الداكن والفاتح، مع تفضيل المظهر الداكن.

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

لاحِظ كيف يتغيّر background-color لعنصر <fieldset> استنادًا إلى ما إذا كان الوضع الداكن مفعّلاً وذلك باتّباع القواعد الواردة في ورقة الأنماط المضمّنة التي يوفّرها المطوّر على الصفحة. وهي إما gainsboro أو darkslategray.

صفحة في الوضع الفاتح
الوضع الفاتح: الأنماط التي يحدّدها المطوّر ووكيل المستخدم النص باللون الأسود والخلفية بيضاء وفقًا لورقة أنماط وكيل المستخدم. قيمة background-color للعنصر <fieldset> هي gainsboro وفقًا لورقة أنماط المطوِّر المضمّنة.
صفحة في الوضع الداكن
الوضع الداكن: الأنماط التي يحدّدها المطوّر ووكيل المستخدم النص باللون الأبيض والخلفية سوداء وفقًا لورقة أنماط وكيل المستخدم. قيمة background-color للعنصر <fieldset> هي darkslategray وفقًا لورقة أنماط المطوِّر المضمّنة.

يتم التحكّم في مظهر العنصر <button> من خلال ورقة أنماط وكيل المستخدم. تم ضبط color على لون نظام ButtonText، وضبط background-color وborder-color الأربعة على لون النظام ButtonFace.

صفحة في الوضع الفاتح تستخدم خاصية ButtonFace.
الوضع الفاتح: يتم ضبط background-color وborder-color المختلفة على لون نظام ButtonFace.

لاحِظ الآن كيف يتغيّر border-color للعنصر <button>. تتحول القيمة المحسوبة في border-top-color وborder-bottom-color من rgba(0, 0, 0, 0.847) (أسود) إلى rgba(255, 255, 255, 0.847) (باللون الأبيض)، لأن وكيل المستخدم يتم تحديثه ButtonFace ديناميكيًا استنادًا إلى نظام الألوان. وينطبق الأمر نفسه على color للعنصر <button> الذي تمّ ضبطه على لون النظام المقابل ButtonText.

إظهار أن قيم اللون المحسوبة تطابق ButtonFace.
الوضع الفاتح: القيمتان المحسوبتان للسمة border-top-color وborder-bottom-color واللتان تم ضبطهما على ButtonFace في ورقة أنماط وكيل المستخدم أصبحت الآن rgba(0, 0, 0, 0.847).
إظهار أن قيم الألوان المحسوبة لا تزال تطابق ButtonFace أثناء استخدام الوضع الداكن.
الوضع الداكن: القيمتان المحسوبتان لكل من border-top-color وborder-bottom-color والتي تم ضبطهما على ButtonFace في ورقة أنماط وكيل المستخدم هي الآن rgba(255, 255, 255, 0.847).

عرض توضيحي

يمكنك الاطّلاع على تأثيرات color-scheme التي يتم تطبيقها على عدد كبير من عناصر HTML في عرض توضيحي على أداة Glitch. يعرض العرض التوضيحي عن قصد انتهاك إرشادات WCAG AA وAAA مع ألوان الروابط المذكورة في التحذير أعلاه.

العرض التوضيحي أثناء استخدام &quot;الوضع الفاتح&quot;
تم تبديل العرض التوضيحي إلى color-scheme: light.
العرض التوضيحي أثناء استخدام &quot;الوضع الداكن&quot;
تم تبديل العرض التوضيحي إلى color-scheme: dark. لاحِظ انتهاك إرشادات WCAG AA وWCAG AAA في ألوان الروابط.

شكر وتقدير

نفّذ Rune Lillesveen سمة CSS color-scheme والعلامة الوصفية المقابلة. ورون أيضًا أحد المحررين المشاركين لمواصفات المستوى 1 من وحدة تعديل الألوان في CSS. صورة رئيسية من تصميم Philippe Leone على Un الهدف