الحالات والعناصر الزائفة في CSS: nth-child و before و after
تعرفت في درس المحددات على :hover و :focus. هذه مجرد بداية. بالمحددات الزائفة تستطيع أن تلوّن الصفوف الزوجية في جدول، وتختار كل العناصر إلا واحداً، وتضيف علامة قبل كل عنوان، وكل ذلك دون أن تغيّر سطراً في HTML. في هذا الدرس ستتعلم أهمها.
الفرق بين النوعين
Section titled “الفرق بين النوعين”- الحالة الزائفة (Pseudo-class): تُكتب بنقطتين واحدة
:، وتختار عنصراً موجوداً وهو في وضع معين أو ترتيب معين. - العنصر الزائف (Pseudo-element): يُكتب بنقطتين مزدوجتين
::، ويختار جزءاً من العنصر، أو ينشئ جزءاً لم يكن موجوداً في HTML.
الاختيار بالترتيب
Section titled “الاختيار بالترتيب”| المحدد | يختار |
|---|---|
:first-child |
العنصر إذا كان أول أبناء أبيه |
:last-child |
العنصر إذا كان آخر أبناء أبيه |
:nth-child(3) |
العنصر الثالث |
:nth-child(odd) |
العناصر الفردية: الأول والثالث والخامس |
:nth-child(even) |
العناصر الزوجية: الثاني والرابع والسادس |
:nth-child(3n) |
كل ثالث عنصر: الثالث والسادس والتاسع |
/* تخطيط الجدول: صف بلون وصف بلون */tr:nth-child(even) { background: #f2f2f7;}
/* خط فاصل تحت كل عنصر ما عدا الأخير */li { border-bottom: 1px solid #ddd;}li:last-child { border-bottom: none;}تخيّل طابور الصباح: المعلم يقول «الطالب الأول يتقدم»، أو «كل طالب ترتيبه زوجي يخطو خطوة». هو لا يعرف أسماءهم، بل يختارهم بمواقعهم. وهكذا تعمل هذه المحددات.
الاستثناء: not
Section titled “الاستثناء: not”:not() تختار كل العناصر إلا ما يطابق المحدد الذي بين القوسين:
/* كل الأزرار إلا الزر الأساسي */button:not(.primary) { background: #e6e8f0;}
/* مثال الخط الفاصل السابق في قاعدة واحدة */li:not(:last-child) { border-bottom: 1px solid #ddd;}حالات النماذج
Section titled “حالات النماذج”| المحدد | متى ينطبق؟ |
|---|---|
:checked |
مربع اختيار أو زر radio مُحدَّد |
:disabled |
حقل أو زر معطّل |
:required |
حقل إجباري |
:invalid |
حقل قيمته لا تطابق شروطه |
:placeholder-shown |
حقل ما زال يعرض النص التوضيحي، أي أنه فارغ |
button:disabled { opacity: 0.5; cursor: not-allowed;}
input:invalid { border-color: crimson;}هذه الحالات تجعل النموذج يخبر المستخدم بما يحدث، بلا JavaScript.
حالات الروابط والتفاعل
Section titled “حالات الروابط والتفاعل”| المحدد | متى ينطبق؟ |
|---|---|
:hover |
الفأرة فوق العنصر |
:active |
لحظة الضغط على العنصر |
:focus-visible |
العنصر محدَّد بلوحة المفاتيح |
:visited |
رابط زاره المستخدم من قبل |
العنصران before و after
Section titled “العنصران before و after”::before و ::after ينشئان عنصراً وهمياً داخل العنصر: الأول قبل محتواه، والثاني بعده. ومحتواه يأتي من الخاصية content.
.required::after { content: " *"; color: crimson;}
.external::after { content: " ↗";}النجمة الحمراء تظهر بعد كل عنوان حقل إجباري، والسهم يظهر بعد كل رابط خارجي. ولم نكتب أياً منهما في HTML.
ويُستخدمان كثيراً لرسم أشكال تزيينية، مثل خط ملون تحت العنوان:
h2::after { content: ""; display: block; width: 48px; height: 4px; margin-top: 8px; background: #5b5bf0; border-radius: 2px;}ضع فيهما التزيين فقط. النص المهم مكانه HTML، لأن بعض قارئات الشاشة لا تقرأ محتوى content، ولأن الزائر لا يستطيع تحديده ونسخه.
عناصر زائفة أخرى
Section titled “عناصر زائفة أخرى”| المحدد | يختار |
|---|---|
::first-letter |
الحرف الأول من الفقرة |
::first-line |
السطر الأول منها |
::placeholder |
النص التوضيحي داخل الحقل |
::selection |
النص الذي ظلله المستخدم بالفأرة |
::marker |
نقطة أو رقم عنصر القائمة |
li::marker { color: #5b5bf0;}
::selection { background: #fde68a;}جرّب بنفسك
Section titled “جرّب بنفسك”غيّر even إلى odd ثم إلى 3n وشاهد الصفوف الملونة. ثم علّم مربع الاختيار وراقب النص الذي بجانبه، وظلل أي نص بالفأرة:
الناتج
المحدد input:checked + span يجمع حالة زائفة مع رمز + الذي يختار العنصر التالي مباشرة: «العنصر span الذي يأتي بعد مربع مُحدَّد».
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان content: العنصر
::beforeأو::afterلا يظهر مهما كتبت له من تنسيق. - سوء فهم nth-child:
p:nth-child(2)لا تعني «الفقرة الثانية»، بل «العنصر الذي هو الابن الثاني لأبيه وهو فقرة». إذا كان الابن الثاني عنواناً فلن يُختار شيء. للفقرة الثانية بين الفقرات استخدمp:nth-of-type(2). - مسافة قبل النقطتين:
li :first-childبمسافة تعني «أول ابن داخل li»، وهذا معنى مختلف تماماً عنli:first-child. - نص مهم داخل content: لا يُحدَّد ولا يُنسخ، وقد لا يُقرأ.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي محدد يلوّن الصفوف الثاني والرابع والسادس من الجدول؟
even تختار العناصر ذات الترتيب الزوجي. أما nth-child(2) فتختار الصف الثاني وحده.
سؤال
كتبت تنسيقاً كاملاً للمحدد .box::before ولم يظهر شيء. ما السبب الأرجح؟
العنصر الزائف لا يُنشأ إلا إذا كانت له خاصية content، حتى لو كانت قيمتها نصاً فارغاً.
الخلاصة
Section titled “الخلاصة”- الحالة الزائفة
:تختار عنصراً موجوداً في وضع أو ترتيب معين. :nth-childتختار بالترتيب: رقم، أوodd، أوeven، أو صيغة مثل3n.:not()تستثني، و:checkedو:disabledو:invalidلحالات النماذج.::beforeو::afterينشئان عنصراً تزيينياً، ويشترطانcontent.- اترك النص المهم في HTML، والتزيين في العناصر الزائفة.