Pseudo-classes and Pseudo-elements in CSS

Table of Contents

  1. What Are Pseudo-classes and Pseudo-elements?
  2. The Difference Between Pseudo-classes and Pseudo-elements
  3. Commonly Used Pseudo-classes
  4. Commonly Used Pseudo-elements
  5. Combining Selectors with Pseudo-classes and Pseudo-elements
  6. Use Cases and Practical Examples
  7. Browser Support and Compatibility
  8. Best Practices for Using Pseudo-selectors
  9. Conclusion

1. What Are Pseudo-classes and Pseudo-elements?

CSS pseudo-classes and pseudo-elements are special keywords added to selectors that allow you to style HTML elements based on their state, position, or part, even when that state isn’t directly available in the HTML.

  • A pseudo-class targets an element based on its state or context.
  • A pseudo-element targets and styles specific parts of an element, like the first line or first letter of text.

They enhance CSS by giving you more precision and control without modifying your HTML structure.


2. The Difference Between Pseudo-classes and Pseudo-elements

AspectPseudo-classPseudo-element
Syntax: (single colon):: (double colon, modern syntax)
TargetElement statePart of an element
Example:hover, :nth-child(2)::before, ::first-line

Note: Older versions of CSS allowed pseudo-elements with a single colon (:before), but modern CSS uses ::before.


3. Commonly Used Pseudo-classes

:hover

Applies a style when the user hovers over an element.

a:hover {
color: red;
}

:active

Applies while an element is being activated (e.g., clicked).

button:active {
transform: scale(0.95);
}

:focus

Applies when an element (like input) is focused.

input:focus {
border-color: blue;
}

:nth-child(n)

Selects the nth child of its parent.

li:nth-child(odd) {
background-color: #f4f4f4;
}

:first-child, :last-child

Targets the first or last child in a parent container.

p:first-child {
font-weight: bold;
}

:not(selector)

Selects everything except the given selector.

p:not(.highlight) {
color: gray;
}

4. Commonly Used Pseudo-elements

::before and ::after

Used to insert content before or after an element.

h1::before {
content: " ";
}
h1::after {
content: "";
}

::first-letter

Targets the first letter of text in an element.

p::first-letter {
font-size: 200%;
color: crimson;
}

::first-line

Styles the first line of a block of text.

p::first-line {
font-weight: bold;
}

::selection

Styles the part of text selected by the user.

::selection {
background: yellow;
color: black;
}

5. Combining Selectors with Pseudo-classes and Pseudo-elements

You can chain pseudo-classes and pseudo-elements with regular selectors for complex effects.

ul li:first-child::before {
content: "";
}
button:hover::after {
content: " (clicked)";
font-size: 12px;
color: gray;
}

6. Use Cases and Practical Examples

a. Interactive Buttons with :hover and :active

.button {
background: green;
color: white;
transition: all 0.2s ease;
}

.button:hover {
background: darkgreen;
}

.button:active {
transform: scale(0.95);
}

b. Highlighting Quotes with ::before and ::after

blockquote::before {
content: open-quote;
font-size: 2rem;
}

blockquote::after {
content: close-quote;
font-size: 2rem;
}

c. Custom Bullet Points with ::before

ul li::before {
content: "*";
color: orange;
margin-right: 8px;
}

7. Browser Support and Compatibility

Most pseudo-classes and pseudo-elements are well-supported in all modern browsers. Some more advanced selectors like :has() or :nth-of-type() may require newer browser versions.

SelectorChromeFirefoxSafariEdge
:hover
::before
:nth-child()
::selection
:not()

Always check Can I use for the most accurate info.


8. Best Practices for Using Pseudo-selectors

  • Use them for enhancement, not critical layout logic.
  • Avoid overuse: Too many pseudo-elements can slow rendering.
  • Keep accessibility in mind: Pseudo-elements like ::before and ::after aren’t always announced by screen readers.
  • Use content only with ::before and ::after, never for decoration without context.
  • Do not replace meaningful HTML structure when semantics are important.

9. Conclusion

Pseudo-classes and pseudo-elements are powerful tools in the CSS arsenal that help you write cleaner, more responsive, and more interactive designs. They allow you to react to user interactions (:hover, :focus), style portions of text (::first-letter, ::before), and fine-tune layouts without bloating your HTML.

By mastering these selectors, you unlock a whole new level of dynamic and expressive UI styling that aligns perfectly with modern web development best practices.

Syskoolhttps://syskool.com/
Articles are written and edited by the Syskool Staffs.