Menu

CSS ::before ו-::after: פסאודו-אלמנטים עם דוגמאות

::before ו-::after מוסיפים תוכן שנוצר כילד הראשון וכילד האחרון של אלמנט, ישירות מ-CSS. למדו את המאפיין content, למה חובה content ריק, איך ממקמים אותם, tooltips עם attr(), מונים, ואיפה הם לא עובדים.

בדף הזה יש עורכים שאפשר להריץ. לערוך, להריץ ולראות את הפלט מיד.

מה ::before ו-::after עושים

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

ב-HTML יש רק 9 ו-Tests pass. סימן הדולר, התווית "/ month" וסימן הווי מגיעים כולם מ-CSS. הם יורשים את הסגנונות של האלמנט (גופן, צבע) אלא אם דורסים אותם, כמו שהדוגמאות למעלה עושות.

תחביר

selector::before {
  content: "text";   /* required */
  /* any other styles */
}

selector::after {
  content: "";       /* empty string: a box with no text */
}
ערך של contentתוצאה
"text"מחרוזת. השתמשו ב-"\A" לשבירת שורה (עם white-space: pre), וב-"\2192" לתו Unicode (→)
""תיבה ריקה, לצורות ולקישוטים
attr(data-label)הערך של תכונה של האלמנט
counter(step)הערך של מונה CSS
open-quote / close-quoteמירכאות לפי השפה של האלמנט
none או normalאין פסאודו-אלמנט (normal הוא ברירת המחדל)

content הוא חובה. בלעדיו, ::before ו-::after אף פעם לא נוצרים, לא משנה כמה מאפיינים אחרים תתנו להם.

צורות דקורטיביות עם content: ""

עם content: "", הפסאודו-אלמנט הוא תיבה ריקה שאפשר לקבוע לה גודל וצבע. כברירת מחדל הוא inline, ותיבת inline מתעלמת מ-width ומ-height, אז תנו לו display: block, inline-block, או position: absolute:

מיקום של פסאודו-אלמנט

לקישוט שיושב מעל האלמנט או סביבו, השתמשו ב-position: absolute על הפסאודו-אלמנט וב-position: relative על האלמנט עצמו, כך שההיסטים נמדדים מהאלמנט:

שימו לב לסדר כשמשלבים עם פסאודו-מחלקה: המצב בא קודם, ואחריו הפסאודו-אלמנט, .link:hover::after, ואף פעם לא .link::after:hover.

קריאת תכונות עם attr(): tooltip

attr() מושך את הערך של תכונה לתוך content, כך שכלל אחד יכול להציג טקסט שונה בכל אלמנט:

tooltip שמופיע רק ב-hover בלתי נראה למשתמשי מקלדת ומסכי מגע. לכל דבר חשוב, שימו את הטקסט בעמוד, או הציגו אותו גם ב-:focus עם tabindex="0" על האלמנט.

מספור עם מונים

מוני CSS יחד עם ::before ממספרים דברים בלי להקליד את המספרים:

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

איפה ::before ו-::after לא עובדים

פסאודו-אלמנטים נוספים בתוך האלמנט, בין התגיות שלו. אלמנטים שאין להם "בפנים" בשבילם לא יכולים להציג אותם:

  • <img>, <video>, <iframe> (אלמנטים מוחלפים)
  • <input>, <select>, <textarea> (פקדי טפסים), ו-<br>

חלק מהדפדפנים מציירים אותם על תיבת סימון או על תמונה שבורה, אבל זה לא עקבי. שימו את הפסאודו-אלמנט על עוטף במקום: <span class="field"><input></span> ועצבו את .field::after.

טעויות נפוצות

  • אין content. הסיבה הנפוצה ביותר לכך ששום דבר לא מופיע. הוסיפו content: "".
  • קביעת גודל לפסאודו-אלמנט inline. width ו-height לא עושים כלום עד שמגדירים display: block, inline-block או position: absolute.
  • סדר שגוי עם מצב. a:hover::after עובד; a::after:hover לא.
  • מיקום absolute בלי הורה ממוקם. הפסאודו-אלמנט מתיישר אז לאב קדמון רחוק כלשהו. הוסיפו position: relative לאלמנט.
  • תוכן אמיתי ב-CSS. אי אפשר לבחור או להעתיק טקסט ב-content. שמרו מידע ב-HTML.

שאלות נפוצות

מה עושה ::before ב-CSS?

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

למה ה-::before או ה-::after שלי לא מופיע?

הסיבה הנפוצה ביותר היא מאפיין content חסר: בלעדיו הפסאודו-אלמנט לא נוצר. השתמשו ב-content: "" לתיבה דקורטיבית ריקה. סיבות אחרות: פסאודו-אלמנט inline עם רוחב וגובה (תנו לו display: block או inline-block), או אלמנט כמו <img> או <input> שלא יכול להכיל אותם.

מה ההבדל בין :before ל-::before?

אין הבדל בהתנהגות. ::before עם שתי נקודתיים הוא התחביר הנוכחי שמסמן פסאודו-אלמנטים; :before עם נקודתיים אחת הוא הכתיב הישן של CSS2, שדפדפנים עדיין מקבלים עבור before, after, first-line ו-first-letter.

אפשר להשתמש ב-::before על img או input?

לא באופן אמין. פסאודו-אלמנטים נוספים בתוך התוכן של האלמנט, ולאלמנטים מוחלפים כמו <img> ולפקדי טפסים כמו <input> אין תיבת תוכן בשבילם. עטפו את האלמנט ב-<span> או ב-<div> ושימו את הפסאודו-אלמנט על העוטף.

האם קוראי מסך קוראים את התוכן של ::before ב-CSS?

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

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל