CSS pseudo-classes selectors select the HTML elements based on their state or position. For example,
button:hover {
background-color: red;
color:black;
}
Browser Output
Here, hover
pseudo-class changes the styles of button while
placing the mouse over it.
Syntax of Pseudo Class Selector
The syntax of a pseudo-class selector is as follows:
element:pseudo-class {
/* CSS styles */
}
Here,
element
: specifies the HTML element-
pseudo-class
: specifies the specific state of the element that we want to target
Pseudo-class keywords are added to the selectors and preceded by a colon
(:
).
Types of Pseudo-Classes
There are the following types of pseudo-classes in CSS:
-
Structural pseudo-class: Selects elements based on
their position in document such as
:first-child
,:last-child
, etc.
-
Link pseudo-class: Selects the links based on their
state such as
:link
,:visited
, etc.
-
UI pseudo-class: Selects the form elements based on
their state such as
:enabled
,:disabled
, etc.
Let's learn each of them in detail.
Structural Pseudo-Classes
Structural pseudo-class selects elements based on their position in the document. There are following structural pseudo-classes.
CSS first-child Pseudo-Class
The first-child
pseudo-class selector styles the first child of
its parent element. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS first-child</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div>
<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>
<p>This is the third paragraph.</p>
</div>
</body>
</html>
div p:first-child {
color: red;
}
Browser Output
Here, the div p:first-child
selector selects the first
paragraph element that is a direct child of the div
element and
changes its color to red
.
CSS last-child Pseudo-Class
The last-child
pseudo-class selector styles the last child of
its parent element. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS last-child</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div>
<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>
<p>This is the third paragraph.</p>
</div>
</body>
</html>
div p:last-child {
color: red;
}
Browser Output
Here, the div p:last-child
selector selects the last paragraph
element that is a direct child of the div
element and changes
its color to red
.
CSS first-of-type Pseudo-Class
The first-of-type
pseudo-class selector styles the first
element of a particular type within the parent. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS first-of-type</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h2>Section one</h2>
<div>
<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>
</div>
<h2>Section two</h2>
<div>
<p>This is the first paragraph.</p>
<p>This is the second paragraph.</p>
</div>
</body>
</html>
p:first-of-type {
color: red;
}
Browser Output
Here, the first-of-type
pseudo-class selects the first
p
element within the parent elements and changes the text color
to red
.
CSS not Pseudo-Class
The not
pseudo-class selector styles the elements that do not
match the user defined selector. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS Pseudo-Classes</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div>
<p>This is the first paragraph.</p>
<p class="special-paragraph">This is a special paragraph.</p>
<p>This is the third paragraph.</p>
</div>
</body>
</html>
p:not(.special-paragraph) {
color: red;
}
Browser Output
In the above example,
p:not(.special-paragraph) {
color: red;
}
select all p
elements that are not of the class
special-paragraph
.
This means that the first and third paragraphs will be red
, but
not the second paragraph.
CSS empty Pseudo-Class
The empty
pseudo-class selector styles every element that has
no children. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CSS Pseudo-Classes</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<!--empty div-->
<div></div>
<!--div having child elements-->
<div>
<p>This is a paragraph.</p>
<p>This is a paragraph.</p>
</div>
</body>
</html>
div:empty {
width: 100px;
height: 20px;
background-color: red;
}
Browser Output
Here, the empty
pseudo-class selects and styles only the empty
div
element.
Link Pseudo-Classes
Link pseudo-classes select links based on their state. There are following link pseudo-classes.
CSS link Pseudo-Class
The link
pseudo-class selector styles all the unvisited links.
For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<p>Find additional information from <a href="#">here</a>.</p>
</body>
</html>
a:link {
text-decoration: none;
color: blue;
font-weight: bold;
background-color: greenyellow;
}
Browser Output
Find additional information from here.
Here, the link
pseudo-class selects and styles the link prior
to it is clicked or visited.
Note that as soon as we click on the link, the color changes to
purple
. This is the default behavior of the link.
CSS visited Pseudo-Class
The visited
pseudo-class selector styles the links that are
visited by the user. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<p>Find additional information from <a href="#">here</a>.</p>
</body>
</html>
/* styles the default state */
a:link {
text-decoration: none;
color: blue;
font-weight: bold;
background-color: greenyellow;
}
/* styles the visited state */
a:visited {
color: red;
}
Browser Output
Find additional information from here.
.
In the above example, when the user clicks on the link, the color changes to
red
.
CSS focus Pseudo-Class
The focus
pseudo-class selector styles the element that is
focused by the user. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<p>Find additional information from <a href="#">here</a>.</p>
</body>
</html>
/* styles the focused state */
a:focus {
background-color: skyblue;
}
Browser Output
Find additional information from here.
In the above example, the a:focus
selector styles link during
focus with a skyblue
background color.
CSS hover Pseudo-Class
The hover
pseudo-class selector styles the elements when the
mouse is placed over it. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<p>Find additional information from <a href="#">here</a>.</p>
</body>
</html>
/* styles the link state */
a:link {
text-decoration: none;
color: blue;
font-weight: bold;
}
/* styles the visited state */
a:visited {
color: purple;
}
/* styles the hover state */
a:hover {
background-color: greenyellow;
}
Browser Output
Find additional information from here.
In the above example, the a:hover
selector adds a background
color to link while hovering.
Note: The hover
pseudo-class can be used with
any element, not only with the links.
CSS active Pseudo-Class
The active
pseudo-class selector styles the elements when the
user clicks on it. For example,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<p>Find additional information from <a href="#">here</a>.</p>
</body>
</html>
/* styles the link state */
a:link {
text-decoration: none;
color: blue;
font-weight: bold;
background-color: greenyellow;
}
/* styles the visited state */
a:visited {
color: purple;
}
/* styles the hover state */
a:hover {
text-decoration: underline;
}
/* styles the active state */
a:active {
color: red;
}
Browser Output
Find additional information from here.
In the above example, the a:active
selector styles link when it
is active with red
color.
Note: The order of providing link pseudo-classes is
important. The correct sequence is link
, visited
,
hover
, and active
to ensure that styles are
applied correctly.
UI Pseudo-Classes
A UI pseudo-class selects elements based on their state or interaction with the user.
CSS enabled Pseudo-Class
The enabled
pseudo-class selects and styles any enabled
element.
An element is enabled if it can be selected, clicked on, typed into, etc., or accepts focus.
Let's look at an example.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<input type="text" placeholder="Enter your username" />
<button>Submit</button>
</body>
</html>
input:enabled {
border: 2px solid blue;
}
Browser Output
Here, the enabled
pseudo-class selects the
input
element and adds a blue solid border of 2px
.
CSS disabled Pseudo-Class
The disabled
pseudo-class selects and styles elements that are
disabled. It can form elements like input fields or buttons that the user
cannot interact with.
Let's look at an example.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>CSS Pseudo-Classes</title>
</head>
<body>
<input type="text" placeholder="Username..." />
<button disabled>Submit</button>
</body>
</html>
button:disabled {
cursor: not-allowed;
}
Browser Output
Here, the cursor
property sets the cursor to a
not-allowed
when the user hovers over the disabled button.
Note: To use the disabled
pseudoclass
selector, we need to add the disabled keyword to the HTML element.