פסאודו מחלקות

הפודקאסט של CSS – 015: Pseudo-classes

נניח שיש לכם טופס הרשמה באימייל, ואתם רוצים להוסיף גבול אדום בשדה של טופס האימייל עם כתובת אימייל לא חוקית. איך עושים את זה? אפשר להשתמש בפסאודו-מחלקה של :invalid ב-CSS, שהיא אחת ממחלקות רבות שמספקות דפדפנים.

פסאודו-מחלקה מאפשרת להחיל סגנונות על סמך שינויים במצב וגורמים חיצוניים. המשמעות היא שהעיצוב יכול להגיב לקלט של משתמשים כמו כתובת אימייל לא חוקית. הנושאים האלה מוסברים במודול הסלקטורים, והמודול הזה ינחה אתכם לעומק.

בשונה מפסאודו-רכיבים, שעליהם תוכלו לקרוא מידע נוסף במודול הקודם, מחלקות מפסידות רלוונטיות למצבים ספציפיים שהרכיב עשוי להימצא בהן, במקום לעצב חלקים מהאלמנט הזה באופן כללי.

מצבים אינטראקטיביים

פסאודו המחלקות הבאות רלוונטיות בעקבות אינטראקציה של משתמש עם הדף שלכם.

:hover

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 2

מקור

אם למשתמש יש אמצעי הצבעה כמו עכבר או משטח מגע, והוא ממקם אותו מעל רכיב מסוים, אפשר להתחבר למצב הזה באמצעות :hover כדי להחיל סגנונות. זוהי דרך שימושית לרמוז על כך שניתן לקיים אינטראקציה עם רכיב.

:active

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 1

מקור

המצב הזה מופעל כשיש אינטראקציה פעילה עם רכיב, כמו קליק, לפני הפרסום של הקליק. במקרה של שימוש במכשיר הצבעה כמו עכבר, המצב הזה מציין שהלחיצה מתחילה ועוד לא שוחרר.

:focus,‏ :focus-within,‏ :focus-visible

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 1

מקור

אם רכיב מסוים יכול להתמקד, למשל <button>, אפשר להגיב למצב הזה באמצעות פסאודו-מחלקה :focus.

אפשר גם להגיב אם רכיב צאצא של הרכיב מקבל מיקוד באמצעות :focus-within.

רכיבים שניתן להתמקד בהם, כמו לחצנים, יציגו טבעת מיקוד כשהם במוקד – גם כשלוחצים עליהם. במצב כזה, המפתח יחיל את ה-CSS הבא:

button:focus {
    outline: none;
}

שירות ה-CSS הזה מסיר את טבעת המיקוד שמוגדרת כברירת מחדל כשרכיב מסוים מקבל מיקוד. המצב הזה יוצר בעיית נגישות למשתמשים שמנווטים בדף אינטרנט באמצעות מקלדת. אם לא בחרו סגנון התמקדות, הם לא יוכלו לעקוב אחר המיקום הנוכחי של המיקוד בעת השימוש במקש Tab. בעזרת :focus-visible אפשר להציג סגנון התמקדות כשרכיב מסוים מקבל מיקוד דרך המקלדת, וגם להשתמש בכלל outline: none כדי למנוע מצב שבו המכשיר מצביע באינטראקציה איתו.

button:focus {
    outline: none;
}

button:focus-visible {
    outline: 1px solid black;
}

:target

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 1.3

מקור

הפסאודו-מחלקה :target בוחר רכיב שיש לו id שתואם למקטע של כתובת URL. נניח שיש לכם את קוד ה-HTML הבא:

<article id="content">
    …
</article>

אפשר לצרף סגנונות לרכיב הזה כאשר כתובת ה-URL מכילה #content.

#content:target {
    background: yellow;
}

התכונה הזו שימושית להדגשת אזורים שייתכן שקושרו באופן ספציפי, כמו התוכן הראשי באתר, באמצעות קישור דילוג.

מדינות היסטוריות

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 1

מקור

אפשר להחיל את הפסאודו-מחלקה :link על כל רכיב <a> שיש לו ערך href שעדיין לא נכנס אליו.

:visited

