ماذا تفعل !important
إضافة !important بعد القيمة تجعل ذلك التصريح يفوز على كل تصريح عادي للخاصية نفسها على العنصر نفسه. لا تعود خصوصية المحدد ولا ترتيب المصدر مهمة.
من دون !important كان محدد المعرّف سيفوز وكان النص سيصبح أزرق. احذف !important في المحرر لترى ذلك.
الصيغة
selector {
property: value !important;
}
تأتي بعد القيمة وقبل الفاصلة المنقوطة. تنطبق على ذلك التصريح وحده، لا على القاعدة كلها. وتعمل أيضًا في الخصائص المختصرة (margin: 0 !important; تجعل الجوانب الأربعة كلها مهمة) وفي السمة style.
ما الذي يتغلب على ماذا
للأنماط التي يكتبها مؤلف الصفحة، من الأضعف إلى الأقوى:
| الرتبة | التصريح | مثال |
|---|---|---|
| 1 | تصريح عادي في ملف الأنماط | p { color: blue; } |
| 2 | تصريح عادي في السمة style | <p style="color: blue"> |
| 3 | !important في ملف الأنماط | p { color: blue !important; } |
| 4 | !important في السمة style | <p style="color: blue !important"> |
داخل الرتبة الواحدة تحسم الخصوصية، ثم ترتيب ظهور التصريحات: اللاحق يفوز.
هذا هو الاستخدام اليومي المشروع الوحيد لـ !important: تجاوز نمط مضمّن لا تستطيع تعديله، مثل نمط يكتبه عنصر واجهة من طرف ثالث.
حين يكون التصريحان كلاهما !important
!important في مواجهة !important تعود إلى القواعد المعتادة: الخصوصية الأعلى تفوز، وعند التعادل يفوز التصريح اللاحق.
هكذا تتصاعد !important: بمجرد أن تستخدمها قاعدة، يجب أن تستخدمها القاعدة التي عليها تجاوزها أيضًا، فتبدأ الخصوصية بالارتفاع من جديد.
خصوصية CSS في جدول واحد
الخصوصية هي وزن المحدد. عدّ ثلاثة أرقام:
| العمود | ما الذي يُعد | مثال محدد | الخصوصية |
|---|---|---|---|
| A | محددات المعرّف ID | #nav | (1,0,0) |
| B | الفئات، السمات، الفئات الزائفة | .btn، [type="text"]، :hover | (0,1,0) لكل واحد |
| C | محددات النوع، العناصر الزائفة | p، ::before | (0,0,1) لكل واحد |
| لا شيء | *، والمُركِّبات (>، +، ~، المسافة) | *، ul > li | لا تضيف شيئًا |
قارن العمود A أولًا؛ وعند التعادل فقط انظر إلى B ثم C. لذلك يتغلب #nav a (1,0,1) على .menu .item .link a (0,3,1): معرّف واحد يرجح على أي عدد من الفئات.
فهم هذا الجدول هو ما يتيح لك تجنب !important: معظم مشكلات «CSS لا تنطبق» سببها قاعدة أكثر خصوصية في مكان آخر، تراها في لوحة Styles في DevTools وتصريحك مشطوب.
بدائل أنظف
- طابِق الخصوصية ثم اعتمد على الترتيب. حمّل ملف أنماطك بعد ملف المكتبة واستخدم محددًا بالخصوصية نفسها على الأقل.
- اخفض خصوصية القاعدة الأخرى باستخدام
:where(). كل ما داخل:where()خصوصيته صفر، فالأنماط الأساسية المكتوبة بها سهلة التجاوز. - استخدم متغير CSS كنقطة تحكم. المكوّن الذي يقرأ
var(--btn-bg)يمكن تغيير سمته من دون صراع مع محدداته. راجع متغيرات CSS.
ضبط !important من JavaScript
لا يعمل element.style.color = 'red !important': القيمة غير صالحة فتُتجاهل. استخدم setProperty مع وسيط ثالث:
el.style.setProperty('color', '#f59e0b', 'important');
أخطاء شائعة
- وضعها في المكان الخطأ.
color: !important red;غير صالحة؛ مكانها بعد القيمة. - استخدامها في
@keyframes. التصريحات الموسومة بـ!importantداخل الإطارات المفتاحية تُتجاهل. - حل كل تعارض بها. ابحث عن القاعدة الفائزة في DevTools وطابِق خصوصيتها أو اخفضها بدلًا من ذلك.
- توقع أن تؤثر على خاصية أخرى.
color: red !importantلا تفعل شيئًا لـbackground. - نسيان أن
!importantالمضمّنة تتغلب على قاعدتك. لا توجد قاعدة في ملفات أنماط الصفحة تستطيع تجاوزstyle="color: red !important"؛ غيّر السمة نفسها، مثلًا عبر JavaScript.
الأسئلة الشائعة
ماذا تفعل !important في CSS؟
تمنح تصريحًا واحدًا الأولوية على كل تصريح عادي للخاصية نفسها على العنصر نفسه، بغض النظر عن خصوصية المحدد أو الترتيب. اكتبها بعد القيمة: color: red !important;.
كيف أتجاوز !important؟
بتصريح !important آخر خصوصيته أعلى، أو بالخصوصية نفسها وموقع لاحق في ملف الأنماط. السمة style المضمّنة مع !important تتغلب على كل !important في ملفات الأنماط.
هل تتغلب !important على الأنماط المضمّنة؟
نعم. تصريح في ملف الأنماط مع !important يتغلب على تصريح عادي في السمة style. لكنه لا يتغلب على تصريح مضمّن موسوم هو نفسه بـ !important.
هل استخدام !important ممارسة سيئة؟
إن استُخدمت لحسم معركة خصوصية، نعم: فالتجاوز التالي سيحتاج إلى !important أيضًا، ويصبح تغيير ملف الأنماط صعبًا. لكنها معقولة في فئات الأدوات التي يجب أن تنطبق دائمًا (مثل .hidden)، ولتجاوز أنماط مضمّنة من طرف ثالث، وفي ملفات أنماط المستخدم.
كيف تُحسب خصوصية CSS؟
عدّ ثلاثة أعمدة: محددات المعرّف ID، ثم الفئات والسمات والفئات الزائفة، ثم محددات النوع والعناصر الزائفة. قارن عمودًا عمودًا من البداية، فيتغلب #nav a (1,0,1) على .menu .item a (0,2,1). المحدد العام * والمُركِّبات لا تضيف شيئًا.