स्मूथ लाइट और डार्क मोड ट्रांज़िशन: टोकन, CSS और मोशन
एक प्रकाश/अंधेरे थीम स्विच का निर्माण कैसे करें जो सिस्टम सेटिंग का सम्मान करता है, लोड पर फ्लैश से बचाता है, मूल नियंत्रण को स्टाइल करता है और पहुंच को नुकसान पहुंचाए बिना एनिमेट करता है।
कोर टेकअवे
सिमेंटिक टोकन पर थीम बनाएं, डिफ़ॉल्ट रूप से प्राथमिकता-रंग-स्कीम के साथ सिस्टम सेटिंग का पालन करें, लोगों को इसे ओवरराइड करने दें, और रंग-स्कीम प्रॉपर्टी सेट करें ताकि फॉर्म नियंत्रण और स्क्रॉलबार मेल खा सकें। फ्लैश से बचने के लिए पेज रेंडर होने से पहले सेव की गई थीम लागू करें। स्विच एनीमेशन को छोटा रखें, जैसे त्वरित क्रॉस-फ़ेड या व्यू ट्रांज़िशन, और कम गति चालू होने पर इसे छोड़ दें।
सिस्टम सेटिंग से प्रारंभ करें
प्रेफरेंस-कलर-स्कीम मीडिया फीचर आपको बताता है कि उपयोगकर्ता ने अपने ऑपरेटिंग सिस्टम से लाइट या डार्क थीम के लिए पूछा है। इसे डिफ़ॉल्ट के रूप में उपयोग करें, और एक इन-ऐप स्विच जोड़ें जो इसे ओवरराइड करता है और याद रखा जाता है।
टोकन के साथ थीम, ओवरराइड नहीं
रंगों को सिमेंटिक टोकन (सतह, पाठ, सीमा, उच्चारण) के रूप में परिभाषित करें और प्रत्येक विषय को अपने स्वयं के मान दें, आमतौर पर मूल तत्व पर CSS कस्टम गुणों के रूप में। फिर विषयों के बीच घटक कभी नहीं बदलते; केवल टोकन मान ही काम करते हैं। यह वही त्रि-स्तरीय टोकन दृष्टिकोण है जिसका उपयोग मल्टी-ब्रांड डिज़ाइन सिस्टम के लिए किया जाता है।
देशी नियंत्रणों को मत भूलना
MDN बताता है कि कलर-स्कीम प्रॉपर्टी ब्राउज़र को बताती है कि तत्व किस स्कीम का समर्थन करता है, जो फॉर्म नियंत्रण, स्क्रॉलबार और अन्य अंतर्निहित यूआई के डिफ़ॉल्ट रंगों को बदलता है। इसके बिना, एक डार्क पेज चमकीले सफेद इनपुट और स्क्रॉलबार दिखा सकता है।
लोड पर फ़्लैश से बचें
यदि पेज रेंडर होने के बाद सहेजी गई थीम JavaScript द्वारा लागू की जाती है, तो लोगों को गलत थीम का फ्लैश दिखाई देता है। स्टाइलशीट के रंगने से पहले, दस्तावेज़ शीर्ष में एक छोटी इनलाइन स्क्रिप्ट या सर्वर-रेंडर विशेषता के साथ इसे यथाशीघ्र लागू करें।
स्विच को सावधानी से एनिमेट करें
एक छोटा क्रॉस-फ़ेड, लगभग 150 से 250 मिलीसेकंड, परिवर्तन को जानबूझकर महसूस कराता है। प्रत्येक तत्व पर प्रत्येक रंग गुण को परिवर्तित करने से बचें, जो बड़े पृष्ठों पर धीमा हो सकता है; एकल दृश्य ट्रांज़िशन स्नैपशॉट अक्सर आसान होता है। एक लेबल या टूलटिप के साथ टॉगल को स्वयं स्पष्ट करें, और कम गति चालू होने पर एनीमेशन हटा दें।
उत्पादन कार्यान्वयन स्निपेट
/* Tokens per theme */
:root { color-scheme: light dark; --surface: #ffffff; --text: #121212; }
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) { --surface: #121212; --text: #f2f2f2; }
}
:root[data-theme="dark"] { color-scheme: dark; --surface: #121212; --text: #f2f2f2; }
:root[data-theme="light"] { color-scheme: light; }
body { background: var(--surface); color: var(--text); }
// Switch with a View Transition where supported, instantly otherwise
function setTheme(theme) {
const apply = () => { document.documentElement.dataset.theme = theme; localStorage.setItem('theme', theme); };
const reduce = matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!document.startViewTransition || reduce) return apply();
document.startViewTransition(apply);
}याद रखने योग्य कुंजी Principle
- प्राथमिकताएँ-रंग-योजना के लिए डिफ़ॉल्ट; लोगों को इसे अनदेखा करने दें और इसे याद रखने दें
- सिमेंटिक टोकन वाली थीम, प्रति-घटक ओवरराइड नहीं
- रंग-योजना सेट करें ताकि मूल नियंत्रण मेल खाएँ
- पहले पेंट से पहले सेव की गई थीम को लागू करें
- स्विच एनीमेशन को छोटा रखें और कम गति का सम्मान करें
अक्सर पूछे जाने वाले प्रश्नों
स्रोत
- prefers-color-scheme — MDN वेब डॉक्स
- color-scheme — MDN वेब डॉक्स
- View Transition API — MDN वेब डॉक्स