- CSS Pseudo-classes
- Syntax
- Anchor Pseudo-classes
- Example
- Pseudo-classes and HTML Classes
- Example
- Example
- Simple Tooltip Hover
- Example
- CSS — The :first-child Pseudo-class
- Match the first element
- Example
- Match the first element in all elements
- Example
- Match all elements in all first child elements
- Example
- CSS — The :lang Pseudo-class
- Example
- More Examples
- All CSS Pseudo Classes
- All CSS Pseudo Elements
- Pseudo-classes and pseudo-elements
- What is a pseudo-class?
- Simple pseudo-class example
- User-action pseudo classes
- What is a pseudo-element?
- Combining pseudo-classes and pseudo-elements
- Generating content with ::before and ::after
- Summary
- See also
- Found a content problem with this page?
CSS Pseudo-classes
A pseudo-class is used to define a special state of an element.
For example, it can be used to:
- Style an element when a user mouses over it
- Style visited and unvisited links differently
- Style an element when it gets focus
Syntax
The syntax of pseudo-classes:
Anchor Pseudo-classes
Links can be displayed in different ways:
Example
/* unvisited link */
a:link color: #FF0000;
>
/* visited link */
a:visited color: #00FF00;
>
/* mouse over link */
a:hover color: #FF00FF;
>
/* selected link */
a:active color: #0000FF;
>
Note: a:hover MUST come after a:link and a:visited in the CSS definition in order to be effective! a:active MUST come after a:hover in the CSS definition in order to be effective! Pseudo-class names are not case-sensitive.
Pseudo-classes and HTML Classes
Pseudo-classes can be combined with HTML classes:
When you hover over the link in the example, it will change color:
Example
Hover on
An example of using the :hover pseudo-class on a element:
Example
Simple Tooltip Hover
Hover over a element to show a
element (like a tooltip):
Hover over me to show the
element.
Example
p <
display: none;
background-color: yellow;
padding: 20px;
>
CSS — The :first-child Pseudo-class
The :first-child pseudo-class matches a specified element that is the first child of another element.
Match the first
element
In the following example, the selector matches any
element that is the first child of any element:
Example
Match the first element in all
elements
In the following example, the selector matches the first element in all
elements:
Example
Match all elements in all first child
elements
In the following example, the selector matches all elements in
elements that are the first child of another element:
Example
CSS — The :lang Pseudo-class
The :lang pseudo-class allows you to define special rules for different languages.
In the example below, :lang defines the quotation marks for elements with lang=»no»:
Example
Some text A quote in a paragraph
Some text.
More Examples
Add different styles to hyperlinks
This example demonstrates how to add other styles to hyperlinks.
Use of :focus
This example demonstrates how to use the :focus pseudo-class.
All CSS Pseudo Classes
Selector | Example | Example description |
---|---|---|
:active | a:active | Selects the active link |
:checked | input:checked | Selects every checked element |
:disabled | input:disabled | Selects every disabled element |
:empty | p:empty | Selects every element that has no children |
:enabled | input:enabled | Selects every enabled element |
:first-child | p:first-child | Selects every elements that is the first child of its parent |
:first-of-type | p:first-of-type | Selects every element that is the first element of its parent |
:focus | input:focus | Selects the element that has focus |
:hover | a:hover | Selects links on mouse over |
:in-range | input:in-range | Selects elements with a value within a specified range |
:invalid | input:invalid | Selects all elements with an invalid value |
:lang(language) | p:lang(it) | Selects every element with a lang attribute value starting with «it» |
:last-child | p:last-child | Selects every elements that is the last child of its parent |
:last-of-type | p:last-of-type | Selects every element that is the last element of its parent |
:link | a:link | Selects all unvisited links |
:not(selector) | :not(p) | Selects every element that is not a element |
:nth-child(n) | p:nth-child(2) | Selects every element that is the second child of its parent |
:nth-last-child(n) | p:nth-last-child(2) | Selects every element that is the second child of its parent, counting from the last child |
:nth-last-of-type(n) | p:nth-last-of-type(2) | Selects every element that is the second element of its parent, counting from the last child |
:nth-of-type(n) | p:nth-of-type(2) | Selects every element that is the second element of its parent |
:only-of-type | p:only-of-type | Selects every element that is the only element of its parent |
:only-child | p:only-child | Selects every element that is the only child of its parent |
:optional | input:optional | Selects elements with no «required» attribute |
:out-of-range | input:out-of-range | Selects elements with a value outside a specified range |
:read-only | input:read-only | Selects elements with a «readonly» attribute specified |
:read-write | input:read-write | Selects elements with no «readonly» attribute |
:required | input:required | Selects elements with a «required» attribute specified |
:root | root | Selects the document’s root element |
:target | #news:target | Selects the current active #news element (clicked on a URL containing that anchor name) |
:valid | input:valid | Selects all elements with a valid value |
:visited | a:visited | Selects all visited links |
All CSS Pseudo Elements
Selector | Example | Example description |
---|---|---|
::after | p::after | Insert content after every element |
::before | p::before | Insert content before every element |
::first-letter | p::first-letter | Selects the first letter of every element |
::first-line | p::first-line | Selects the first line of every element |
::marker | ::marker | Selects the markers of list items |
::selection | p::selection | Selects the portion of an element that is selected by a user |
Pseudo-classes and pseudo-elements
The next set of selectors we will look at are referred to as pseudo-classes and pseudo-elements. There are a large number of these, and they often serve quite specific purposes. Once you know how to use them, you can look at the list to see if there is something which works for the task you are trying to achieve. Once again the relevant MDN page for each selector is helpful in explaining browser support.
Prerequisites: | Basic computer literacy, basic software installed, basic knowledge of working with files, HTML basics (study Introduction to HTML), and an idea of how CSS works (study CSS first steps). |
---|---|
Objective: | To learn about the pseudo-class and pseudo-element selectors. |
What is a pseudo-class?
A pseudo-class is a selector that selects elements that are in a specific state, e.g. they are the first element of their type, or they are being hovered over by the mouse pointer. They tend to act as if you had applied a class to some part of your document, often helping you cut down on excess classes in your markup, and giving you more flexible, maintainable code.
Pseudo-classes are keywords that start with a colon. For example, :hover is a pseudo-class.
Simple pseudo-class example
Let’s look at a simple example. If we wanted to make the first paragraph in an article larger and bold, we could add a class to that paragraph and then add CSS to that class, as shown in the first example below:
However, this could be annoying to maintain — what if a new paragraph got added to the top of the document? We’d need to move the class over to the new paragraph. Instead of adding the class, we could use the :first-child pseudo-class selector — this will always target the first child element in the article, and we will no longer need to edit the HTML (this may not always be possible anyway, maybe due to it being generated by a CMS).
All pseudo-classes behave in this same kind of way. They target some bit of your document that is in a certain state, behaving as if you had added a class into your HTML. Take a look at some other examples on MDN:
Note: It is valid to write pseudo-classes and elements without any element selector preceding them. In the example above, you could write :first-child and the rule would apply to any element that is the first child of an element, not just a paragraph first child — :first-child is equivalent to *:first-child . However, usually you want more control than that, so you need to be more specific.
User-action pseudo classes
Some pseudo-classes only apply when the user interacts with the document in some way. These user-action pseudo-classes, sometimes referred to as dynamic pseudo-classes, act as if a class had been added to the element when the user interacts with it. Examples include:
- :hover — mentioned above; this only applies if the user moves their pointer over an element, typically a link.
- :focus — only applies if the user focuses the element by clicking or using keyboard controls.
What is a pseudo-element?
Pseudo-elements behave in a similar way. However, they act as if you had added a whole new HTML element into the markup, rather than applying a class to existing elements.
Pseudo-elements start with a double colon :: . ::before is an example of a pseudo-element.
Note: Some early pseudo-elements used the single colon syntax, so you may sometimes see this in code or examples. Modern browsers support the early pseudo-elements with single- or double-colon syntax for backwards compatibility.
For example, if you wanted to select the first line of a paragraph you could wrap it in a element and use an element selector; however, that would fail if the number of words you had wrapped were longer or shorter than the parent element’s width. As we tend not to know how many words will fit on a line — as that will change if the screen width or font-size changes — it is impossible to robustly do this by adding HTML.
The ::first-line pseudo-element selector will do this for you reliably — if the number of words increases or decreases it will still only select the first line.
It acts as if a was magically wrapped around that first formatted line, and updated each time the line length changed.
You can see that this selects the first line of both paragraphs.
Combining pseudo-classes and pseudo-elements
If you wanted to make the first line of the first paragraph bold you could chain the :first-child and ::first-line selectors together. Try editing the previous live example so it uses the following CSS. We are saying that we want to select the first line, of the first
element, which is inside an element.
article p:first-child::first-line font-size: 120%; font-weight: bold; >
Generating content with ::before and ::after
There are a couple of special pseudo-elements, which are used along with the content property to insert content into your document using CSS.
You could use these to insert a string of text, such as in the live example below. Try changing the text value of the content property and see it change in the output. You could also change the ::before pseudo-element to ::after and see the text inserted at the end of the element instead of the beginning.
Inserting strings of text from CSS isn’t really something we do very often on the web however, as that text is inaccessible to some screen readers and might be hard for someone to find and edit in the future.
A more valid use of these pseudo-elements is to insert an icon, for example the little arrow added in the example below, which is a visual indicator that we wouldn’t want read out by a screen reader:
These pseudo-elements are also frequently used to insert an empty string, which can then be styled just like any element on the page.
In this next example, we have added an empty string using the ::before pseudo-element. We have set this to display: block in order that we can style it with a width and height. We then use CSS to style it just like any element. You can play around with the CSS and change how it looks and behaves.
The use of the ::before and ::after pseudo-elements along with the content property is referred to as «Generated Content» in CSS, and you will often see this technique being used for various tasks. A great example is the site CSS Arrow Please, which helps you to generate an arrow with CSS. Look at the CSS as you create your arrow and you will see the ::before and ::after pseudo-elements in use. Whenever you see these selectors, look at the content property to see what is being added to the HTML element.
Summary
In this article we’ve introduced CSS pseudo-classes and pseudo-elements, which are special types of selectors.
Pseudo-classes enable you to target an element when it’s in a particular state, as if you had added a class for that state to the DOM. Pseudo-elements act as if you had added a whole new element to the DOM, and enable you to style that. The ::before and ::after pseudo-elements enable you to insert content into the document using CSS.
In the next article, we’ll learn about combinators.
See also
Found a content problem with this page?
This page was last modified on Jun 30, 2023 by MDN contributors.