CSS
I. CSS Fundamentals
1. Introduction to CSS
2. CSS Syntax
3. Ways to Add CSS
4. CSS Selectors
5. Specificity and Cascade
6. Colors and Units
7. Typography Basics
8. CSS Box Model
II. Core CSS Properties
9. Backgrounds
10. Borders and Shadows
11. Display and Visibility
12. Positioning
13. Overflow and Z-Index
14. Flexbox Basics
15. Flexbox Advanced
16. CSS Grid Basics
III. Layouts & Adv. CSS
17. CSS Grid Advanced
18. Responsive Design
19. Media Queries
20. Fluid Layouts
21. CSS Animations
22. Transitions and Transforms
23. Pseudo-Classes
24. Pseudo-Elements
IV. Practices & Projects
25. CSS Best Practices
26. CSS Performance Optimization
27. Maintainable CSS
28. CSS Security Considerations
29. Browser Compatibility
30. Debugging CSS
31. Mini Project – Landing Page
32. Mini Project – Portfolio Layout
33. Mini Project – Responsive Website
34. Mini Project – UI Components
35. CSS Interview Questions
36. CSS Real-World Use Cases
37. CSS Case Study
38. CSS Project Planning
39. CSS Final Project
40. CSS Course Wrap-Up
CSS Module • Lesson 24
# Pseudo-Elements
Add decorative elements and style parts of content that don't exist in HTML — like first letters, quotation marks, and dividers
Pseudo-elements are CSS's way of creating virtual elements that don't actually exist in your HTML. Think of them as invisible helpers that can add decorative touches — like making the first letter of a paragraph huge, adding quotation marks around quotes, or inserting dividers between sections. While pseudo-classes (like `:hover`) target elements in specific states, pseudo-elements target specific parts of elements or create entirely new elements. They're perfect for adding polish without cluttering your HTML with extra `` and `` tags.
## Understanding Pseudo-Element Syntax
### ::first-letter
Perfect for creating magazine-style drop caps — those large decorative first letters.
### ::first-line
Styles just the first line of text — perfect for making opening sentences stand out.
### Button Hover Effects
Pseudo-elements shine for creating smooth hover animations without JavaScript.
### The Content Property Rules
The `content` property is absolutely required for `::before` and `::after`. Here's what you can put in it:
## Browser Support and Best Practices
Pseudo-elements have excellent browser support, but there are performance considerations to keep in mind.
Pseudo-elements use double colons (::) to distinguish them from pseudo-classes.
selector
::pseudo-element
{ styles }
Element to target
Which pseudo-element
CSS properties
Essential Pseudo-Elements
The WanderLust team wants to add sophisticated typography and decorative elements to their travel content. Here are the most useful pseudo-elements you'll reach for constantly. ### ::before and ::after These are the power tools of pseudo-elements — they create virtual elements before or after your content./* Add decorative quotes around testimonials */
.testimonial::before {
content: """; /* Required — what to insert */
font-size: 48px; /* Make quote mark large */
color: #0ea5e9; /* WanderLust blue */
position: absolute; /* Position precisely */
top: -10px;
left: -20px;
}
.testimonial::after {
content: """; /* Closing quote */
font-size: 48px;
color: #0ea5e9;
position: absolute;
bottom: -30px;
right: -10px;
}localhost/testimonial.html
What just happened?
The
::before pseudo-element inserted an opening quote mark before the testimonial content, while ::after added the closing quote. The content property is required — without it, nothing appears. Try changing the content to different symbols like ★ or ➤/* Create elegant drop caps for travel stories */
.story-intro::first-letter {
font-size: 4em; /* 4 times normal size */
float: left; /* Text wraps around */
line-height: 0.8; /* Tighten vertical spacing */
margin: 8px 8px 0 0; /* Space around letter */
color: #f97316; /* WanderLust orange */
font-weight: bold;
font-family: serif; /* Classic book style */
}localhost/story.html
/* Emphasize the opening line of articles */
.article-content::first-line {
font-weight: bold; /* Make first line bolder */
font-size: 1.1em; /* Slightly larger */
color: #0f172a; /* Darker for contrast */
letter-spacing: 0.5px; /* Add elegance */
}localhost/article.html
Creative Pseudo-Element Techniques
Now for the fun part — using pseudo-elements to create visual effects that would be impossible or messy with regular HTML. ### Creating Decorative Dividers/* Add elegant section dividers without extra HTML */
.section-break {
text-align: center; /* Center the divider */
margin: 50px 0; /* Breathing room */
position: relative; /* For pseudo positioning */
}
.section-break::before {
content: "✈"; /* Airplane symbol for travel theme */
font-size: 24px;
color: #0ea5e9; /* WanderLust blue */
background: white; /* Hide line behind symbol */
padding: 0 20px; /* Space around symbol */
position: relative; /* Stay above line */
z-index: 1; /* Above the line */
}
.section-break::after {
content: ""; /* Empty for decoration only */
position: absolute;
top: 50%; /* Middle of element */
left: 0;
right: 0;
height: 1px; /* Thin line */
background: #e2e8f0; /* Light gray */
z-index: 0; /* Behind symbol */
}localhost/divider.html
/* Create sliding background effect on hover */
.cta-button {
position: relative; /* For pseudo positioning */
padding: 16px 32px;
background: #0ea5e9; /* WanderLust blue */
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
overflow: hidden; /* Hide sliding element */
transition: color 0.3s ease; /* Smooth text color change */
}
.cta-button::before {
content: ""; /* No visible content */
position: absolute;
top: 0;
left: -100%; /* Start off-screen left */
width: 100%;
height: 100%;
background: #f97316; /* Orange slide-in color */
transition: left 0.3s ease; /* Smooth slide animation */
z-index: 0; /* Behind text */
}
.cta-button:hover::before {
left: 0; /* Slide to cover button */
}
.cta-button span {
position: relative; /* Above sliding background */
z-index: 1;
}localhost/button.html
Common Pseudo-Element Gotchas
Even experienced developers trip over these pseudo-element quirks. Here's how to avoid the most frustrating mistakes.❌ Missing Content
Forgetting
content: "" — pseudo-elements won't appear without it✅ Always Include Content
Use
content: "" for decorative elements, content: "text" for text❌ Wrong Elements
Using ::before/::after on
<img> or <input> — they don't work on self-closing elements✅ Container Elements
Use on
<div>, <p>, <h1> — elements that can contain contentContent Property Options
Text:
Empty:
Attributes:
Counters:
content: "★" — Any text or symbolsEmpty:
content: "" — For decorative shapes onlyAttributes:
content: attr(data-label) — Use HTML attribute valuesCounters:
content: counter(section) — Auto-numbering lists
Combining Multiple Pseudo-Elements
The WanderLust team wants to create a card design that uses multiple pseudo-elements together for a polished look./* Destination card with multiple decorative elements */
.destination-card {
position: relative;
padding: 24px;
background: white;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
margin: 20px;
}
/* Corner ribbon using ::before */
.destination-card::before {
content: "Featured"; /* Ribbon text */
position: absolute;
top: 15px;
right: -8px;
background: #f97316; /* Orange ribbon */
color: white;
padding: 4px 12px;
font-size: 12px;
font-weight: bold;
transform: rotate(12deg); /* Slight angle */
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}
/* Bottom accent line using ::after */
.destination-card::after {
content: "";
position: absolute;
bottom: 0;
left: 24px;
right: 24px;
height: 3px;
background: linear-gradient(90deg, #0ea5e9, #f97316);
border-radius: 0 0 8px 8px;
}
/* Style the first letter of card titles */
.destination-card h3::first-letter {
color: #0ea5e9;
font-size: 1.4em;
}localhost/card.html
What just happened?
Three pseudo-elements work together:
::before creates the angled ribbon, ::after adds the gradient accent line, and h3::first-letter colors the first letter. Each pseudo-element handles one visual element, keeping the HTML clean. Try changing the ribbon text or gradient colors!Pseudo-Element Best Practices
Always include content property for ::before and ::after
Use double colons (::) for modern syntax
Keep animations smooth by animating transform/opacity instead of position
Consider accessibility — screen readers might read pseudo-element content
Don't overuse — too many pseudo-elements can impact performance
Use double colons (::) for modern syntax
Keep animations smooth by animating transform/opacity instead of position
Consider accessibility — screen readers might read pseudo-element content
Don't overuse — too many pseudo-elements can impact performance
Quiz
1. The WanderLust designer creates a ::before pseudo-element but nothing appears. What's the most likely cause?
2. Which pseudo-element would you use to create large decorative first letters for WanderLust blog posts?
3. Why don't ::before and ::after pseudo-elements work on img or input elements in the WanderLust contact form?
Up Next: CSS Best Practices
Learn how to write maintainable, scalable CSS code with naming conventions, organization strategies, and performance optimization techniques.