Table of Contents

CSS: Pseudo-classes

A CSS pseudo-class is a keyword added to a selector that lets you select elements based on information that lies outside of the document tree, such as a specific state of the selected element(s). For example, the pseudo-class :hover can be used to style a button when a user's pointer hovers over it.

Learn more: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-classes

Elemental pseudo-classes

Relate to the core identity of elements.

:defined

Matches any element that is defined.

:heading

Matches any heading element (<h1>-<h6>).


Element display state pseudo-classes

These pseudo-classes enable the selection of elements based on their display states.

:open

Represents an element that has open and closed states, only when it is currently in the open state.

The following elements have the ability to be opened: <details>, <dialog>, <input>, <select>.

:popover-open

Matches a popover element that is currently in the showing state.

Matches an element that is in a state in which it excludes all interaction with elements outside it until the interaction has been dismissed.

:fullscreen

Matches an element that is currently in fullscreen mode.

:picture-in-picture

Matches an element that is currently in picture-in-picture mode.

:xr-overlay

Matches the DOM overlay element during an immersive AR or VR session.


Input pseudo-classes

These pseudo-classes relate to form elements, and enable selecting elements based on HTML attributes and the state that the field is in before and after interaction.

:enabled

Represents a user interface element that is in an enabled state.

:disabled

Represents a user interface element that is in a disabled state.

:read-only

Represents any element that cannot be changed by the user.

:read-write

Represents any element that is user-editable.

:placeholder-shown

Matches an input element that is displaying placeholder text.

:autofill

Matches when an <input> has been autofilled by the browser.

:default

Matches one or more UI elements that are the default among a set of elements.

:checked

Matches when elements such as checkboxes and radio buttons are toggled on.

:indeterminate

Matches UI elements when they are in an indeterminate state.

:blank

Matches a user-input element which is empty, containing an empty string or other null input.

:valid

Matches an element with valid contents. For example, an input element with the type 'email' that contains a validly formed email address or an empty value if the control is not required.

:invalid

Matches an element with invalid contents. For example, an input element with type 'email' with a name entered.

:in-range

Applies to elements with range limitations. For example, a slider control when the selected value is in the allowed range.

:out-of-range

Applies to elements with range limitations. For example, a slider control when the selected value is outside the allowed range.

:required

Matches when a form element is required.

:optional

Matches when a form element is optional.

:user-valid

Represents an element with correct input, but only when the user has interacted with it.

:user-invalid

Represents an element with incorrect input, but only when the user has interacted with it.


Linguistic pseudo-classes

These pseudo-classes reflect the document language and enable the selection of elements based on language or script direction.

:dir()

The directionality pseudo-class selects an element based on its directionality as determined by the document language.

/* Selects any element with right-to-left text */
 
:dir(rtl) {
  background-color: red;
}

:lang()

Select an element based on its content language.

/* Select element with the lang="en-US" attribute */
 
*:lang(en-US) {
  background-color: pink;
}

Location pseudo-classes

These pseudo-classes relate to links, and to targeted elements within the current document.

Matches an element if the element would match either :link or :visited.

Matches links that have not yet been visited.

:visited

Matches links that have been visited.

Matches links whose absolute URL is the same as the target URL. For example, anchor links to the same page.

:target

Matches the element which is the target of the document URL. For example:

/* Selects document's target element:
/* Current URL = http://www.example.com/help/#setup 
/* this CSS will select the element with id="setup" */
 
:target {
  border: 2px solid black;
}

:scope

Represents elements that are a reference point for selectors to match against.


Resource state pseudo-classes

These pseudo-classes apply to media that is capable of being in a state where it would be described as playing, such as a video.

:playing

Represents a playable element that is playing.

:paused

Represents a playable element that is paused.

:seeking

Represents a playable element that is currently seeking a playback position in the media resource.

:buffering

Represents a playable element that is playing but is temporarily stalled because it is downloading the media resource.

:stalled

Represents a playable element that is playing but is stalled because it cannot download the media resource.

:muted

Represents a sound-producing element that is muted.

:volume-locked

Represents a sound-producing element that has its volume level locked by the browser.


Tree-structural pseudo-classes

These pseudo-classes relate to the location of an element within the document tree.

:root

Represents an element that is the root of the document. In HTML this is usually the <html> element.

:empty

Represents an element with no children other than white-space characters.

:nth-child()

Selects child elements according to their position among all the sibling elements within a parent element. Uses An+B notation.

/* Selects odd rows of an HTML table */
tr:nth-child(odd) { }
 
/* Selects the seventh <li> element in a list */
li:nth-child(7) { }
 
/* Selects the seventh and all following elements */
:nth-child(n+7) { }

:nth-last-child()

Matches elements based on their position among a group of siblings, counting from the end. Uses An+B notation.

:first-child

Matches an element that is the first of its siblings.

:last-child

Matches an element that is the last of its siblings.

:only-child

Matches an element that has no siblings. For example, a list item with no other list items in that list.

:heading()

Represents all heading elements whose levels match a comma-separated list of integers. This allows you to style elements at specific heading levels at once, rather than matching and styling them individually. Uses An+B notation.

:nth-of-type()

Matches elements based on their position among siblings of the same type (tag name). Uses An+B notation.

:nth-last-of-type()

Matches elements based on their position among siblings of the same type (tag name), counting from the end.

:first-of-type

Represents the first element of its type (tag name) among a group of sibling elements.

/* Selects the first <p> element among siblings */
 
p:first-of-type { }

:last-of-type

Represents the last element of its type (tag name) among a group of sibling elements.

/* Selects the last <p> element among siblings */
 
p:last-of-type { }

:only-of-type

Represents an element that has no siblings of the same type (tag name).


User action pseudo-classes

These pseudo-classes require some interaction by the user in order for them to apply, such as holding a mouse pointer over an element.

:hover

Matches when a user designates an item with a pointing device, such as holding the mouse pointer over the item.

:active

Matches when an item is being activated by the user. For example, when the item is clicked on.

:focus

Matches when an element has focus.

:focus-visible

Matches when an element has focus and the user agent identifies that the element should be visibly focused.

:focus-within

Matches an element to which :focus applies, plus any element that has a descendant to which :focus applies.

:target-current

Selects the active scroll marker — the scroll marker of a scroll-marker-group that is currently scrolled to. This selector can be used to style the active navigation position within a scroll marker group.


Functional pseudo-classes

These pseudo-classes accept a selector list or forgiving selector list as a parameter.

Forgiving selector list: :is() and :where() accept forgiving selector lists. This means that if any of the selectors provided are invalid, they will simply be ignored instead of breaking the entire rule.

:is()

The “matches any” pseudo-class. Takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a much more compact form.

/* More cumbersome */
section h1,
article h1,
aside h1,
nav h1 {
  font-size: 32px;
}
 
/* More compact */
:is(section, article, aside, nav) h1 {
  font-size: 32px;
}

:not()

The “matches none” pseudo-class. Represents elements that do not match a list of selectors.

/* Matches all <p> elements without the class .irrelevant */
 
p:not(.irrelevant) {
  font-weight: bold;
}

:where()

Takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. The difference between :where() and :is() is that :where() always has 0 specificity, whereas :is() takes on the specificity of the most specific selector in its arguments.

:has()

Represents an element if any of the relative selectors that are passed as an argument match at least one element when anchored against this element. This pseudo-class presents a way of selecting a parent element or a previous sibling element with respect to a reference element by taking a relative selector list as an argument.