A CSS pseudo-element is a keyword added to a selector that lets you style a specific part of the selected element(s).
selector::pseudo-element {
property: value;
}
For example, ::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.
::first-lineThe first line-box of the originating element.
::first-letterThe first letter, number, or symbol character on the first line of its originating element.
::cueThe WebVTT cues within a selected element. This can be used to style captions and other cues in media with VTT tracks. The CSS pseudo-elements module also defines the ::postfix and ::prefix sub-pseudo elements. These are not yet supported by any browser.
Selects document sections based on content and document status, enabling those areas to be styled differently to indicate that status to the user.
::selectionThe portion of a document that has been selected.
::target-textThe document's target element. The target element is identified using the URL's fragment identifier.
::spelling-errorA portion of text that the browser thinks is misspelled.
::grammar-errorA portion of text that the browser thinks is grammatically incorrect.
::highlight()The elements in the highlight registry. It is used to create custom highlights.
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.
::beforeCreates a pseudo-element that is the first child of the selected element.
::afterCreates a pseudo-element that is the last child of the selected element.
::columnEach column fragment of a multi-column layout.
::markerThe automatically generated marker box of a list item.
::backdropThe backdrop of the originating element rendered in the top layer.
Creates a button that can control the scrolling of the scroll container to which it is applied.
::scroll-markerCreates a pseudo-element that is a scroll marker — a scroll target button for its originating element nested in a scroll-marker group.
::scroll-marker-groupGenerates a container before or after a scroll container to contain the ::scroll-marker pseudo-elements generated on the element or its descendants.
These pseudo-elements are real elements that are not otherwise selectable.
::details-contentThe expandable/collapsible contents of a <details> element.
::part()Any element within a shadow tree that has a matching part attribute.
::slotted()Any element placed into a slot inside an HTML template.
The pseudo-elements are related to form controls.
::checkmarkTargets the checkmark placed inside the currently-selected <option> element of a customizable select element to provide a visual indication of which one is selected.
The button of an <input> of type="file".
::picker()The picker part of an element, for example the drop-down picker of a customizable select element.
::picker-iconThe picker icon inside form controls that have an icon associated with them. In the case of a customizable select element, it selects the arrow that points down when the select is closed.
::placeholderThe placeholder text in an input field.
Pseudo-elements defined by a set of CSS specifications include the following:
A
B
C
::column::checkmark::cue (and ::cue())D
F
G
H
M
P
S
T
V
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:
::after ::after::marker: Selects the ::marker pseudo-element of an ::after pseudo-element, when ::after is styled as a list item, with display: list-item.::before ::before::marker: Selects the ::marker pseudo-element of a ::before pseudo-element, when ::before is styled as a list item, with display: list-item.Check out the individual pseudo-element reference pages for examples and browser compatibility information.
Highlight pseudo-elements, such as ::selection, ::target-text, ::highlight(), ::spelling-error, and ::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:
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 <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 color values, and selects the parent and child's selected text (::selection). This gives each <div> a different 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:
Try selecting the text in both the parent and child elements. Notice that:
.parent::selection..child::selection.::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;
}
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements