מה זה סלקטור ב-CSS
סלקטור הוא החלק של כלל שבא לפני הסוגריים המסולסלים. הוא קובע על אילו אלמנטים ההצהרות חלות.
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
חמשת הסלקטורים הבסיסיים מכסים את רוב גיליונות הסגנונות האמיתיים:
סוגי סלקטורים במבט אחד
| סלקטור | דוגמה | תואם |
|---|---|---|
| אוניברסלי | * | כל אלמנט |
| סוג | p | כל <p> |
| מחלקה | .tip | אלמנטים עם class="tip" (בין היתר) |
| ID | #main-title | האלמנט עם id="main-title" |
| מאפיין | [type="email"] | אלמנטים שהמאפיין שלהם תואם |
| פסאודו-קלאס | a:hover, li:first-child | אלמנטים במצב או במיקום מסוים |
| פסאודו-אלמנט | p::first-line, .x::before | חלק של אלמנט |
| קבוצה | h1, h2, h3 | כל דבר שתואם אחד מהרשימה |
| מורכב | p.tip | <p> שיש לו גם את המחלקה |
למחלקות ול-IDs יש דף משלהם, סלקטור מחלקה ב-CSS. פסאודו-קלאסים כמו :nth-child() ו-:not() מוסברים בדף על פסאודו-קלאסים.
מחברים: צאצא מול ילד
מחבר מקשר בין שני סלקטורים לפי היחס ביניהם בעץ ה-HTML. יש ארבעה.
| מחבר | תחביר | תואם את B כאשר |
|---|---|---|
| צאצא | A B (רווח) | B נמצא בכל מקום בתוך A |
| ילד | A > B | ההורה של B הוא A |
| אח סמוך | A + B | B בא מיד אחרי A, עם אותו הורה |
| אח כללי | A ~ B | B בא אי שם אחרי A, עם אותו הורה |
הרווח וה-> הם הזוג שאנשים מתבלבלים ביניהם. סלקטור הצאצא מגיע לכל עומק; סלקטור הילד עוצר ברמה אחת:
מחברי אחים: + ו-~
אחים מסתכלים רק קדימה. אין מחבר של "אח קודם", אבל :has() יכול לבטא אותו: h2:has(+ p) תואם h2 שמיד אחריו בא p.
סלקטורי מאפיינים
סוגריים מרובעים מתאימים לפי מאפיינים והערכים שלהם:
| סלקטור | תואם |
|---|---|
[disabled] | יש לו את המאפיין, עם כל ערך |
[type="email"] | הערך הוא בדיוק email |
[href^="https"] | הערך מתחיל ב-https |
[href$=".pdf"] | הערך מסתיים ב-.pdf |
[class*="icon"] | הערך מכיל את icon בכל מקום |
[lang|="en"] | הערך הוא en או מתחיל ב-en- |
[data-state="open" i] | התאמה מדויקת, בלי תלות ברישיות |
סלקטורי מאפיינים על מאפייני data-* הם דרך נקייה לעצב מצב ש-JavaScript מגדיר, בלי להמציא שמות של מחלקות.
נסו כל סלקטור
הקלידו סלקטור בתיבה. כל אלמנט שהוא תואם מקבל קו מתאר ענברי, והספירה מופיעה מתחת.
נסו #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).
מורכב מול צאצא: הרווח חשוב
p.note ו-p .note שונים ברווח אחד ומשמעותם שונה.
איך דפדפנים קוראים סלקטורים
כשכמה כללים תואמים את אותו אלמנט ומגדירים את אותו מאפיין, הסלקטור הספציפי יותר מנצח, ובמקרה של תיקו המאוחר מנצח. ID שוקל יותר מכל מספר של מחלקות, ומחלקה שוקלת יותר מכל מספר של סלקטורי סוג; בדף על !important נמצאת טבלת הספציפיות המלאה.
לקבוצה יש מלכודת אחת: אם סלקטור כלשהו ברשימה רגילה לא תקין, כל הכלל נזנח. ב-a, b:unknown { } אפילו הקישורים לא מעוצבים. עטיפת הרשימה ב-:is() הופכת אותה לסלחנית, כך ש-:is(a, b:unknown) עדיין מעצב את הקישורים.
טעויות נפוצות
- לשכוח את הנקודה או את הסולמית.
tip { }פונה לאלמנט<tip>, לא ל-class="tip". כתבו.tip. - רווח בסלקטור מורכב.
p .noteהוא לאp.note. - לצפות ש-
>יגיע לנכדים. השתמשו ברווח לכל עומק. - שגיאת הקלדה אחת שוברת קבוצה שלמה. ב-
h1, h2:hovr, h3שום דבר לא מעוצב. - סלקטורים ארוכים מדי.
body div.wrapper ul li aאיטי לקריאה וקשה לדריסה. מחלקה אחת מספיקה בדרך כלל.
שאלות נפוצות
מה זה סלקטור ב-CSS?
החלק של כלל CSS לפני ה-{ שאומר על אילו אלמנטים ההצהרות חלות. ב-p.note { color: blue; }, הסלקטור p.note תואם כל <p> עם המחלקה note.
מה ההבדל בין רווח ל-> בסלקטור CSS?
רווח הוא מחבר הצאצא: nav a תואם כל קישור בכל מקום בתוך nav, בכל עומק. > הוא מחבר הילד: nav > a תואם רק קישורים שההורה הישיר שלהם הוא ה-nav.
מה + אומר ב-CSS?
+ הוא מחבר האח הסמוך. h2 + p תואם <p> שבא מיד אחרי <h2> עם אותו הורה. ~ רחב יותר: h2 ~ p תואם כל אח <p> שבא אחריו.
איך בוחרים אלמנטים לפי מאפיין ב-CSS?
שימו את המאפיין בסוגריים מרובעים: [disabled] תואם אלמנטים שיש להם אותו, [type="email"] תואם ערך מדויק, [href^="https"] ערך שמתחיל במחרוזת, [href$=".pdf"] ערך שמסתיים בה, ו-[class*="btn"] ערך שמכיל אותה.
האם CSS יכול לבחור אלמנט הורה?
כן, עם הפסאודו-קלאס :has(), שנתמך בגרסאות הנוכחיות של Chrome, Firefox ו-Safari. li:has(> a.active) תואם את פריטי הרשימה שמכילים ישירות קישור פעיל.