انتقل إلى محتوى الدرس
الدرس 06
دورة لغة CSS

التتالي وأولوية التحديد والوراثة في لغة CSSCSS Cascade Specificity and Inheritance

أتقن آلية التتالي في CSS لحسم تعارض الأنماط عبر ترتيب الورود وحساب وزن المحددات بالخانات الثلاث، وتعلّم كيف تعمل الوراثة وكلمات التحكم القياسية بها.
أقسام الدرس
7
الأمثلة
3
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
1
محتوى الدرس
في هذا الدرس 7تصفّح المواضيع

تحمل الكلمة الأولى في اسم لغة أوراق الأنماط المتتالية (Cascading Style Sheets) سرّ المحرك الذكي الذي يمنع الفوضى داخل المتصفح. ففي أي صفحة حقيقية قد ينطبق على فقرة واحدة مثل <p id="lead" class="intro"> أكثر من قاعدة في الوقت نفسه: قاعدة عامة للفقرات، وقاعدة للصنف، وقاعدة للمعرّف، فضلاً عن تنسيق المتصفح الافتراضي.

وعندما تطلب قاعدتان إعطاء الخاصية نفسها قيمتين مختلفتين — كأن تحدد إحداهما color: crimson; وتحدد الأخرى color: navy; — لا يرتبك المتصفح ولا يختار عشوائياً، بل يمرر القواعد المتنافسة عبر مصفاة دقيقة تُسمى خوارزمية التتالي (The Cascade) تفحص بالترتيب: مصدر النمط، ثم وزن التحديد، وأخيراً ترتيب الورود ليخرج فائز واحد فقط.

مخطط من ثلاث مراحل يوضح كيف تحسم خوارزمية التتالي في CSS التعارض عبر مصدر الأنماط ثم وزن التحديد ثم ترتيب الورود

قبل الدخول في حساب أوزان المحددات، ينظر المتصفح أولاً إلى مصدر الأنماط (Style Origin). فكل متصفح يمتلك ورقة تنسيق افتراضية مدمجة تُسمى User-Agent Stylesheet تمنح وسوم HTML الخام تمايزاً مبدئياً كتكبير <h1> عن <p>. وبمجرد أن تكتب أنت أي قاعدة في أنماط المطور (Author Styles) — خارجيةً كانت أم داخلية أم سطرية — فإنها تتفوق تلقائياً على افتراضات المتصفح.

أما حين تتنافس قاعدتان من أنماط المطور ولهما القوة نفسها تماماً، فيحتكم المتصفح إلى ترتيب الورود (Source Order)؛ أي تفوز القاعدة المكتوبة أخيراً في التسلسل من الأعلى إلى الأسفل، سواء داخل ملف .css واحد أو بحسب ترتيب ظهور وسوم <link> و <style> داخل <head>.

CSS
.status-banner {
  color: crimson;
  font-size: 22px;
}
/* Same selector weight: later color wins */
.status-banner {
  color: darkgreen;
}

ماذا يحدث لو كتبت قاعدة للصنف .alert في السطر الأول من الملف، ثم كتبت قاعدة عامة للفقرة p في السطر الأخير؟ سيفوز الصنف .alert رغم وجوده في الأعلى! والسبب هو أولوية التحديد (Specificity) التي تقيس مدى دقة المحدد، فالمحدد الأدق يهزم المحدد الأعم دائماً بغض النظر عن ترتيب الأسطر:

  1. المحدد الشامل (*): الدرجة الأدنى بوزن صفري، وينطبق على جميع العناصر بلا تخصيص.
  2. محدد اسم الوسم (p أو h1): يستهدف نوع العنصر عموماً ويتفوق على المحدد الشامل.
  3. محدد الصنف (.intro): أكثر تخصيصاً من اسم الوسم فيتغلب على p و h1 حتى لو سَبَقَهما في الملف.
  4. محدد المعرّف الفريد (#main-banner): يستهدف عنصراً واحداً بعينه فيتفوق على الأصناف والوسوم معاً.
  5. النمط السطري المباشر (style="..."): يُكتب على الوسم مباشرةً فيتفوق على جميع محددات ملف التنسيق الخارجي والداخلي.
HTML
<style>
  #hero-note { color: navy; }
  .card-note { color: teal; }
  p { color: crimson; }
</style>
<p id="hero-note" class="card-note">ID wins!</p>
<p class="card-note">Class beats tag!</p>
<p>Plain tag uses crimson.</p>

يحسب المتصفح وزن أي محدد رياضياً عبر ثلاث خانات مستقلة تُكتب بالصورة (ID, Class, Element):

  • الخانة الأولى للمعرّفات (ID): يُضاف إليها 1 لكل معرّف مثل #hero-note.
  • الخانة الثانية للأصناف (Class): يُضاف إليها 1 لكل صنف مثل .card-note.
  • الخانة الثالثة للوسوم (Element): يُضاف إليها 1 لكل اسم وسم مثل p أو h1، بينما يأخذ * صفراً في الخانات الثلاث.

تُقارن الخانات من اليسار إلى اليمين خانةً بخانة لا كعدد عشري واحد؛ فوجود 1 في خانة المعرّف (1, 0, 0) يحسم الفوز فوراً ولو نافسته عشرون فئة صنفية (0, 20, 0)!

طريقة الاستهدافمثال عمليالوزن (ID, Class, Element)مرتبة القوة
المحدد الشامل*(0, 0, 0)وزن صفري مبدئي
محدد الوسمp أو h1(0, 0, 1)يتفوق على المحدد الشامل
محدد الصنف.card-note(0, 1, 0)يتفوق على أي عدد من الوسوم
محدد المعرّف#hero-note(1, 0, 0)يتفوق على أي عدد من الأصناف
السمة السطريةstyle="color: navy;"طبقة سطرية تعلو (1, 0, 0)تتفوق على قواعد ملف التنسيق

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

  • خصائص نصية موروثة تلقائياً: تنتقل خصائص النصوص مثل اللون color وحجم الخط font-size تلقائياً من العنصر الأب (مثل <body> أو <div>) إلى جميع الأبناء والأحفاد داخله ما لم يمتلك الابن قاعدة مباشرة تخصه.
  • خصائص هيكلية غير موروثة: لا تنتقل خصائص صندوق العنصر (مثل الأبعاد والمساحات والخلفيات والإطارات المحيطة) إلى الأبناء تلقائياً؛ لأن وراثتها كانت ستؤدي إلى تكرار إطار الحاوية الأم حول كل فقرة وعبارة بداخلها!

تقبل جميع خصائص CSS أربع كلمات مفتاحية قياسية عالمية تمنحك تحكماً صريحاً في فرض الوراثة أو التراجع عن التنسيق عند الحاجة:

الكلمة المفتاحيةالسلوك الدقيق في المتصفحمتى نستخدمها عملياً؟
inheritتجبر العنصر على نسخ القيمة المحسوبة من عنصره الأب المباشرإلزام عنصر فرعي بمطابقة لون الحاوية الأم بدلاً من لونه الخاص
initialتعيد الخاصية إلى القيمة الابتدائية المجردة في مواصفة اللغةإرجاع خاصية غير موروثة إلى نقطة الصفر المعيارية للمواصفة
unsetتعمل عمل inherit للخصائص الموروثة وعمل initial لغير الموروثةمسح تنسيق المطور بذكاء وفق الطبيعة الفطرية للخاصية
revertتلغي أنماط المطور وتعود إلى نمط المتصفح الافتراضي للوسماستعادة الحجم الطبيعي لعنوان <h1> كما يعرضه المتصفح أصلاً
HTML
<style>
  .parent-box { color: navy; font-size: 20px; }
  p { color: crimson; }
  .match-parent { color: inherit; }
  .restore-heading { font-size: revert; }
</style>
<div class="parent-box">
  <h1 class="restore-heading">Heading Size Reverted</h1>
  <p>Paragraph uses crimson.</p>
  <p class="match-parent">Forced to inherit navy!</p>
</div>

عندما تكتب قاعدة تنسيق ولا ترى أثرها على العنصر، لا تلجأ إلى التجربة العشوائية؛ بل انقر بزر الفأرة الأيمن واختر فحص العنصر (Inspect) لقراءة قرار التتالي مباشرةً عبر لوحتين متكاملتين في DevTools:

  • تبويب Styles: يرتب جميع القواعد المطابقة للعنصر من الأقوى في الأعلى (element.style ثم المعرّف ثم الصنف ثم الوسم) نزولاً إلى أقسام الوراثة Inherited from في الأسفل، ويضع خطاً مشطوباً في منتصف كل خاصية خاسرة لتعرف فوراً أنها طابقت العنصر لكن قاعدة أقوى غلبتها.
  • تبويب Computed: يعرض القيمة النهائية المحسوبة الفائزة لكل خاصية بعد انتهاء جميع مراحل التتالي والوراثة، مع إمكانية فتح السهم بجوار الخاصية للقفز إلى رقم السطر الفائز مباشرةً.
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تعرّفت في هذا الدرس على آلية التتالي وحساب أولوية المحددات بالخانات الثلاث (ID, Class, Element) ودور ترتيب الورود والوراثة وكلمات التحكم القياسية الأربع (inherit و initial و unset و revert) وتشخيصها في DevTools. وفي الخطوة التالية ستدرس قاعدة الأولوية القصوى في لغة CSS لتفهم متى وكيف تُكسر الأولوية المعتادة وكيف تتجنب فوضى الصيانة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 The Cascade خوارزمية التتالي
الخوارزمية القياسية التي يطبقها المتصفح لحسم التعارض بين التصريحات المتنافسة عبر فحص مصدر النمط ثم وزن التحديد ثم ترتيب الورود.
للمراجعة
02 Specificity أولوية التحديد
مقياس رياضي من ثلاث خانات (المعرّف، الصنف، الوسم) يحدد درجة دقة المحدد ويفاضل بين القواعد المتعارضة.
للمراجعة
03 Property Inheritance وراثة الخصائص
انتقال القيم المحسوبة لبعض الخصائص النصية كاللون وحجم الخط تلقائياً من العنصر الأب إلى العناصر الأبناء بداخله.
للمراجعة
04 User-Agent Stylesheet ورقة أنماط المتصفح الافتراضية
مجموعة التنسيقات الأساسية المدمجة داخل المتصفح لمنح عناصر الصفحة مظهراً مقروءاً قبل تطبيق أنماط المطور.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات3

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 3 مفهومةأول بطاقة، أول خطوة
01 UA UA
User Agent
برنامج عميل الويب (المتصفح) الذي يحلل المستندات ويزود العناصر بورقة الأنماط الافتراضية الأساسية.
للمراجعة
02 DOM DOM
Document Object Model
شجرة عناصر المستند الهرمية التي تنتقل عبر علاقات الأب والابن فيها خصائص التنسيق الموروثة.
للمراجعة
03 CSSOM CSSOM
CSS Object Model
النموذج الهيكلي لقواعد الأنماط في الذاكرة والذي يدمجه المتصفح مع شجرة العناصر لتنفيذ خوارزمية التتالي.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح مثال هرم الأولوية في محرر التجريب وانقل قاعدة الوسم p إلى أعلى الملف، وتحقّق من بقاء فوز المعرّف والصنف كما هو دون تأثر بترتيب الأسطر.

  2. افتح مثال كلمات التحكم بالوراثة في محرر التجريب وبدّل القيمة revert في صنف العنوان إلى initial لملاحظة كيف يتقلص حجم العنوان بدلاً من العودة لحجم المتصفح الافتراضي.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

إذا استخدمت قاعدتان للمطور المحدد نفسه .notice وحددتا لونين مختلفين، فأي تصريح يفوز؟

02

أي محدد من المحددات التالية يمتلك أعلى وزن تحديد داخل ملف التنسيق؟

03

عشرة أصناف مجتمعة بوزن (0, 10, 0) تتفوق في الأولوية على معرّف فريد واحد بوزن (1, 0, 0).

04

ما وزن التحديد بالخانات الثلاث (ID, Class, Element) للمحدد الشامل *؟

05

تنتقل خصائص النصوص مثل اللون وحجم الخط بالوراثة التلقائية إلى العناصر الأبناء عند غياب قاعدة مباشرة تستهدف الابن.

06

أي كلمة مفتاحية في CSS تلغي تنسيق المطور وتعيد الخاصية إلى السلوك الافتراضي للمتصفح الخاص بذلك الوسم؟

07

لماذا تتغلب القاعدة الشاملة * { color: slategray; } على اللون الأزرق الداكن الموروث للفقرة الابنة من أب يحمل المعرّف #container؟

08

كيف يميز تبويب Styles في أدوات المطور بصرياً الخاصية التي طابقت العنصر لكنها خسرت أمام قاعدة أقوى؟