कलर-स्कीम सीएसएस प्रॉपर्टी और उससे जुड़े मेटा टैग के साथ बेहतर गहरे रंग वाले मोड की डिफ़ॉल्ट स्टाइल

color-scheme सीएसएस प्रॉपर्टी और उससे जुड़े मेटा टैग की मदद से, डेवलपर अपने पेजों को उपयोगकर्ता एजेंट स्टाइलशीट में, थीम के हिसाब से डिफ़ॉल्ट तौर पर सेट करने के लिए चुन सकते हैं.

बैकग्राउंड

उपयोगकर्ता की पसंद के हिसाब से मीडिया की prefers-color-scheme सुविधा

prefers-color-scheme उपयोगकर्ता की पसंद के मुताबिक मीडिया की सुविधा, डेवलपर को यह कंट्रोल करने की सुविधा देती है कि उनका पेज कैसा दिखेगा. अगर आपको इसके बारे में कुछ भी नहीं पता है, तो कृपया यह लेख पढ़ें prefers-color-scheme: नमस्ते डार्कनेस, मेरा पुराना दोस्त. इस लेख में, मैंने डार्क मोड के शानदार अनुभव बनाने के बारे में पूरी जानकारी तैयार की है.

इस लेख में, पहेली का एक छोटा हिस्सा color-scheme सीएसएस प्रॉपर्टी और उसी नाम का मेटा टैग है. इस पहेली के बारे में कुछ ही शब्दों में बताया गया है. ये दोनों आपको, डेवलपर के तौर पर आपके काम को आसान बनाते हैं. इनके लिए, उपयोगकर्ता एजेंट स्टाइलशीट में, पेज को थीम के हिसाब से डिफ़ॉल्ट तौर पर सेट करने की सुविधा मिलती है. जैसे, फ़ॉर्म कंट्रोल, स्क्रोल बार, और सीएसएस सिस्टम कलर. साथ ही, यह सुविधा ब्राउज़र को खुद में कोई भी बदलाव लागू करने से रोकती है.

ब्राउज़र समर्थन

prefers-color-scheme

ब्राउज़र सहायता

  • 76
  • 79
  • 67
  • 78 जीबी में से

सोर्स

color-scheme

ब्राउज़र सहायता

  • 81
  • 81
  • 96
  • 13

सोर्स

उपयोगकर्ता एजेंट स्टाइलशीट

आगे बढ़ने से पहले, मुझे कम शब्दों में बताएं कि उपयोगकर्ता एजेंट स्टाइलशीट क्या होती है. ज़्यादातर मामलों में, उपयोगकर्ता एजेंट (UA) शब्द को ब्राउज़र शब्द के तौर पर इस्तेमाल किया जा सकता है. UA स्टाइलशीट की मदद से, किसी पेज का डिफ़ॉल्ट लुक और स्टाइल तय किया जाता है. जैसा कि नाम से पता चलता है, UA स्टाइलशीट कुछ ऐसी होती है जो तय किए गए UA पर निर्भर करती है. Chrome (और Chromium की) UA स्टाइलशीट को देखें और इसकी तुलना Firefox या Safari (और WebKit) से करने पर करें. आम तौर पर, UA की स्टाइलशीट ज़्यादातर चीज़ों पर सहमत होती हैं. उदाहरण के लिए, वे सभी लिंक को नीला, सामान्य टेक्स्ट को काला, और बैकग्राउंड का रंग सफ़ेद बनाते हैं, लेकिन उन दोनों में अहम (और कभी-कभी परेशान करने वाले) अंतर भी होते हैं, जैसे कि वे फ़ॉर्म कंट्रोल की स्टाइल कैसे तय करते हैं.

WebKit की UA स्टाइलशीट और गहरे रंग वाले मोड के बारे में जानकारी को ध्यान से देखें. (स्टाइलशीट में "dark" शब्द के लिए पूरा टेक्स्ट खोजें.) स्टाइलशीट से मिलने वाला डिफ़ॉल्ट विकल्प, इस आधार पर बदलता है कि डार्क मोड चालू है या बंद. इसे दिखाने के लिए, यहां एक ऐसा सीएसएस नियम दिया गया है जिसमें :matches स्यूडो क्लास और -apple-system-control-background जैसे WebKit-इंटरनल वैरिएबल और WebKit-internal प्रीप्रोसेसर डायरेक्टिव #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, दोनों में से कोई भी मान्य सीएसएस रंग नहीं है. ये WebKit-इंटरनल सीमैंटिक कलर होते हैं.

इससे पता चलता है कि सीएसएस में स्टैंडर्ड सिमैंटिक सिस्टम कलर हैं. इनकी जानकारी सीएसएस कलर मॉड्यूल लेवल 4 में दी गई है. उदाहरण के लिए, Canvas (<canvas> टैग के साथ भ्रमित न हों), यह ऐप्लिकेशन के कॉन्टेंट या दस्तावेज़ों के बैकग्राउंड के बारे में है. CanvasText, ऐप्लिकेशन के कॉन्टेंट या दस्तावेज़ों में मौजूद टेक्स्ट के लिए है. ये दोनों आपस में जुड़े रहते हैं और इनका इस्तेमाल अलग-अलग नहीं होना चाहिए.

