A CSS pseudo-element is a keyword added to a selector that lets you style a specific part of the selected element(s).
Note: This page is an index of all pseudo-elements in CSS. The CSS pseudo-elements page introduces the module that defines some, but not all, of these pseudo-elements.
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).
The specifications allow some pseudo-elements to be selected based on the current state of the originating element. In these cases, the pseudo-element is selected only when it is in the same state. For example, ::picker(select):hover selects the currently hovered descendant of a customizable <select> element, excluding the first <button> child, which is not selected by the ::picker() pseudo-element. Note, however, that when a selector list contains an invalid selector, the entire style block is ignored, so make sure the state you're including is supported on the pseudo-element to which it is attached.
::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.
::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.
::search-textSearch results identified by the user agent's "Find" or "Find in page" text search feature.
::selectionThe portion of a document that has been selected.
::spelling-errorA portion of text that the browser thinks is misspelled.
::target-textThe document's target element. The target element is identified using the URL's fragment identifier.
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
D
F
G
H
M
P
S
T
V
::view-transition::view-transition-image-pair()::view-transition-group()::view-transition-new()::view-transition-old()Non-standard vendor-prefixed pseudo-elements include:
-moz- prefix::-moz-color-swatch::-moz-focus-inner::-moz-list-bullet::-moz-list-number::-moz-meter-bar::-moz-progress-bar::-moz-range-progress::-moz-range-thumb::-moz-range-track-webkit- prefix::-webkit-inner-spin-button::-webkit-meter-bar::-webkit-meter-even-less-good-value::-webkit-meter-inner-element::-webkit-meter-optimum-value::-webkit-meter-suboptimum-value::-webkit-progress-bar::-webkit-progress-inner-element::-webkit-progress-value::-webkit-scrollbar::-webkit-search-cancel-button::-webkit-search-results-button::-webkit-slider-runnable-track::-webkit-slider-thumbYou 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;
}