الشلال

بودكاست CSS - 004: The Cascade

الاختصار CSS يعني أوراق الأنماط المتتالية. الشلال هو خوارزمية لحل التعارضات حيث تنطبق قواعد CSS متعددة على عنصر HTML. هذا هو سبب ظهور نص الزر بتنسيق CSS التالي باللون الأزرق.

button {
  color: red;
}

button {
  color: blue;
}

ويساعدك فهم خوارزمية الشلال في فهم الطريقة التي يحل بها المتصفح تعارضات مثل هذه. تنقسم خوارزمية الشلال إلى 4 مراحل منفصلة.

  1. موضع وترتيب الظهور: ترتيب ظهور قواعد CSS
  2. الدقة: خوارزمية تحدّد أداة اختيار لغة CSS الأكثر تطابقًا.
  3. المصدر: ترتيب ظهور CSS ومصدره، سواء كان ذلك نمط المتصفح أو CSS من إضافة متصفح أو CSS التي أنشأتها
  4. الأهمية: يتم ترجيح بعض قواعد CSS أكثر من غيرها، خصوصًا مع نوع القاعدة !important

موضع الظهور وترتيبه

تراعي السلسلة المتتالية ترتيب ظهور قواعد CSS وكيفية ظهورها بينما تحسب درجة دقة التعارض.

يعد العرض التوضيحي مباشرةً في بداية هذا الدرس هو المثال الأكثر وضوحًا للموضع. هناك قاعدتان تحتويان على أدوات اختيار متطابقة تمامًا، وبالتالي، يتم الفوز بالقاعدة الأخيرة التي يتم الإعلان عنها.

ويمكن أن تأتي الأنماط من مصادر مختلفة على صفحة HTML، مثل علامة <link> وعلامة <style> مضمّنة وCSS مضمَّنة كما هو محدّد في سمة style للعنصر.

إذا كان لديك <link> يتضمّن CSS في أعلى صفحة HTML، سيكون هناك <link> آخر يتضمن CSS في أسفل صفحتك: العنصر <link> السفلي في الجزء السفلي سيكون الأكثر تحديدًا. ويحدث ذلك أيضًا مع عناصر <style> المضمَّنة. تصبح أكثر تحديدًا، كلما تنقلت إلى أسفل الصفحة.

الزر ذو خلفية زرقاء، على النحو المحدّد في CSS المضمّنة في العنصر <link />. قاعدة CSS التي تم ضبطها لتكون داكنة هي في ورقة أنماط مرتبطة ثانية ويتم تطبيقها بسبب موضعها اللاحق.

ينطبق هذا الترتيب أيضًا على عناصر <style> المضمّنة. وإذا تم الإعلان عنها قبل <link>، سيتم توفير أقصى درجات الدقة في CSS لورقة الأنماط المرتبطة.

يتم الإعلان عن العنصر <style> في <head>، بينما يتم الإعلان عن العنصر <link /> في <body>. هذا يعني أنّه أكثر تحديدًا من العنصر <style>.

إنّ السمة style المضمّنة التي تتضمّن CSS المضمّنة فيها ستلغي جميع سمات CSS الأخرى، بغض النظر عن موضعها، ما لم يتم تحديد !important في البيان.

ينطبق الموضع أيضًا بترتيب قاعدة CSS. في هذا المثال، ستكون خلفية العنصر أرجوانية لأنه تم الإعلان عن السمة background: purple في النهاية. بما أنّه قد تم تحديد الخلفية الخضراء قبل الخلفية الأرجوانية، سيتجاهلها المتصفّح الآن.

.my-element {
  background: green;
  background: purple;
}

يمكن أن تكون القدرة على تحديد قيمتَين للسمة نفسها طريقة بسيطة لإنشاء عناصر احتياطية للمتصفحات التي لا تتيح قيمة معيّنة. في هذا المثال التالي، تم الإعلان عن font-size مرتين. إذا كان المتصفّح يتيح استخدام clamp()، سيتم تجاهل بيان font-size السابق. إذا كان المتصفّح غير متوافق مع clamp()، سيتم الالتزام بالبيان الأولي وسيكون حجم الخط 1.5 ميل

.my-element {
  font-size: 1.5rem;
  font-size: clamp(1.5rem, 1rem + 3vw, 2rem);
}

التحقّق من استيعابك

اختبر معلوماتك عن الشلال

إذا كان لديك ترميز HTML التالي على صفحتك:

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="/styles.css" />
  </head>
  <body>
    <button>I am a button</button>
    <style>
      button {
        background: pink;
      }
    </style>
  </body>
</html>

في styles.css، توجد قاعدة CSS التالية:

button {
  background: yellow;
}

ما لون خلفية الزر؟

زهري
يقع مصدر <style> المضمَّن في أسفل الصفحة عن العلامة <link>، لذلك على الرغم من أنّ قيمة button هي نفسها، يمكنك تحقيق ذلك من خلال موضع قاعدة النمط.
باللون الأصفر
بالنسبة إلى مستند HTML، ربما تمت قراءة خلفية الزر الأصفر أولاً، ولكن تم اكتشاف قاعدة جديدة بنفس الخصوصية لاحقًا، مما يجعل هذه القاعدة لا تنطبق على الزر.

الدقة

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

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

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

<h1 class="my-element">Heading</h1>
.my-element {
  color: red;
}

h1 {
  color: blue;
}

تجعل id خدمة CSS أكثر تحديدًا، لذا ستحل الأنماط المطبّقة على المُعرّف محل تلك الأنماط المطبَّقة بالعديد من الطرق الأخرى. لهذا السبب، من غير المستحسن بشكل عام إرفاق الأنماط بالسمة id. قد يؤدي ذلك إلى صعوبة استبدال هذا النمط بشيء آخر.

الدقة تراكمية

كما ستعرف في الدرس التالي، يتم منح كل نوع من المحددات نقاطًا تشير إلى مدى خصوصيتها، وتتم إضافة النقاط لجميع المحددات التي استخدمتها لاستهداف عنصر معًا. وهذا يعني أنّه إذا استهدفت عنصرًا باستخدام قائمة أدوات اختيار مثل a.my-class.another-class[href]:hover، سيصعب استبداله بأخرى CSS. لهذا السبب، وللمساعدة في جعل CSS أكثر قابلية لإعادة الاستخدام، ننصحك بجعل أدوات الاختيار بسيطة قدر الإمكان. استخدم الخصوصية كأداة للحصول على العناصر عند الحاجة، ولكن فكر دائمًا في إعادة بناء قوائم المحددات الطويلة والمحددة، إن أمكن.

الأصل

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

  1. الأنماط الأساسية لوكيل المستخدم: هذه هي الأنماط التي يطبقها المتصفح على عناصر HTML افتراضيًا.
  2. أنماط المستخدمين المحليين: يمكن أن تأتي هذه الإعلانات من مستوى نظام التشغيل، مثل حجم الخط الأساسي، أو تفضيل الحركة المخفّضة. ويمكن أن يكون مصدرها إضافات المتصفّح أيضًا، مثل إضافة متصفّح تتيح للمستخدم كتابة لغة CSS مخصّصة لصفحة ويب.
  3. CSS الذي تم إنشاؤه. خدمة مقارنة الأسعار (CSS) التي تنشئها
  4. تاريخ التأليف: !important. أي !important تتم إضافتها إلى البيانات التي تم إنشاؤها:
  5. أنماط المستخدمين المحليين !important: أي علامة !important تأتي من مستوى نظام التشغيل أو CSS على مستوى إضافة المتصفّح.
  6. وكيل المستخدم !important. أي !important يتم تحديدها في خدمة مقارنة الأسعار (CSS) التلقائية التي يوفّرها المتصفّح.
