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

להתחיל