The Breakpoint Hell
My old CSS file:
.card {
font-size: 14px;
}
@media (min-width: 640px) {
.card { font-size: 16px; }
}
@media (min-width: 768px) {
.card { font-size: 18px; }
}
@media (min-width: 1024px) {
.card { font-size: 20px; }
}
5 breakpoints for one property.
Then I discovered:
.card {
font-size: clamp(14px, 2vw, 22px);
}
One line. Fully responsive. No media queries.
Modern Responsive CSS Features
1. clamp() - Fluid Typography and Spacing
How it works:
- Starts at minimum
- Scales with viewport
- Caps at maximum
/* Responsive heading */
h1 {
font-size: clamp(2rem, 5vw + 1rem, 4rem);
/* min fluid max */
}
/* Responsive spacing */
.section {
padding: clamp(2rem, 5vw, 8rem);
gap: clamp(1rem, 3vw, 3rem);
}
/* Responsive width */
.container {
width: clamp(300px, 90%, 1200px);
}
Benefits: Smoothly scales between breakpoints, fewer media queries, more predictable.
2. Container Queries - Component-Based Responsiveness
The problem with media queries: They respond to viewport, not container.
Container queries solve this:
/* Define container */
.sidebar {
container-type: inline-size;
}
/* Card responds to its container, not viewport */
@container (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
Same component works differently in sidebar vs main content based on available space, not viewport size.
Browser support: Chrome 105+, Safari 16+, Firefox 110+
3. min(), max(), clamp() for Everything
/* Responsive max-width */
.container {
width: min(90%, 1200px);
/* Takes the smaller value */
}
/* Responsive padding */
.section {
padding: max(2rem, 5vw);
/* Never smaller than 2rem */
}
/* Combining them */
.article {
width: min(65ch, 100% - 4rem);
/* Max 65 characters wide with 2rem padding */
}
4. Aspect Ratio - No More Padding Hacks
Old way (padding hack):
.video-container {
position: relative;
padding-bottom: 56.25%; /* 16:9 ratio */
height: 0;
}
New way:
.video-container {
aspect-ratio: 16 / 9;
}
/* Square images */
.profile-pic {
aspect-ratio: 1;
object-fit: cover;
}
5. Grid with auto-fit and minmax
Responsive grid without media queries:
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}
What this does:
- Creates as many columns as fit
- Each column minimum 250px
- Automatically wraps on small screens
6. CSS Variables for Responsive Values
:root {
--spacing-small: clamp(1rem, 2vw, 2rem);
--spacing-medium: clamp(2rem, 4vw, 4rem);
--font-size-base: clamp(1rem, 1.5vw, 1.25rem);
}
.section {
padding: var(--spacing-medium);
font-size: var(--font-size-base);
}
Real-World Responsive Patterns
Pattern 1: Responsive Card Grid
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
gap: clamp(1rem, 3vw, 3rem);
padding: clamp(1rem, 5vw, 4rem);
}
Pattern 2: Responsive Typography System
:root {
--font-size-sm: clamp(0.875rem, 0.75vw + 0.75rem, 1rem);
--font-size-base: clamp(1rem, 1vw + 0.85rem, 1.25rem);
--font-size-xl: clamp(1.5rem, 2vw + 1.2rem, 2.5rem);
}
body { font-size: var(--font-size-base); }
h1 { font-size: var(--font-size-xl); }
Pattern 3: Fluid Container
.container {
width: min(90%, 1200px);
margin-inline: auto;
padding-inline: clamp(1rem, 5vw, 3rem);
}
When to Use Media Queries
Media queries are still useful for:
- Major layout changes (show/hide sidebar)
- Navigation toggles (desktop vs mobile menu)
- Different component structures
But for sizing, spacing, typography: Use modern CSS features.
Common Breakpoints (2024)
/* Mobile first approach */
@media (min-width: 640px) { /* Large mobile */ }
@media (min-width: 768px) { /* Tablet */ }
@media (min-width: 1024px) { /* Desktop */ }
@media (min-width: 1280px) { /* Large desktop */ }
But with modern CSS, you need fewer breakpoints!
Responsive Design Checklist
- Text readable at all sizes
- Images scale properly
- Navigation works on mobile
- Buttons are thumb-friendly (min 44x44px)
- No horizontal scrolling
- Touch targets aren’t too close
- Forms are easy to fill on mobile
Responsive design doesn’t have to mean 50 media queries per page.
With modern CSS:
clamp()for fluid sizing- Container queries for component responsiveness
aspect-ratiofor maintaining proportions- CSS Grid with
auto-fit/minmaxfor adaptive layouts
Your responsive designs will be simpler, more maintainable, and more fluid.
Stop fighting breakpoints. Let CSS do the work.
Now go build something that looks good everywhere.