التحولات السلسة بين الوضع الفاتح والداكن: الرموز المميزة و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 مستندات الويب