यह तय करने के लिए कि एचटीएमएल एलिमेंट डिफ़ॉल्ट रूप से कैसे रेंडर होने चाहिए, UA स्टाइलशीट अपने मालिकाना हक वाले या स्टैंडर्ड सिमैंटिक सिस्टम के रंगों का इस्तेमाल कर सकती हैं. अगर ऑपरेटिंग सिस्टम गहरे रंग वाले मोड पर सेट है या गहरे रंग वाली थीम का इस्तेमाल करता है, तो CanvasText (या text) को शर्त के साथ सफ़ेद और Canvas (या -apple-system-control-background) को काले रंग पर सेट किया जाएगा. इसके बाद, UA स्टाइलशीट में नीचे दी गई सीएसएस सिर्फ़ एक बार असाइन की जाती है. साथ ही, यह हल्के और गहरे रंग वाले मोड, दोनों को कवर करती है.

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

color-scheme सीएसएस प्रॉपर्टी

सीएसएस का कलर अडजस्टमेंट मॉड्यूल लेवल 1: इस जानकारी में, उपयोगकर्ता एजेंट को अपने-आप कलर अडजस्टमेंट पर मॉडल और कंट्रोल करने की सुविधा मिलती है. इसका मकसद गहरे रंग वाले मोड, कंट्रास्ट अडजस्टमेंट या अपनी पसंद के हिसाब से कलर स्कीम जैसी उपयोगकर्ता प्राथमिकताओं को मैनेज करना होता है.

इसमें बताई गई color-scheme प्रॉपर्टी की मदद से, किसी एलिमेंट को यह बताया जा सकता है कि उसे किन कलर स्कीम के साथ रेंडर करना सही है. ये वैल्यू, उपयोगकर्ता की पसंद के हिसाब से तय की जाती हैं. इसलिए, एक चुनी गई कलर स्कीम होती है, जिससे यूज़र इंटरफ़ेस (यूआई) चीज़ों पर असर पड़ता है. जैसे, फ़ॉर्म कंट्रोल के डिफ़ॉल्ट कलर और स्क्रोल बार. साथ ही, सीएसएस सिस्टम के कलर की इस्तेमाल की गई वैल्यू पर भी असर पड़ता है. फ़िलहाल, इन वैल्यू का इस्तेमाल किया जा सकता है:

  • 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 सीएसएस प्रॉपर्टी के लिए, सीएसएस को पहले डाउनलोड करना (अगर <link rel="stylesheet"> से रेफ़र किया गया है) और पार्स होना ज़रूरी है. पेज के बैकग्राउंड को अपनी पसंद की कलर स्कीम के साथ तुरंत रेंडर करने में उपयोगकर्ता एजेंट की मदद करने के लिए, <meta name="color-scheme"> एलिमेंट में एक 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 को मिलाना

अगर मेटा टैग और सीएसएस प्रॉपर्टी (अगर :root एलिमेंट पर लागू किया गया हो), दोनों का व्यवहार एक जैसा होता है, तो मेरा सुझाव है कि मेटा टैग की मदद से कलर स्कीम तय करें. इससे ब्राउज़र, पसंदीदा स्कीम को तेज़ी से अपना सके.

ऐब्सलूट बेसलाइन पेजों के लिए, सीएसएस के किसी अतिरिक्त नियम की ज़रूरत नहीं है. सामान्य मामले में, आपको हमेशा color-scheme को prefers-color-scheme के साथ जोड़ना चाहिए. उदाहरण के लिए, मालिकाना हक वाले WebKit सीएसएस रंग -webkit-link, जिसे WebKit और Chrome में क्लासिक लिंक नीले रंग rgb(0,0,238) के लिए इस्तेमाल किया गया है, का काली बैकग्राउंड पर उसका कंट्रास्ट अनुपात 2.23:1 का काफ़ी नहीं है. साथ ही, वह WCAG AA और WCAG AAA ज़रूरी शर्तों, दोनों को काम नहीं कर सकता है.

इसे ठीक करने के लिए मैंने Chrome, WebKit, और Firefox में मौजूद गड़बड़ियों के साथ-साथ एचटीएमएल स्टैंडर्ड में मेटा से जुड़ी समस्या को खोल दिया है.

prefers-color-scheme की मदद से इंटरैक्शन करें

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>

पेज पर इनलाइन सीएसएस कोड, सामान्य केस में <fieldset> एलिमेंट के background-color को gainsboro पर सेट करता है. वहीं, अगर उपयोगकर्ता prefers-color-scheme उपयोगकर्ता की पसंद के मीडिया की सुविधा के मुताबिक dark कलर स्कीम को प्राथमिकता देता है, तो darkslategray पर सेट करता है.