عرض توضيحي مرئي لترتيب الأصول كما هو موضّح أيضًا في القائمة.

إذا كان لديك نوع قاعدة !important في خدمة مقارنة الأسعار (CSS) التي كتبتها وكان المستخدم لديه نوع قاعدة !important في CSS المخصّص له، من الأفضل CSS؟

التحقّق من استيعابك

اختبِر معلوماتك حول أصول الشلال

اختبِر معلوماتك حول أصول التسلسلات، وفكِّر في قواعد الأنماط التالية من مصادر مختلفة:

نمط وكيل المستخدم

h1 { margin-block-start: 0.83em; }

حذاء طويل

h1 { margin-block-start: 20px; }

أنماط مؤلف الصفحة

h1 { margin-block-start: 2ch; }

@media (max-width: 480px) {
  h1 { margin-block-start: 1ch; }
}

النمط المخصص للمستخدم

h1 { margin-block-start: 2rem !important; }

بعد ذلك، ضع في الاعتبار محتوى HTML التالي:

<h1>Lorem ipsum</h1>

ما هو آخر margin-block-start من h1؟

20px
يعتبر التمهيد جزءًا من الأصل المؤلف، والذي لا يبقى على نمط المستخدم المحلي المهم.
0.83 مليار
يفقد أصل نمط وكيل المستخدم نمط المستخدم المحلي المهم.
2 عين
هذا النمط المخصّص لمستخدم !important يتضمّن المصدر الأكثر تحديدًا.
2تش
نمط المؤلف هذا هو جزء من الأصل المكتوب، والذي يفقد نمط المستخدم المحلي المهم.
ساعة واحدة
نمط المؤلف هذا هو جزء من الأصل المكتوب، والذي يفقد نمط المستخدم المحلي المهم.

مدى الأهمية

لا يتم احتساب جميع قواعد CSS بشكل متطابق مع بعضها البعض، أو تُعطى نفس الدقة مثل بعضها البعض.

يكون ترتيب الأهمية، من الأقل أهمية إلى الأكثر أهمية، كما يلي:

  1. نوع القاعدة العادي، مثل font-size أو background أو color
  2. نوع قاعدة واحد (animation)
  3. نوع قاعدة !important (يتبع ترتيب المصدر نفسه)
  4. نوع قاعدة واحد (transition)

تكون أنواع قواعد النقل والرسوم المتحركة النشطة أهمية أكبر من القواعد العادية. في حال الانتقالات ذات أهمية أعلى من !important نوع من القواعد. وذلك لأنه عندما تصبح الرسوم المتحركة أو الانتقال نشطين، فإن سلوكها المتوقع هو تغيير الحالة المرئية.

استخدام أدوات مطوري البرامج لمعرفة سبب عدم تطبيق بعض CSS

ستعرض "أدوات مطوري البرامج في المتصفّح" عادةً جميع صفحات CSS التي يمكن أن تطابق عنصرًا ما، مع تلك التي لا يتم استخدامها المشطوبة.

صورة لأدوات مطوّري البرامج في المتصفّح تم استبدال CSS بها

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

التحقّق من استيعابك

اختبر معلوماتك عن الشلال

يمكن استخدام The Cascade مع...

حل التعارضات عند تطبيق أنماط متعددة على عنصر.
وهذا أحد أهدافها الأساسية، وهو حلّ النزاعات.
ضمان وجود قيمة نمط واحدة فقط لكل خاصية في وقت الرسم
يمكن أن يكون النص لونًا واحدًا فقط، والتتالي هي طريقة لتحديد اللون الذي يجب أن يكون عليه.
قواعد نمط التسجيل والترجيح.
يُعد التسجيل والترجيح جزءًا من مرحلة الفرز في The Cascade.
سمات نمط الفرز والتصفية.
الفرز والتصفية هما مرحلتان من مرحلتي The Cascade للمساعدة في فهم جوانب حل النزاعات.

المراجِع