تعريف متغير CSS واستخدامه
متغير CSS، واسمه الرسمي الخاصية المخصصة (custom property)، خاصية يبدأ اسمها بـ --. عرّفه مرة واحدة، عادةً على :root كي ترثه الصفحة كلها، واقرأه في أي مكان عبر var().
غيّر --brand إلى #16a34a وسيتغير حد البطاقة والزر معًا. هذه هي الفكرة كلها: قيمة واحدة، ومكان واحد لتغييرها. وتعمل المتغيرات أيضًا مع calc()، كما يظهر في الحشو الجانبي للزر.
الصيغة
:root {
--name: value; /* declare */
}
.element {
color: var(--name); /* use */
color: var(--name, #111827); /* use, with a fallback */
padding: calc(var(--space) * 2); /* compute with it */
}
| القاعدة | التفاصيل |
|---|---|
| الاسم | يبدأ بـ -- ثم حروف أو أرقام أو - أو _. حساس لحالة الأحرف: --Brand ليس --brand. |
| القيمة | أي شيء تقريبًا: لون، طول، قائمة، سلسلة نصية. لا تُفحص إلا عند استخدامها. |
| مكان التعريف | أي قاعدة. :root للقيم العامة، ومحدد المكوّن للقيم المحلية. |
| الوراثة | الخصائص المخصصة تُورَّث، فيرى الابن قيم أسلافه. |
أين تعمل var() | في قيم الخصائص فقط، لا في المحددات ولا أسماء الخصائص ولا شروط @media. |
يطابق :root العنصر <html>. يُستخدم بدل html لأن خصوصيته بمستوى الفئة، ولأنه يدل عرفًا على «الإعدادات العامة».
النطاق: تجاوز المتغير لكل مكوّن
لأن المتغيرات تُورَّث، فإن إعادة تعريف متغير على عنصر تغيّره لذلك العنصر ولكل ما بداخله. القاعدة التي تستخدم المتغير تبقى كما هي.
الأشكال المختلفة تضبط المتغير فقط، ولا تضبط الحد نفسه أبدًا. إضافة شكل رابع تتطلب سطرًا واحدًا.
القيم الاحتياطية
تستخدم var(--name, fallback) القيمة الاحتياطية حين لا يكون المتغير معرّفًا على العنصر أو أي من أسلافه. كل ما بعد الفاصلة الأولى هو القيمة الاحتياطية، لذلك يمكن أن تحتوي هي نفسها على فواصل (var(--font, Georgia, serif))، ويمكن أن تكون var() أخرى.
تغيير المتغيرات بـ JavaScript: مبدّل السمات
يستطيع JavaScript ضبط متغير على أي عنصر عبر style.setProperty(). اضبطه على document.documentElement (العنصر <html>) وستتبعه الصفحة كلها. النمط الأكثر شيوعًا هو تبديل فئة تعيد تعريف المتغيرات:
اقرأ قيمة المتغير عبر getComputedStyle(element).getPropertyValue('--text'). لاحظ أن setProperty تكتب نمطًا مضمّنًا على <html>، وهو يتغلب على الفئة .dark، لذلك بعد الضغط على الزر الثاني يبقى لون النص ثابتًا في السمتين إلى أن تُزال القيمة المضمّنة عبر root.style.removeProperty('--text').
تمرير القيم من HTML
المتغير في السمة style هو أنظف طريقة لتسليم بيانات خاصة بكل عنصر إلى ملف الأنماط. يبقى التصميم في CSS، وHTML يوفر رقمًا فقط.
تحوّل calc(var(--value) * 1%) الرقم المجرد إلى نسبة مئوية. ويمكن للمتغيرات أيضًا أن تتغير داخل استعلام وسائط: @media (min-width: 900px) { :root { --space: 20px; } } تجعل كل مسافة تقرأ --space تكبر على الشاشات العريضة.
فخ القيمة غير الصالحة
لا يستطيع المتصفح أن يعرف مسبقًا إن كان المتغير يحمل قيمة صالحة للخاصية التي تستخدمه. وحين لا تكون صالحة، لا تعود الخاصية إلى التصريح السابق في القاعدة، بل تصبح غير صالحة وقت حساب القيمة (invalid at computed-value time) وتتصرف كأنها مضبوطة على unset: الخصائص الموروثة تأخذ قيمة الأب، والباقي يأخذ قيمته الابتدائية.
يرث النص 16px من <body>، وتعود border-width إلى قيمتها الابتدائية medium، التي ترسمها المتصفحات بعرض 3px. من دون متغيرات يُسقط التصريح غير الصالح ويبقى التصريح الذي قبله؛ أما مع المتغيرات فقد فات الأوان لذلك. القيمة الاحتياطية لا تساعد حين يكون المتغير معرّفًا لكن خاطئًا: فهي مخصصة للمتغير غير المعرّف فقط.
الفرق بين متغيرات CSS ومتغيرات Sass
| متغيرات CSS | متغيرات Sass | |
|---|---|---|
| الصيغة | --brand: #2563eb; وvar(--brand) | $brand: #2563eb; |
| متى تُحسب | في المتصفح، مباشرة | وقت البناء، وتختفي من الناتج |
| تغييرها لكل عنصر | نعم، بالوراثة | لا |
| تغييرها بفئة أو استعلام وسائط | نعم | لا |
| تغييرها من JavaScript | نعم | لا |
| استخدامها في المحددات أو شروط الوسائط | لا | نعم |
يعمل الاثنان معًا: كثير من المشاريع تستخدم Sass لمنطق وقت البناء وتُخرج متغيرات CSS لكل ما يمكن تغيير سمته.
أخطاء شائعة
- نسيان الشرطتين. لا يعمل
var(brand)، ولا--brandالمعرّف بالشكل-brand. - استخدام متغير في استعلام وسائط.
@media (min-width: var(--bp))غير صالح. شروط الوسائط تحتاج إلى قيم حرفية. - توقع بقاء التصريح السابق مع متغير غير صالح. لا يبقى؛ راجع الفخ أعلاه.
- خلط الوحدات بطريقة خاطئة.
--gap: 10;ثمmargin: var(--gap)pxلا تنتج10px. استخدمcalc(var(--gap) * 1px)أو خزّن10px. - التعريف على العنصر الخطأ. المتغير المعرّف على
.cardغير مرئي لإخوته أو لأبيه؛ عرّف القيم المشتركة على:root.
الأسئلة الشائعة
كيف أعرّف متغيرًا في CSS؟
اكتب خاصية يبدأ اسمها بشرطتين داخل قاعدة، عادةً :root للقيمة العامة: :root { --brand: #2563eb; }. اقرأها في أي مكان عبر var(--brand)، مثلًا color: var(--brand);.
ما هو :root في CSS؟
:root فئة زائفة تطابق العنصر الجذر للمستند، وهو <html> في صفحة HTML. المتغيرات المعرّفة هناك يرثها كل عنصر. خصوصيتها بمستوى الفئة، فتتغلب على المحدد html العادي.
كيف أضع قيمة افتراضية لمتغير CSS؟
مرّر وسيطًا ثانيًا إلى var(): color: var(--accent, #2563eb);. تُستخدم القيمة الاحتياطية حين لا يكون --accent معرّفًا على العنصر أو أسلافه. ولا تُستخدم حين يكون المتغير معرّفًا بقيمة غير صالحة للخاصية.
كيف أغيّر متغير CSS بـ JavaScript؟
استدعِ setProperty على نمط العنصر: document.documentElement.style.setProperty('--brand', '#16a34a'). كل قاعدة تستخدم var(--brand) تتحدث فورًا. اقرأ القيمة الحالية عبر getComputedStyle(el).getPropertyValue('--brand').
ما الفرق بين متغيرات CSS ومتغيرات Sass؟
متغيرات Sass تُستبدل بقيمها عند ترجمة ملف الأنماط، فلا يمكن أن تتغير في المتصفح. أما متغيرات CSS فتعيش في المتصفح: تُورَّث، ويمكن أن تختلف من عنصر لآخر، وتستجيب لاستعلامات الوسائط والفئات، ويمكن تغييرها من JavaScript.
هل أسماء متغيرات CSS حساسة لحالة الأحرف؟
نعم. --Brand و--brand متغيران مختلفان، على عكس أسماء الخصائص العادية مثل color التي لا تتأثر بحالة الأحرف.