ماذا يفعل ::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: "" يصبح العنصر الزائف صندوقًا فارغًا يمكنك تحديد حجمه ولونه. هو سطري افتراضيًا، والصندوق السطري يتجاهل width وheight، لذلك أعطه display: block أو inline-block أو position: absolute:
ضبط موضع العنصر الزائف
لزخرفة تقع فوق العنصر أو حوله، استخدم position: absolute على العنصر الزائف وposition: relative على العنصر نفسه، كي تُقاس الإزاحات من العنصر:
انتبه إلى الترتيب عند الدمج مع فئة زائفة: الحالة أولًا ثم العنصر الزائف، .link:hover::after، وليس .link::after:hover أبدًا.
قراءة السمات بـ attr(): تلميح منبثق
تسحب attr() قيمة سمة إلى content، فتستطيع قاعدة واحدة عرض نص مختلف على كل عنصر:
التلميح الذي يظهر عند التمرير فقط غير مرئي لمستخدمي لوحة المفاتيح والشاشات اللمسية. لأي شيء مهم، ضع النص في الصفحة، أو أظهره أيضًا عند :focus مع tabindex="0" على العنصر.
الترقيم بالعدّادات
تُرقّم عدّادات CSS مع ::before العناصر من دون كتابة الأرقام:
أضف خطوة أو احذفها وستتحدث الأرقام من تلقاء نفسها.
أين لا يعمل ::before و::after
تُدرج العناصر الزائفة داخل العنصر، بين وسومه. العناصر التي ليس لها داخل يتسع لها لا تستطيع عرضها:
<img>و<video>و<iframe>(العناصر المستبدلة)<input>و<select>و<textarea>(عناصر التحكم في النماذج)، و<br>
بعض المتصفحات ترسمها على مربع اختيار أو صورة معطوبة، لكن ذلك غير متسق. ضع العنصر الزائف على غلاف بدلًا من ذلك: <span class="field"><input></span> ونسّق .field::after.
أخطاء شائعة
- غياب
content. السبب الأكثر شيوعًا لعدم ظهور شيء. أضفcontent: "". - تحديد حجم عنصر زائف سطري. لا تفعل
widthوheightشيئًا حتى تضبطdisplay: blockأوinline-blockأوposition: absolute. - ترتيب خاطئ مع الحالة.
a:hover::afterيعمل؛ وa::after:hoverلا يعمل. - موضع مطلق من دون أب مُموضَع. عندها يُحاذى العنصر الزائف إلى سلف بعيد. أضف
position: relativeإلى العنصر. - وضع محتوى حقيقي في CSS. النص في
contentلا يمكن تحديده أو نسخه. أبقِ المعلومات في HTML.
الأسئلة الشائعة
ماذا يفعل ::before في CSS؟
ينشئ عنصرًا زائفًا هو الابن الأول للعنصر المحدد، ويملؤه بما تحدده الخاصية content. و::after يفعل الشيء نفسه كآخر ابن. لا يوجد أي منهما في HTML، لذلك يفيدان في الأيقونات والتسميات والزخارف.
لماذا لا يظهر ::before أو ::after عندي؟
السبب الأكثر شيوعًا غياب الخاصية content: من دونها لا يُولَّد العنصر الزائف. استخدم content: "" لصندوق زخرفي فارغ. أسباب أخرى: عنصر زائف سطري له عرض وارتفاع (أعطه 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 واستخدم العناصر الزائفة للزخرفة والإشارات البصرية الصغيرة.