מה ::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 והשתמשו בפסאודו-אלמנטים לקישוט ולרמזים חזותיים קטנים.