אפשר לעצב קישור שהמשתמש כבר ביקר בו באמצעות הפסאודו-מחלקה :visited. זהו המצב ההפוך ל-:link, אבל יש פחות נכסי CSS לשימוש מטעמי אבטחה. אפשר לעצב רק color, background-color, border-color, outline-color ואת הצבע של SVG fill ו-stroke.

ענייני סדר

אם מגדירים סגנון :visited, אפשר להחליף אותו באמצעות פסאודו-מחלקה של קישור עם רמת ספציפיות זהה לפחות. לכן מומלץ להשתמש בכלל LVHA כדי לעצב קישורים עם פסאודו-מחלקות בסדר מסוים: :link, :visited, :hover, :active.

a:link {}
a:visited {}
a:hover {}
a:active {}

מצבי טופס

בפסאודו-מחלקות הבאות אפשר לבחור רכיבי טופס במצבים השונים שבהם הרכיבים עשויים להימצא במהלך האינטראקציה איתם.

:disabled וגם :enabled

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 3.1

מקור

אם רכיב טופס, כמו <button>, מושבת על ידי הדפדפן, אפשר להתחבר למצב הזה באמצעות הפסאודו המחלקה :disabled. הפסאודו-מחלקה :enabled זמינה למצב ההפוך, אם כי גם רכיבי טופס הם :enabled כברירת מחדל, לכן יכול להיות שלא תצליחו להגיע למעמד הפסאודו הזה.

:checked וגם :indeterminate

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 3.1

מקור

פסאודו-מחלקה :checked זמינה כשרכיב טופס תומך, כמו תיבת סימון או לחצן בחירה, נמצא במצב מסומן.

המצב :checked הוא מצב בינארי(true או false), אבל בתיבות הסימון יש מצב ביניים כאשר הן לא מסומנות או לא מסומנות. המצב הזה נקרא :indeterminate.

דוגמה למצב הזה: יש לכם פקד 'בחירת הכול' שמסמן את כל תיבות הסימון בקבוצה. אם המשתמש יבטל את הסימון של אחת מתיבות הסימון האלה, תיבת הסימון ברמה הבסיסית לא תייצג יותר את האפשרות 'הכול' מסומנת, לכן צריך להעביר אותה למצב לא ידוע.

לרכיב <progress> יש גם מצב לא קבוע שניתן לסגנן. אחד מהתרחישים הנפוצים הוא לתת למודל 'פסים' כדי לציין שלא תמיד צריך להוסיף את המנה.

:placeholder-shown

תמיכה בדפדפן

  • 47
  • 79
  • 51
  • 9

מקור

אם לשדה טופס יש מאפיין placeholder וללא ערך, אפשר להשתמש בפסאודו-מחלקה :placeholder-shown כדי לצרף סגנונות למצב הזה. ברגע שיהיה תוכן בשדה, גם אם יש בו placeholder וגם אם לא, המצב הזה לא יהיה תקף יותר.

מצבי אימות

תמיכה בדפדפן

  • 10
  • 12
  • 4
  • 5

מקור

אפשר להגיב לאימות של טופסי HTML באמצעות פסאודו מחלקות כמו :valid, :invalid ו-:in-range. הפסאודו-מחלקה :valid ו-:invalid שימושיים להקשרים כמו שדה אימייל שיש בו pattern שצריך להתאים, כדי שהוא יהיה שדה חוקי. אפשר להציג למשתמש את מצב הערך התקף הזה, ועוזר לו להבין שהוא יכול לעבור בבטחה לשדה הבא.

הפסאודו-מחלקה :in-range זמין אם הקלט מכיל min ו-max, כמו קלט מספרי וגם הערך נמצא בתוך הגבולות האלה.

בעזרת טופסי HTML, אפשר לקבוע ששדה חובה באמצעות המאפיין required. הפסאודו-מחלקה :required יהיה זמין בשדות חובה. אפשר לבחור שדות לא חובה בעזרת פסאודו מחלקה :optional.

בחירת רכיבים לפי האינדקס, הסדר והמופע שלהם

יש קבוצה של פסאודו-מחלקות שבוחרות פריטים לפי המיקום שלהם במסמך.

:first-child וגם :last-child

תמיכה בדפדפן

  • 4
  • 12
  • 3
  • 3.1

מקור

כדי למצוא את הפריט הראשון או האחרון, אפשר להשתמש ב-:first-child וב-:last-child. פסאודו מחלקה זו תחזיר את הרכיב הראשון או האחרון בקבוצת רכיבים אחים.

:only-child

תמיכה בדפדפן

  • 2
  • 12
  • 1.5
  • 3.1

מקור

תוכלו גם לבחור רכיבים שאין להם אחים ואחיות, באמצעות המפסאודו-מחלקה :only-child.

:first-of-type וגם :last-of-type

תמיכה בדפדפן

  • 1
  • 12
  • 3.5
  • 3.1

מקור

תוכלו לבחור את התגים :first-of-type ו-:last-of-type, שבהתחלה נראים כאילו הם עושים את אותו הדבר כמו :first-child ו-:last-child, אבל חשוב על ה-HTML הבא:

<div class="my-parent">
    <p>A paragraph</p>
    <div>A div</div>
    <div>Another div</div>
</div>

וה-CSS הזה:

.my-parent div:first-child {
    color: red;
}

אף רכיב לא ייצבע באדום כי הצאצא הראשון הוא פסקה ולא div. הפסאודו-מחלקה :first-of-type יכול להיות שימושי בהקשר הזה.

.my-parent div:first-of-type {
    color: red;
}

על אף שה-<div> הראשון הוא הצאצא השני, הוא עדיין הסוג הראשון בתוך רכיב ה-.my-parent, כך שעם הכלל הזה הוא ייצבע באדום.

:nth-child וגם :nth-of-type

תמיכה בדפדפן

  • 1
  • 12
  • 3.5
  • 3.1

מקור

אפשר להשתמש גם בסוגים ובצאצאים הראשונים והאחרונים. המחלקות :nth-child ו-:nth-of-type מאפשרות לציין רכיב שנמצא באינדקס מסוים. ההוספה לאינדקס בסלקטורים ב-CSS מתחילה ב-1.

תוכלו להעביר יותר מאינדקס גם למחלקות האלה. אם רוצים לבחור את כל הרכיבים זוגיים, אפשר להשתמש ב-:nth-child(even).

באמצעות המיקרו-תחביר של An+B, תוכלו גם ליצור סלקטורים מורכבים יותר שמוצאים פריטים במרווחי זמן קבועים.

li:nth-child(3n+3) {
    background: yellow;
}

הבורר הזה בוחר כל פריט שלישי, החל מפריט 3. הערך n בביטוי הזה הוא האינדקס, שמתחיל באפס, ו-3 (3n) הוא כמות הכפלת האינדקס הזה.

נניח שיש לכם 7 פריטים מסוג <li>. הפריט הראשון שנבחר הוא 3 כי 3n+3 מתורגם ל(3 * 0) + 3. באיטרציה הבאה תתבצע בחירה בפריט 6 כי n עלה עכשיו ל-1, ואז (3 * 1) + 3). הביטוי הזה פועל גם ב-:nth-child וגם ב-:nth-of-type.

תוכלו לשחק עם הבורר מהסוג הזה בכלי לבדיקת n-צאצא או בכלי הזה לבורר כמות.

:only-of-type

תמיכה בדפדפן

  • 1
  • 12
  • 3.5
  • 3.1

מקור

לסיום, אפשר למצוא את הרכיב היחיד מסוג מסוים בקבוצה של אחים ואחיות עם הערך :only-of-type. הדבר שימושי אם רוצים לבחור רשימות שכוללות פריט אחד בלבד, או למצוא את הרכיב המודגש היחיד בפסקה.

חיפוש רכיבים ריקים

לפעמים כדאי לזהות רכיבים ריקים לחלוטין, וגם לזה יש פסאודו-מחלקה.

:empty

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 3.1

מקור

אם לרכיב אין צאצאים, המפסאודו-מחלקה :empty חלה עליהם. אבל צאצאים אינם רק רכיבי HTML או צומתי טקסט: הם יכולים גם להיות רווח לבן, דבר שעלול לבלבל בעת ניפוי באגים ב-HTML הבא ותהית מדוע הוא לא פועל עם :empty:

