The content CSS property replaces an element with a generated value. Objects inserted using the content property are anonymous replaced elements.

Try it


/* Keywords that cannot be combined with other values */
content: normal;
content: none;

/* <image> values */
content: url("http://www.example.com/test.png");
content: linear-gradient(#e66465, #9198e5);
content: image-set("image1x.png" 1x, "image2x.png" 2x);

/* alt text for generated content, added in the Level 3 specification */
content: url("http://www.example.com/test.png") / "This is the alt text";

/* <string> value */
content: "prefix";

/* list of content values */
content: "prefix" url("http://www.example.com/test.png");
content: "prefix" url("http://www.example.com/test.png") "suffix" /
  "This is some alt text";

/* <counter> values, optionally with <list-style-type> */
content: counter(chapter_counter);
content: counter(chapter_counter, upper-roman);
content: counters(section_counter, ".");
content: counters(section_counter, ".", decimal-leading-zero);

/* attr() value linked to the HTML attribute value */
content: attr(value string);

/* Language- and position-dependent keywords */
content: open-quote;
content: close-quote;
content: no-open-quote;
content: no-close-quote;

/* Except for normal and none, several values can be used simultaneously */
content: open-quote counter(chapter_counter);

/* Global values */
content: inherit;
content: initial;
content: revert;
content: revert-layer;
content: unset;



When applied to a pseudo-element, the pseudo-element is not generated. If applied to an element, the value has no effect.


Computes to none for the ::before and ::after pseudo-elements.


Specifies the "alt text" for the element. This value can be any number of text characters. Non-Latin characters must be encoded using their Unicode escape sequences: for example, \000A9 represents the copyright symbol.


A list of anonymous inline boxes that will replace the content of the selected element (in the specified order). This list can include strings, images, counters, and so on.


An <image>, denoted by the url() or <gradient> data type, or part of the webpage, defined by the element() function, denoting the content to display.


The value of a CSS counter, generally a number produced by computations defined by <counter-reset> and <counter-increment> properties. It can be displayed using either the counter() or counters() function.

The counter() function has two forms: 'counter(name)' or 'counter(name, style)'. The generated text is the value of the innermost counter of the given name in scope at the given pseudo-element. It is formatted in the specified <list-style-type> (decimal by default).

The counters() function also has two forms: 'counters(name, string)' or 'counters(name, string, style)'. The generated text is the value of all counters with the given name in scope at the given pseudo-element, from outermost to innermost, separated by the specified string. The counters are rendered in the indicated <list-style-type> (decimal by default).


The value of the element's attribute x as a string. If there is no attribute x, an empty string is returned. The case-sensitivity of attribute names depends on the document language.

open-quote | close-quote

These values are replaced by the appropriate string from the quotes property.

no-open-quote | no-close-quote

Introduces no content, but increments (decrements) the level of nesting for quotes.

<content-list> / "Alternative text"

Alternative text may be specified for an image (or list of content items) by appending a forward slash and then the text. The alternative text is intended for speech output by screen-readers, but may also be displayed in some browsers. Note that if the browser does not support alternative text, neither the content or alternative text will be used.

Accessibility concerns

CSS-generated content is not included in the DOM. Because of this, it will not be represented in the accessibility tree and certain assistive technology/browser combinations will not announce it. If the content conveys information that is critical to understanding the page's purpose, it is better to include it in the main document.

Formal definition

Initial value normal
Applies to All elements, tree-abiding pseudo-elements, and page margin boxes
Inherited no
Computed value On elements, always computes to normal. On ::before and ::after, if normal is specified, computes to none. Otherwise, for URI values, the absolute URI; for attr() values, the resulting string; for other keywords, as specified.
Animation type discrete

Formal syntax

content = 
normal |
none |
[ <content-replacement> | <content-list> ] [ / [ <string> | <counter> ]+ ]? |
element( )

<content-replacement> =

<content-list> =
[ <string> | contents | <image> | <counter> | <quote> | <target> | <leader()> ]+

<counter> =
<counter()> |

<image> =
<url> |

<quote> =
open-quote |
close-quote |
no-open-quote |

<target> =
<target-counter()> |
<target-counters()> |

<leader()> =
leader( <leader-type> )

<counter()> =
counter( <counter-name> , <counter-style>? )

<counters()> =
counters( <counter-name> , <string> , <counter-style>? )

<url> =
url( <string> <url-modifier>* ) |
src( <string> <url-modifier>* )

<target-counter()> =
target-counter( [ <string> | <url> ] , <custom-ident> , <counter-style>? )

<target-counters()> =
target-counters( [ <string> | <url> ] , <custom-ident> , <string> , <counter-style>? )

<target-text()> =
target-text( [ <string> | <url> ] , [ content | before | after | first-letter ]? )

<leader-type> =
dotted |
solid |
space |

<counter-style> =
<counter-style-name> |

<symbols()> =
symbols( <symbols-type>? [ <string> | <image> ]+ )

<symbols-type> =
cyclic |
numeric |
alphabetic |
symbolic |


Headings and quotes

This example inserts quotation marks around quotes, and adds the word "Chapter" before headings.


  According to Sir Tim Berners-Lee,
  <q cite="http://www.w3.org/People/Berners-Lee/FAQ.html#Internet">
    I was lucky enough to invent the Web at the time when the Internet already
    existed - and had for a decade and a half.
  We must understand that there is nothing fundamentally wrong with building on
  the contributions of others.

  According to the Mozilla Manifesto,
  <q cite="http://www.mozilla.org/en-US/about/manifesto/">
    Individuals must have the ability to shape the Internet and their own
    experiences on the Internet.
  Therefore, we can infer that contributing to the open web can protect our own
  individual experiences on it.


q {
  color: blue;

q::before {
  content: open-quote;

q::after {
  content: close-quote;

h1::before {
  content: "Chapter "; /* The trailing space creates separation
                          between the added content and the
                          rest of the content */


Image combined with alternative text

This example inserts an image before the link and provides alternative text that a screen reader can output as speech. Some browsers may also display the alternative text.


<a href="https://www.mozilla.org/en-US/">Mozilla Home Page</a>


The CSS to show the image and set the alternative text is shown below. This also sets the font and color for the content. This will only be used on browsers that display the alternative text.

a::before {
  content: url("https://mozorg.cdn.mozilla.net/media/img/favicon.ico") /
    " MOZILLA: ";
  font: x-small Arial, sans-serif;
  color: gray;


The browser should display the icon before the link below. If using a screen reader, it should speak the word "MOZILLA" when it reaches the image.

Note that on a browser that does not support the alternative text syntax, the whole line is invalid. In this case neither the image or alternative text will be used! You could partially address this issue by including CSS that adds the image before the line with them both.

Targeting classes

This example inserts additional text after special items in a list.


<h2>Paperback Best Sellers</h2>
  <li>Political Thriller</li>
  <li class="new-entry">Halloween Stories</li>
  <li>My Biography</li>
  <li class="new-entry">Vampire Romance</li>


.new-entry::after {
  content: " New!"; /* The leading space creates separation
                       between the added content and the
                       rest of the content */
  color: red;


Images and element attributes

This example inserts an image before each link, and adds its id attribute after.


  <li><a id="moz" href="https://www.mozilla.org/"> Mozilla Home Page</a></li>
    <a id="mdn" href="https://developer.mozilla.org/">
      Mozilla Developer Network</a


a {
  text-decoration: none;
  border-bottom: 3px dotted navy;

a::after {
  content: " (" attr(id) ")";

#moz::before {
  content: url("https://mozorg.cdn.mozilla.net/media/img/favicon.ico");

#mdn::before {
  content: url("mdn-favicon16.png");

li {
  margin: 1em;


Element replacement

This example replaces an element's content with an image. You can replace the contents of an element with either a url() or an <image> value. Content added with ::before or ::after will not be generated as the contents of the element have been replaced.


<div id="replaced">Mozilla</div>


#replaced {
  content: url("mdn.svg");

/* will not show if element replacement is supported */
#replaced::after {
  content: " (" attr(id) ")";



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
content 1 12 1 8 4 1 4.4 18 4 10.1 1 1.0
alt_text 77 79 No No 64 No 77 77 No 55 No 12.0
element_replacement 28 79 63 No 7 9 4.4 28 63 10.1 9 1.5
none_applies_to_elements No No 91 No No No No No No No No No
url 1 12 1 8 7 1 37 18 4 14 1 1.0

See also

© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.