docs.rodeo

MDN Web Docs mirror

Pseudo-elements

A CSS pseudo-element is a keyword added to a selector that lets you style a specific part of the selected element(s).

Syntax

selector::pseudo-element {
  property: value;
}

For example, {{CSSxRef("::first-line")}}  can be used to change the font of the first line of a paragraph.

/* The first line of every <p> element. */
p::first-line {
  color: blue;
  text-transform: uppercase;
}

Double colons (::) are used for pseudo-elements. This distinguishes pseudo-elements from pseudo-classes that use a single colon (:) in their notation. Note, browsers support single colon syntax for the original four pseudo-elements: ::before, ::after, ::first-line, and ::first-letter.

Pseudo-elements do not exist independently. The element of which a pseudo-element is a part is called its originating element. A pseudo-element must appear after all the other components in the complex or compound selector. The last element in the selector is the originating element of the pseudo-element. For example, you can select a paragraph’s first line using p::first-line but not the first-line’s children. So p::first-line > * is invalid.

A pseudo-element can be selected based on the current state of the originating element. For example, p:hover::first-line selects the first line (pseudo-element) of a paragraph when the paragraph itself is being hovered (pseudo-class).

[!NOTE] When a selector list contains an invalid selector, the entire style block is ignored.

Typographic pseudo-elements

Highlight pseudo-elements

Selects document sections based on content and document status, enabling those areas to be styled differently to indicate that status to the user.

Tree-Abiding pseudo-elements

These pseudo-elements behave like regular elements, fitting seamlessly within the box model. They act as a child element that can be styled directly within the originating element hierarchy.

Element-backed pseudo-elements

These pseudo-elements are real elements that are not otherwise selectable.

The pseudo-elements are related to form controls.

Alphabetical index

Pseudo-elements defined by a set of CSS specifications include the following:

A

B

C

D

F

G

H

M

P

S

T

V

Nesting pseudo-elements

You can chain some pseudo-element selectors together to style pseudo-elements nested inside other pseudo-elements. The following nested pseudo-element combinations are supported:

Check out the individual pseudo-element reference pages for examples and browser compatibility information.

Highlight pseudo-elements inheritance

Highlight pseudo-elements, such as {{CSSxref("::selection")}} , {{CSSxref("::target-text")}} , {{CSSxref("::highlight()")}} , {{CSSxref("::spelling-error")}} , and {{CSSxref("::grammar-error")}} , follow a consistent inheritance model that differs from regular element inheritance.

When you apply styles to highlight pseudo-elements, they inherit from both:

  1. Their parent elements (following normal inheritance).
  2. The highlight pseudo-elements of their parent elements (following highlight inheritance).

This means that if you style both a parent element’s highlight pseudo-element and a child element’s highlight pseudo-element, the child’s highlighted text will combine properties from both sources.

Here is a concrete example.

First, we have some HTML that includes two nested {{htmlelement("div")}}  elements. Some of the included text content is contained directly inside the parent <div>, and some is nested inside the child <div>.

<div class="parent">
  Parent text
  <div class="child">Child text</div>
</div>

Next we include some CSS, which selects the parent and child <div> elements separately and gives them different {{cssxref("color")}}  values, and selects the parent and child’s selected text ({{cssxref("::selection")}} ). This gives each <div> a different {{cssxref("background-color")}}  and sets a different text color on the parent selection.

/* Style for the parent element */
.parent {
  color: blue;
}

/* Style for the parent's selected text */
.parent::selection {
  background-color: yellow;
  color: red;
}

/* Style for the child element */
.child {
  color: green;
}

/* Style for the child's selected text */
.child::selection {
  background-color: orange;
}

The example renders as follows:

{{EmbedLiveSample("highlight_inheritance", , "150")}} 

Try selecting the text in both the parent and child elements. Notice that:

  1. When you select the parent text, it uses the yellow background and red text color defined in .parent::selection.
  2. When you select the child text, it uses:
    • The orange background from .child::selection.
    • The red text color inherited from the parent’s ::selection pseudo-element.

This demonstrates how the child’s highlight pseudo-element inherits from both its parent element and the parent’s highlight pseudo-element.

CSS custom properties (variables) in highlight pseudo-elements inherit from their originating element (the element they’re being applied to), not through the highlight inheritance chain. For example:

:root {
  --selection-color: lightgreen;
}

::selection {
  color: var(--selection-color);
}

.blue {
  --selection-color: blue;
}

When using the universal selector with highlight pseudo-elements, it prevents highlight inheritance. For example:

/* This prevents highlight inheritance */
*::selection {
  color: lightgreen;
}

/* Prefer this to allow inheritance */
:root::selection {
  color: lightgreen;
}

Specifications

{{Specifications}} 

See also

In this article

View on MDN