pseudo elements – מה הם ולמה צריך אותם

אולי יצא לכם להיתקל בעבר ב-pseudo elements - או בשם העברי ״אלמנטים מדומים״ - הנוצרים כשמשתמשים בסלקטורים :before ו-:after מבלי להבין איך הם עובדים או למה צריך אותם.

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

איך כותבים?

סלקטורי :before ו-:after נכתבים כמו סלקטורים מדומים (pseudo-selectors), למשל hover ו-active המוכרים. רק שהם נקראים אלמנטים מדומים (pseudo-elements), כי זה מה שהם עושים - יוצרים אלמנטים בתוך ה-html.

ככה נראה שימוש בסלקטור "לפני", למשל:

a:before{
  content:"here is a link";
}

ומה שנקבל בפועל הוא שהמילים "here is a link" יופיעו לפני כל הקישורים בדף.

למה צריך את זה?

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

  • פריט 1
  • פריט 2
  • פריט 3
  • פריט 4

בעזרת :before תוכלו ליצור מקפים כאלו באופן פשוט יחסית:

li{
  list-style-type:none;
  position:relative;
}
li:before{
  content: '-';
  width: .75em;
  right: -.75em;
  position: absolute;
}

מה עוד אפשר לעשות עם אלמנטים מדומים?

מבחינת עיצוב - כמעט כל מה שאפשר לעשות עם אלמנט בדף ב-css. על כל אלמנט ב-html - זמינים לנו שני אלמנטים נוספים שאפשר להחיל עליהם עיצוב. הדבר מאפשר להפחית את כמות הקוד הלא-סמנטי שבדף. למשל, אם הזדקקנו בעבר ל-span או ל-div ריקים, נוכל להמנע מכך ע"י שימוש באלמנטים מדומים.

מה אי אפשר לעשות

  1. ג'אווה-סקריפט. האלמנטים המדומים לא מופיעים בתוך ה-dom.
  2. מעברים ואנימציות מבוססי css - למעשה מדובר בבאג בוובקיט שתוקן ב-2013

התכונה content

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

.myclass:before{
  content:"";
}

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

סימנים מיוחדים

בתוך content אפשר לכתוב אותיות באנגלית בלבד*:

.myclass:before{
  content:"some text";
}

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

שימוש לדוגמה - הוספת מרכאות כפולות לפני ציטוטים:

q:before {
  content:"\201c"; /* add quotation mark before quotes */
}

* אם בכל זאת רוצים, אפשר להדביק סימנים מיוחדים או להקליד עברית, בתנאי שהקובץ שמור כ-utf8, במקרה כזה צריך לכתוב בתחילת קובץ ה-css הגדרת charset:

@charset "UTF-8";

ואז אפשר להדביק את הסימן המיוחד ישירות בתוך ה-css:

q:before {
  content:"“"; /* add quotation mark before quotes */
}

מאפיינים

ניתן להשתמש במאפיינים של האלמנט אליו מצמידים את ה"לפני/אחרי".

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

@media print {
  a[href]:after { content: " (" attr(href) ")"; }
}

תמונות

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

a[href$=".pdf"]:before{
  content:url(../img/pdf-icon.png);
}

לפני מה? אחרי מה?

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

לדוגמה, אם יש לנו דיב כזה:


<div class="box">
  content of box
</div>

וסלקטור כזה:

.box:before{
  content:"before";
}

(נייצג את המיקום של התוכן שמייצר :before באמצעות אלמנט span עם class=before)

לא נכון:

<span class="before"></span>
<div class="box">
  content of box
</div>

נכון:

<div class="box">
  <span class="before"></span>
  content of box
</div>

איפה זה נתמך?

יש תמיכה די טובה בלפני/אחרי - שכן מדובר בתכונה ששייכת ל-css2.1 ולא ל-css3. דפדפנים מודרניים וכן אקספלורר 8 ומעלה תומכים באלמנטים מדומים. כל זמן שאתם מגבילים את השימוש לנספחים עיצוביים לא-הכרחיים, אתם מכוסים. אם אתם בכל זאת רוצים לספק סגנונות חלופיים לדפדפנים שלא תומכים בזה, מודרנייזר יודע לזהות תמיכה באלמנטים המדומים (נקראים CSS generated content).

קישורים נוספים

נשמע מעניין ושימושי? הנה כמה קישורים שיעזרו לכם להשתמש באלמנטים מדומים:

תגיות:, , , ,

תגובות

נעול לתגובות.