المحددات في CSS: الوسم والكلاس والمعرّف وأكثر
قبل أن تلوّن عنصراً أو تغيّر حجمه، يجب أن تخبر المتصفح أي عنصر تقصد بالضبط. هذه هي وظيفة المحددات (Selectors). كلما أتقنتها، صار بإمكانك تنسيق أي جزء من الصفحة دون أن تلمس كود HTML كثيراً. في هذا الدرس ستتعلم أهم المحددات، وكيف يقرر المتصفح من يفوز عندما تتعارض قاعدتان.
المحددات الأساسية الثلاثة
Section titled “المحددات الأساسية الثلاثة”1. محدد الوسم (Type Selector): يختار كل العناصر من نوع معين:
p { line-height: 1.8;}2. محدد الكلاس (Class Selector): يختار العناصر التي تحمل كلاساً معيناً، ويبدأ بنقطة:
.warning { color: darkred;}ويمكن أن يحمل العنصر الواحد أكثر من كلاس، بينها مسافة:
<p class="warning big">انتبه!</p>3. محدد المعرّف (ID Selector): يختار العنصر الوحيد الذي له id معين، ويبدأ بعلامة #:
#main-title { font-size: 40px;}تخيّل مدرسة كبيرة: محدد الوسم مثل أن تنادي «كل الطلاب»، ومحدد الكلاس مثل «طلاب فريق الكرة»، ومحدد المعرّف مثل أن تنادي طالباً واحداً باسمه ورقم قيده.
المحدد العام
Section titled “المحدد العام”النجمة * تختار كل العناصر في الصفحة. تُستخدم غالباً لضبط إعداد يخص الجميع:
* { box-sizing: border-box;}ستفهم معنى هذا السطر في درس نموذج الصندوق.
التجميع
Section titled “التجميع”إذا أردت نفس التنسيق لأكثر من محدد، افصل بينها بفاصلة:
h1, h2, h3 { color: #141826; font-weight: 700;}بدلاً من كتابة ثلاث قواعد متطابقة، كتبت قاعدة واحدة.
المحددات المركبة
Section titled “المحددات المركبة”المحدد الوصفي (Descendant Selector): مسافة بين محددين تعني «العنصر الثاني داخل الأول، في أي عمق»:
/* الروابط الموجودة داخل nav فقط */nav a { color: white;}محدد الابن المباشر (Child Selector): العلامة > تعني «الابن المباشر فقط، وليس الأحفاد»:
ul > li { font-weight: bold;}الوسم مع الكلاس معاً: بدون مسافة، يعني «عنصر من هذا النوع ويحمل هذا الكلاس»:
/* فقرات تحمل الكلاس intro فقط، وليس أي عنصر آخر يحمله */p.intro { font-size: 20px;}الحالات الزائفة (Pseudo-classes)
Section titled “الحالات الزائفة (Pseudo-classes)”تختار العنصر في حالة معينة، وتُكتب بنقطتين : بعد المحدد:
/* عند مرور الفأرة فوق الزر */button:hover { background-color: #4a4ad6;}
/* عندما يكون الحقل في وضع الكتابة */input:focus { border-color: #5b5bf0;}
/* أول عنصر في القائمة */li:first-child { color: green;}
/* العناصر الزوجية: مفيدة لتلوين صفوف الجداول */tr:nth-child(even) { background-color: #f2f2f2;}هذه الحالات تجعل الصفحة تتفاعل مع المستخدم دون أي JavaScript.
من يفوز؟ قوة المحدد (Specificity)
Section titled “من يفوز؟ قوة المحدد (Specificity)”إذا انطبقت قاعدتان على نفس العنصر، يحسب المتصفح قوة كل محدد:
| المحدد | القوة |
|---|---|
style="..." مباشرة |
الأقوى |
المعرّف #id |
قوي |
الكلاس .class والحالات :hover |
متوسط |
الوسم p |
ضعيف |
مثال:
#intro { color: blue; }.text { color: red; }p { color: green; }<p id="intro" class="text">ما لوني؟</p>الفقرة ستكون زرقاء، لأن محدد المعرّف أقوى من الكلاس والوسم، حتى لو جاءت قاعدته أولاً. وعندما تتساوى القوة، تفوز القاعدة الأخيرة في الترتيب.
جرّب بنفسك
Section titled “جرّب بنفسك”مرّر الفأرة فوق الزر، ولاحظ تلوين الصفوف الزوجية في القائمة، وأن الرابط داخل nav فقط تغيّر لونه. ثم جرّب تغيير even إلى odd:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان النقطة أو العلامة #:
intro { }تبحث عن وسم اسمه intro. اكتب.introللكلاس و#introللمعرّف. - مسافة غير مقصودة:
p .introتختلف تماماً عنp.intro. - الإفراط في استخدام id للتنسيق: قوته العالية تجعل تغيير التنسيق لاحقاً صعباً، فتضطر لكتابة محددات أقوى وأقوى.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا يختار المحدد nav a؟
المسافة تعني «داخل»، فالمحدد يختار الروابط a الموجودة داخل nav في أي عمق.
سؤال
عنصر عليه id='x' و class='y'، والقاعدتان .y { color: red; } ثم #x { color: blue; }. ما لونه؟
محدد المعرّف #x أقوى من محدد الكلاس .y، بغض النظر عن الترتيب.
الخلاصة
Section titled “الخلاصة”- محدد الوسم
pللكل، والكلاس.nameلمجموعة، والمعرّف#nameلعنصر واحد. - الفاصلة تجمع عدة محددات، والمسافة تعني «داخل»، و
>تعني «ابن مباشر». - الحالات مثل
:hoverو:focusو:nth-childتختار العنصر في وضع معين. - قوة المحدد:
styleثم#idثم.classثم الوسم، وعند التساوي يفوز الأخير. - فضّل الكلاس في التنسيق، فهو مرن وقابل لإعادة الاستخدام.