<meta name="color-scheme" content="dark light"> एलिमेंट के ज़रिए, पेज ब्राउज़र को बताता है कि वह गहरे रंग वाली और हल्के रंग वाली थीम के साथ काम करता है और गहरे रंग वाली थीम को प्राथमिकता देता है.

ऑपरेटिंग सिस्टम को गहरे रंग वाले मोड पर सेट किया गया है या हल्के रंग वाले मोड पर, इस हिसाब से उपयोगकर्ता एजेंट की स्टाइलशीट के हिसाब से, पूरा पेज गहरे रंग में हल्का दिखेगा या उपयोगकर्ता-एजेंट के स्टाइलशीट के हिसाब से, बैकग्राउंड गहरे रंग में दिखता है. पेज के पैराग्राफ़ के टेक्स्ट या बैकग्राउंड के रंग को बदलने के लिए, डेवलपर की ओर से दिया गया कोई अतिरिक्त सीएसएस शामिल नहीं है.

ध्यान दें कि गहरे रंग वाला मोड चालू है या नहीं, इसके आधार पर <fieldset> एलिमेंट के background-color में क्या बदलाव होता है. ऐसा पेज पर डेवलपर की ओर से दी गई इनलाइन स्टाइलशीट में बताए गए नियमों के मुताबिक होता है. यह gainsboro या darkslategray है.

हल्के रंग वाले मोड में पेज.
हल्के रंग वाला मोड: डेवलपर और उपयोगकर्ता एजेंट के तय किए गए स्टाइल. उपयोगकर्ता एजेंट स्टाइलशीट के मुताबिक, टेक्स्ट का रंग काला और बैकग्राउंड सफ़ेद है. इनलाइन डेवलपर स्टाइलशीट के मुताबिक, <fieldset> एलिमेंट का background-color gainsboro है.
गहरे रंग वाले मोड में मौजूद पेज.
गहरे रंग वाला मोड: डेवलपर और उपयोगकर्ता एजेंट के तय किए गए स्टाइल. उपयोगकर्ता एजेंट स्टाइलशीट के मुताबिक, टेक्स्ट सफ़ेद और बैकग्राउंड काला है. इनलाइन डेवलपर स्टाइलशीट के मुताबिक, <fieldset> एलिमेंट का background-color darkslategray है.

उपयोगकर्ता एजेंट स्टाइलशीट से यह तय होता है कि <button> एलिमेंट कैसा दिखेगा. इसके color को ButtonText सिस्टम के रंग पर सेट किया गया है. साथ ही, इसके background-color और चार border-colorको सिस्टम के रंग ButtonFace पर सेट किया गया है.

हल्के रंग वाले मोड वाला पेज, जो ButtonFace प्रॉपर्टी का इस्तेमाल करता है.
हल्के रंग वाला मोड: background-color और अलग-अलग border-color, ButtonFace सिस्टम के रंग पर सेट किया जाता है.

अब देखें कि <button> एलिमेंट का border-color कैसे बदलता है. border-top-color और border-bottom-color के लिए, कैलकुलेट की गई वैल्यू को rgba(0, 0, 0, 0.847) (काले रंग में) से बदलकर rgba(255, 255, 255, 0.847) (व्हिटिश) किया जाता है. ऐसा इसलिए, क्योंकि उपयोगकर्ता एजेंट, कलर स्कीम के हिसाब से ButtonFace को डाइनैमिक तौर पर अपडेट करता है. ऐसा <button> एलिमेंट के color पर भी लागू होता है, जो उससे जुड़े सिस्टम कलर 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) हैं.

डेमो

Glitch पर डेमो में, बहुत सारे एचटीएमएल एलिमेंट पर लागू किए गए color-scheme के असर को देखा जा सकता है. डेमो में जान-बूझकर डब्ल्यूसीएजी एए और डब्लूसीएजी एएए का उल्लंघन दिखाया गया है. साथ ही, ऊपर चेतावनी में बताए गए लिंक के रंगों के बारे में भी बताया गया है.

हल्के रंग वाले मोड में डेमो.
डेमो को टॉगल करके color-scheme: light पर सेट किया गया.
गहरे रंग वाले मोड में डेमो.
डेमो को टॉगल करके color-scheme: dark किया गया. लिंक के रंगों के साथ WCAG AA और WCAG AAA उल्लंघन का ध्यान रखने दें.

स्वीकार हैं

color-scheme सीएसएस प्रॉपर्टी और इससे जुड़े मेटा टैग को Rune Lillesveen ने लागू किया. रून, सीएसएस कलर अडजस्टमेंट मॉड्यूल लेवल 1 की खास जानकारी का को-एडिटर भी है. Unsplash पर फ़िलिप लियॉन की हीरो इमेज.