CSS pseudo-classes are special keywords added to selectors that specify a state or condition of an element. They allow you to style elements dynamically based on user interactions, position, or other conditions without adding extra classes or JavaScript.
Basic Syntax
selector:pseudo-class {
property: value;
}
Commonly Used Pseudo-classes
- Interactive States
- Used to style elements based on user interactions.
- Examples:
:hover: Styles an element when the user hovers over it.:focus: Styles an element when it gains focus (e.g., a form field clicked or tabbed into).:active: Styles an element when it’s being clicked.
Example:
button:hover { background-color: lightblue; } input:focus { border: 2px solid blue; } a:active { color: red; } - Structural Pseudo-classes
- Style elements based on their position in the DOM.
- Examples:
:first-child: Selects the first child of its parent.:last-child: Selects the last child of its parent.:nth-child(n): Selects the nth child (1-based index) of its parent.:nth-of-type(n): Selects the nth child of a specific type.:only-child: Selects an element if it’s the only child of its parent.
Example:
li:first-child { font-weight: bold; } li:nth-child(2) { color: green; } p:only-child { text-align: center; } - Form States
- Style form elements based on their state.
- Examples:
:checked: Styles a checked checkbox or radio button.:disabled: Styles disabled form elements.:enabled: Styles enabled form elements.:required: Styles required input fields.:optional: Styles optional input fields.
Example:
input:checked { outline: 2px solid green; } input:disabled { background-color: lightgray; } input:required { border: 1px solid red; } - Targeting Links
- Style links based on their state.
- Examples:
:link: Styles unvisited links.:visited: Styles visited links.
Example:
a:link { color: blue; } a:visited { color: purple; } - Dynamic Pseudo-classes
- React to dynamic conditions.
- Examples:
:not(selector): Selects elements that do not match the selector.:empty: Selects elements with no children.:root: Selects the root element of the document (usually<html>).
Example:
div:not(.active) { opacity: 0.5; } p:empty { display: none; } :root { --main-color: blue; } - Others
:first-of-type/:last-of-type: Selects the first or last element of a specific type within its parent.:nth-last-child(n): Selects the nth child from the end of its parent.:hover-within: Selects an element when any of its children are hovered.
Example:
div:first-of-type { border: 1px solid black; } li:nth-last-child(2) { color: orange; }
Combining Pseudo-classes
You can combine pseudo-classes for more specific styles.
Example:
a:hover:active {
color: red;
}
Comprehensive 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 Example</title>
<style>
button:hover {
background-color: lightblue;
}
input:focus {
border: 2px solid blue;
}
a:active {
color: red;
}
li:first-child {
font-weight: bold;
}
li:nth-child(2) {
color: green;
}
p:only-child {
text-align: center;
}
input:checked {
outline: 2px solid green;
}
input:disabled {
background-color: lightgray;
}
input:required {
border: 1px solid red;
}
a:link {
color: blue;
}
a:visited {
color: purple;
}
div:not(.active) {
opacity: 0.5;
}
p:empty {
display: none;
}
:root {
--main-color: blue;
}
div:first-of-type {
border: 1px solid black;
}
li:nth-last-child(2) {
color: orange;
}
a:hover:active {
color: red;
}
</style>
</head>
<body>
<h2>Try CSS Pseudo-classes</h2>
<button>Hover me</button>
<input type="text" placeholder="Focus on me">
<a href="#">Click me</a>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
</ul>
<p>Only child paragraph</p>
<input type="checkbox" checked> Checked
<input type="text" disabled placeholder="Disabled">
<input type="text" required placeholder="Required">
<div class="inactive">Not active</div>
<p></p>
</body>
</html>
Browser Support
Most pseudo-classes are widely supported, but modern pseudo-classes (e.g., :not(), :focus-within) may require testing in older browsers.