מה !important עושה
הוספת !important אחרי ערך גורמת להצהרה הזאת לנצח כל הצהרה רגילה לאותו מאפיין באותו אלמנט. הספציפיות של הסלקטור וסדר הקוד כבר לא משנים.
בלי !important, סלקטור ה-ID היה מנצח והטקסט היה כחול. מחקו את !important בעורך כדי לראות את זה.
תחביר
selector {
property: value !important;
}
הוא בא אחרי הערך ולפני הנקודה-פסיק. הוא חל רק על ההצהרה האחת הזאת, לא על כל הכלל. הוא עובד גם בקיצורים (margin: 0 !important; הופך את כל ארבעת הצדדים ל-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: דריסה של סגנון inline שאי אפשר לערוך, כמו סגנון שכתב וידג'ט של צד שלישי.
כששתי ההצהרות הן !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): ID אחד שוקל יותר מכל מספר של מחלקות.
הבנת הטבלה הזאת היא מה שמאפשר לכם להימנע מ-!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בתוך keyframes נזנחות. - לתקן בעזרתו כל התנגשות. מצאו ב-DevTools את הכלל המנצח והשוו את הספציפיות שלו או הורידו אותה.
- לצפות שישפיע על מאפיין אחר.
color: red !importantלא עושה כלום ל-background. - לשכוח ש-
!importantב-inline מנצח את שלכם. שום כלל בגיליונות הסגנונות של הדף לא יכול לדרוסstyle="color: red !important"; שנו את המאפיין עצמו, למשל עם JavaScript.
שאלות נפוצות
מה !important עושה ב-CSS?
הוא נותן להצהרה אחת עדיפות על כל ההצהרות הרגילות לאותו מאפיין באותו אלמנט, בלי קשר לספציפיות של הסלקטור או לסדר. כתבו אותו אחרי הערך: color: red !important;.
איך דורסים !important?
עם הצהרת !important אחרת שיש לה ספציפיות גבוהה יותר, או אותה ספציפיות ומיקום מאוחר יותר בגיליון הסגנונות. style inline עם !important מנצח כל !important בגיליון סגנונות.
האם !important דורס סגנונות inline?
כן. הצהרה בגיליון סגנונות עם !important מנצחת הצהרה רגילה במאפיין style. היא לא מנצחת הצהרת inline שמסומנת בעצמה !important.
האם שימוש ב-!important הוא הרגל רע?
כשמשתמשים בו כדי לנצח במאבק ספציפיות, כן: הדריסה הבאה תצטרך גם היא !important, וקשה יהיה לשנות את גיליון הסגנונות. הוא סביר במחלקות עזר שחייבות לחול תמיד (כמו .hidden), בדריסת סגנונות inline של צד שלישי ובגיליונות סגנונות של משתמשים.
איך מחשבים ספציפיות ב-CSS?
סופרים שלוש עמודות: סלקטורי ID, אחר כך מחלקות, מאפיינים ופסאודו-קלאסים, ואחר כך סלקטורי סוג ופסאודו-אלמנטים. משווים עמודה אחרי עמודה מההתחלה, ולכן #nav a (1,0,1) מנצח את .menu .item a (0,2,1). הסלקטור האוניברסלי * והמחברים לא מוסיפים כלום.