The CSS Podcast – 015: Pseudo-classes
נניח שיש לכם טופס הרשמה לאימייל, ואתם רוצים ששדה הטופס של כתובת האימייל יהיה עם גבול אדום אם הוא מכיל כתובת אימייל לא חוקית.
איך עושים את זה?
אפשר להשתמש בפסאודו-מחלקה של CSS :invalid
, שהיא אחת מפסאודו-המחלקות הרבות שסופקו על ידי הדפדפן.
פסאודו-סיווג מאפשר לכם להחיל סגנונות על סמך שינויים במצב וגורמים חיצוניים. המשמעות היא שהעיצוב יכול להגיב להזנת משתמש, כמו כתובת אימייל לא חוקית. הפרטים האלה מוסברים במודול בוררי הבחירה, שבו נסביר עליהם בפירוט.
בניגוד לפסאודו-רכיבים, שאפשר לקרוא מידע נוסף עליהם במודול הקודם, מחלקות פסאודו מתחברות למצבים ספציפיים שרכיב יכול להיות בהם, במקום להחיל סגנון באופן כללי על חלקים ברכיב.
מצבים אינטראקטיביים
פסאודו-הקלאסות הבאות חלות בגלל אינטראקציה של משתמש עם הדף שלכם.
:hover
אם למשתמש יש אמצעי הצבעה כמו עכבר או משטח מגע, והוא מציב אותו מעל רכיב, אפשר להתחבר למצב הזה באמצעות :hover
כדי להחיל סגנונות.
זוהי דרך שימושית להצביע על כך שאפשר ליצור אינטראקציה עם אלמנט מסוים.
:active
המצב הזה מופעל כשיש אינטראקציה פעילה עם אלמנט – למשל קליק – לפני שהקליק משתחרר. אם משתמשים במכשיר להצבעה כמו עכבר, המצב הזה מתרחש כשהקליק מתחיל ועדיין לא משוחרר.
:focus
, ב:focus-within
וב:focus-visible
אם רכיב יכול לקבל מיקוד – כמו <button>
– אפשר להגיב למצב הזה באמצעות פסאודו-הקלאס :focus
.
אפשר גם להגיב אם רכיב צאצא של הרכיב מקבל את המיקוד באמצעות :focus-within
.
רכיבים שניתן להתמקד בהם, כמו לחצנים, יוצגו עם טבעת מיקוד כשהם ב-focus – גם אם לוחצים עליהם. במקרה כזה, המפתח יחיל את הקוד הבא ב-CSS:
button:focus {
outline: none;
}
קוד ה-CSS הזה מסיר את טבעת המיקוד שמוגדרת כברירת מחדל בדפדפן כשרכיב מקבל את המיקוד, מה שגורם לבעיה בנגישות למשתמשים שמנווטים בדף אינטרנט באמצעות מקלדת.
אם לא תגדירו סגנון מיקוד, הם לא יוכלו לעקוב אחרי מיקום המיקוד הנוכחי באמצעות מקש ה-Tab.
בעזרת :focus-visible
אפשר להציג סגנון של מיקוד כשאלמנט מקבל מיקוד דרך המקלדת, תוך שימוש גם בכלל outline: none
כדי למנוע זאת כשמכשיר צביעה יוצר איתו אינטראקציה.
button:focus {
outline: none;
}
button:focus-visible {
outline: 1px solid black;
}
:target
פסאודו-הקלאס :target
בוחר אלמנט שיש לו id
שתואם לחלק מכתובת URL.
נניח שיש לכם את הקוד הבא ב-HTML:
<article id="content">
…
</article>
אפשר לצרף סגנונות לרכיב הזה כשכתובת ה-URL מכילה את הערך #content
.
#content:target {
background: yellow;
}
האפשרות הזו שימושית כדי להדגיש אזורים שעשויים להיות מקושרים באופן ספציפי, כמו התוכן הראשי באתר, באמצעות קישור דילוג.
מצבים היסטוריים
:link
אפשר להחיל את פסאודו-הקלאס :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
אם רכיב טופס, כמו <button>
, מושבת על ידי הדפדפן, אפשר להתחבר למצב הזה באמצעות פסאודו-הקלאס :disabled
.
פסאודו-הקלאס :enabled
זמין למצב ההפוך, אבל רכיבי טפסים הם גם :enabled
כברירת מחדל, ולכן יכול להיות שלא תצטרכו להשתמש בפסאודו-הקלאס הזה.
:checked
וגם :indeterminate
פסאודו-הקלאס :checked
זמין כשרכיב תומך בטופס, כמו תיבת סימון או לחצן בחירה, נמצא במצב מסומן.
המצב :checked
הוא מצב בינארי(true או false), אבל לתיבת סימון יש מצב ביניים כשהיא לא מסומנת או לא מסומנת.
המצב הזה נקרא :indeterminate
.
דוגמה למצב כזה היא כשיש פקד 'בחירת הכול' שמסמן את כל תיבות הסימון בקבוצה. אם המשתמש יבטל את הסימון של אחת מתיבות הסימון האלה, תיבת הסימון ברמה הבסיסית לא תציג יותר את האפשרות 'הכול' מסומנת, ולכן צריך להעביר אותה למצב לא מוגדר.
לאלמנט <progress>
יש גם מצב לא ידוע שאפשר להגדיר לו סגנון.
תרחיש לדוגמה נפוץ הוא להציג את הערך בפסילות כדי לציין שאנחנו לא יודעים כמה עוד נדרש.
:placeholder-shown
אם לשדה בטופס יש מאפיין placeholder
ואין לו ערך, אפשר להשתמש בפסאודו-סוג :placeholder-shown
כדי לצרף סגנונות למצב הזה.
ברגע שיהיה תוכן בשדה, בין שיש בו placeholder
ובין שלא, המצב הזה לא יחול יותר.
מצבי אימות
אפשר להגיב לאימות של טפסי HTML באמצעות פסאודו-כיתות כמו :valid
, :invalid
ו-:in-range
.
פסאודו-הכיתות :valid
ו-:invalid
שימושיות בהקשרים כמו שדה אימייל שיש בו pattern
שצריך להתאים כדי שהשדה יהיה חוקי.
אפשר להציג את מצב הערך החוקי הזה למשתמש, כדי לעזור לו להבין שהוא יכול לעבור לשדה הבא בבטחה.
פסאודו-הקלאס :in-range
זמין אם לקלט יש min
ו-max
, כמו קלט מספרי וגם הערך נמצא בגבולות האלה.
בטופס HTML, אפשר להגדיר ששדה הוא חובה באמצעות המאפיין required
.
פסאודו-הקלאס :required
יהיה זמין לשדות חובה.
אפשר לבחור שדות שאינם חובה באמצעות פסאודו-הקלאס :optional
.
בחירת רכיבים לפי האינדקס, הסדר והאירוע שלהם
יש קבוצה של פסאודו-כיתות שבוחרות פריטים על סמך המיקום שלהם במסמך.
:first-child
וגם :last-child
כדי למצוא את הפריט הראשון או האחרון, אפשר להשתמש ב-:first-child
וב-:last-child
.
פסאודו-הקלאסות האלה יחזירו את הרכיב הראשון או האחרון בקבוצה של רכיבים אחים.
:only-child
אפשר גם לבחור רכיבים שאין להם אחים באמצעות פסאודו-הקלאס :only-child
.
:first-of-type
וגם :last-of-type
אפשר לבחור את התגים :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
אתם גם לא מוגבלים לסוגי ילדים ולסוגי ילדים אחרונים.
הסיווגים המזויפים :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
.
אפשר להתנסות בבורר כזה בבודק ה-nth-child או בכלי לבחירת כמות.
:only-of-type
לבסוף, אפשר למצוא את הרכיב היחיד מסוג מסוים בקבוצה של אחים באמצעות :only-of-type
.
האפשרות הזו שימושית אם רוצים לבחור רשימות עם פריט אחד בלבד, או אם רוצים למצוא את הרכיב היחיד שמודגש בכתב מודגש בפסקה.
חיפוש רכיבים ריקים
לפעמים כדאי לזהות רכיבים ריקים לחלוטין, וגם לזה יש פסאודו-סיווג.
:empty
אם לאלמנט אין צאצאים, פסאודו-הקלאס :empty
חל עליו.
עם זאת, צאצאים הם לא רק רכיבי HTML או צמתים של טקסט: הם יכולים להיות גם רווחים, שיכולים לבלבל כשמנסים לנפות באגים בקוד ה-HTML הבא ולשאול למה הוא לא פועל עם :empty
:
<div>
</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()
אם רוצים למצוא את כל אלמנטי הצאצא h2
, li
ו-img
באלמנט .post
, אפשר לכתוב רשימת בוררים כך:
.post h2,
.post li,
.post img {
…
}
בעזרת פסאודו-הקלאס :is()
אפשר לכתוב גרסה קומפקטית יותר:
.post :is(h2, li, img) {
…
}
הסיווג המשוער :is
הוא לא רק קומפקטי יותר מרשימת בוחרים, אלא גם גמיש יותר.
ברוב המקרים, אם יש שגיאה או סלקטורים שלא נתמכים ברשימת הסלקטורים, כל רשימת הסלקטורים לא תפעל יותר.
אם יש שגיאה בבוררים שהועברו בפסאודו-כיתוב :is
, המערכת תתעלם מהבורר הלא חוקי ותשתמש בבוררים התקינים.
:not()
אפשר גם להחריג פריטים באמצעות פסאודו-הקלאס :not()
.
לדוגמה, אפשר להשתמש בו כדי להגדיר סגנון לכל הקישורים שאין להם מאפיין class
.
a:not([class]) {
color: blue;
}
תוכלו גם להשתמש בפסאודו-סיווג :not
כדי לשפר את הנגישות.
לדוגמה, ל-<img>
חייב להיות alt
, גם אם זהו ערך ריק, ולכן אפשר לכתוב כלל CSS שמוסיף קו מתאר אדום עבה לתמונות לא חוקיות:
img:not([alt]) {
outline: 10px red;
}
בדיקת ההבנה
בדיקת הידע שלכם בנושא פסאודו-כיתות
פסאודו-כיתות פועלות כאילו מוחלת באופן דינמי על אלמנט, בעוד שפסאודו-אלמנטים פועלים על האלמנט עצמו.
:
יחיד או כפול כתו ייחוד למפתח בבורראילו מהאפשרויות הבאות הן פסאודו-סיווג פונקציונלי?
:is()
:target
()
, כדי לציין שהן מקבלות פרמטרים.:empty
()
, כדי לציין שהן מקבלות פרמטרים.:not()
אילו מהפסאודו-כיתות הבאות נובעות מאינטראקציה של משתמש?
:hover
:press
:squeeze
:target
:focus-within
אילו מהאפשרויות הבאות הן פסאודו-כיתות של מצב <form>
?
:enabled
:fresh
:indeterminate
:checked
:in-range
:loading
:valid