::before (:before)
In CSS, ::before
creates a pseudo-element that is the first child of the selected element. It is often used to add cosmetic content to an element with the content
property. It is inline by default.
/* Add a heart before links */ a::before { content: "♥"; }
Note: The pseudo-elements generated by ::before
and ::after
are contained by the element's formatting box, and thus don't apply to replaced elements such as <img>
, or to <br>
elements.
Syntax
/* CSS3 syntax */ ::before /* CSS2 syntax */ :before
Note: CSS3 introduced the ::before
notation (with two colons) to distinguish pseudo-classes from pseudo-elements. Browsers also accept :before
, introduced in CSS2.
Examples
Adding quotation marks
One simple example of using ::before
pseudo-elements is to provide quotation marks. Here we use both ::before
and
to insert quotation characters.::after
HTML
<q>Some quotes</q>, he said, <q>are better than none.</q>
CSS
q::before { content: "«"; color: blue; } q::after { content: "»"; color: red; }
Result
Decorative example
We can style text or images in the content
property almost any way we want.
HTML
<span class="ribbon">Notice where the orange box is.</span>
CSS
.ribbon { background-color: #5BC8F7; } .ribbon::before { content: "Look at this orange box."; background-color: #FFBA10; border-color: black; border-style: dotted; }
Result
To-do list
In this example we will create a simple to-do list using pseudo-elements. This method can often be used to add small touches to the UI and improve user experience.
HTML
<ul> <li>Buy milk</li> <li>Take the dog for a walk</li> <li>Exercise</li> <li>Write code</li> <li>Play music</li> <li>Relax</li> </ul>
CSS
li { list-style-type: none; position: relative; margin: 2px; padding: 0.5em 0.5em 0.5em 2em; background: lightgrey; font-family: sans-serif; } li.done { background: #CCFF99; } li.done::before { content: ''; position: absolute; border-color: #009933; border-style: solid; border-width: 0 0.3em 0.25em 0; height: 1em; top: 1.3em; left: 0.6em; margin-top: -1em; transform: rotate(45deg); width: 0.5em; }
JavaScript
var list = document.querySelector('ul'); list.addEventListener('click', function(ev) { if (ev.target.tagName === 'LI') { ev.target.classList.toggle('done'); } }, false);
Here is the above code example running live. Note that there are no icons used, and the check-mark is actually the ::before
that has been styled in CSS. Go ahead and get some stuff done.
Result
Special characters
As this is CSS; not HTML, you can not use markup entities in content values. If you need to use a special character, and can not enter it literally into your CSS content string, use a unicode escape sequence, consisting of a backslash followed by the hexadecimal unicode value.
HTML
<ol> <li>Crack Eggs into bowl</li> <li>Add Milk</li> <li>Add Flour</li> <li aria-current='step'>Mix thoroughly into a smooth batter</li> <li>Pour a ladleful of batter onto a hot, greased, flat frying pan</li> <li>Fry until the top of the pancake loses its gloss</li> <li>Flip it over and fry for a couple more minutes</li> <li>serve with your favorite topping</li> </ol>
CSS
li { padding:0.5em; } li[aria-current='step'] { font-weight:bold; } li[aria-current='step']::after { content: " \21E6"; /* Hexadecimal for Unicode Leftwards white arrow*/ display: inline; }
Result
Specifications
Browser compatibility
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | |
::before |
1
1
|
12
12
|
1.5
["Before Firefox 57, Firefox had a bug where
::before pseudo-elements were still generated, even if the content property value were set to normal or none .", "Before Firefox 3.5, only the CSS level 2 behavior of :before was supported, which disallowed position , float , list-style-* and some display properties."]1
|
9
8
|
7
4
|
4
4
|
≤37
≤37
|
18
18
|
4
Before Firefox 57, Firefox had a bug where
::before pseudo-elements were still generated, even if the content property value were set to normal or none .4
|
10.1
10.1
|
3
3
|
1.0
1.0
|
animation_and_transition_support |
26 |
12 |
4 |
No |
15 |
No |
≤37 |
26 |
4 |
14 |
No |
1.5 |
See also
© 2005–2021 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/::before