<div>
</div>

הסיבה לכך היא שיש רווח לבן בין <div> הפותח לסגירה, ולכן שדה ריק לא יפעל.

אפשר להשתמש בפסאודו-מחלקה :empty אם יש לכם מעט שליטה ב-HTML ורוצים להסתיר רכיבים ריקים, כמו עורך תוכן של WYSIWYG. כאן, עורך הוסיף פסקה ריקה ותשועה.

<article class="post">
 <p>Donec ullamcorper nulla non metus auctor fringilla.</p>
 <p></p>
 <p>Curabitur blandit tempus porttitor.</p>
</article>

בעזרת :empty אפשר לאתר ולהסתיר אותו.

.post :empty {
    display: none;
}

חיפוש ואי הכללה של רכיבים מרובים

יש סוגים שונים של פסאודו מחלקות שיעזרו לכם לכתוב CSS קומפקטי יותר.

:is()

תמיכה בדפדפן

  • 88
  • 88
  • 78
  • 14

מקור

אם רוצים למצוא את כל רכיבי הצאצא h2, li ו-img ברכיב .post, כדאי לכתוב רשימת בוררים באופן הבא:

.post h2,
.post li,
.post img {
    …
}

באמצעות פסאודו-מחלקה :is(), אפשר לכתוב גרסה קומפקטית יותר:

.post :is(h2, li, img) {
    …
}

המעמד של :is הוא לא רק קומפקטי יותר מרשימת בוררים, אלא גם גמיש יותר. ברוב המקרים, אם ברשימת הבוררים יש שגיאה או שאין תמיכה בבורר, רשימת הבוררים כולה לא תפעל. אם יש שגיאה בסלקטורים שעברו בפסאודו-מחלקה :is, המערכת תתעלם מהסלקטור הלא תקין אבל תשתמש בבוררים התקינים.

:not()

תמיכה בדפדפן

  • 1
  • 12
  • 1
  • 3.1

מקור

אפשר גם להחריג פריטים עם הפסאודו-מחלקה :not(). לדוגמה, אפשר להשתמש בו כדי לעצב את כל הקישורים שאין להם מאפיין class.

a:not([class]) {
    color: blue;
}

גם פסאודו-מחלקה של :not יכול לעזור לך לשפר את הנגישות. לדוגמה, ל-<img> חייב להיות alt גם אם הוא ריק, לכן אפשר לכתוב כלל CSS שמוסיף קווי מתאר אדומים עבים לתמונות לא חוקיות:

img:not([alt]) {
    outline: 10px red;
}

בדיקת ההבנה

בחינת הידע שלכם בנושא פסאודו כיתות

פסאודו-מחלקה פועלת כאילו מחלקה הוחלה באופן דינמי על רכיב, ופסאודו-אלמנטים פועלים על הרכיב עצמו.

נכון
כדאי לשים לב לשימוש ב-: יחיד או כפול כתו שמבדיל בין הבורר
לא נכון
פסאודו אלמנטים הם לחלקים, Pseudo-classes נועד למצבים (State).

אילו מהאפשרויות הבאות היא פסאודו פונקציונלית?

:is()
🎉
:target
אחרי פסאודו מחלקות פונקציונלי מופיע (), כדי לציין שהן מקבלות פרמטרים.
:empty
אחרי פסאודו מחלקות פונקציונלי מופיע (), כדי לציין שהן מקבלות פרמטרים.
:not()
🎉

אילו מפסיאודו-מחלקה הבאה נובעת מאינטראקציה עם המשתמש?

:hover
🎉
:press
כדאי לנסות שוב.
:squeeze
כדאי לנסות שוב.
:target
🎉
:focus-within
🎉

אילו מהאפשרויות הבאות הן מכונות פסאודו של <form> מצב (States)?

:enabled
🎉
:fresh
כדאי לנסות שוב.
:indeterminate
🎉
:checked
🎉
:in-range
🎉
:loading
כדאי לנסות שוב.
:valid
🎉