Responsive design has evolved far beyond simple breakpoints. Modern patterns focus on components, fluidity, and adaptability.
The Shift From Page to Component
Traditional responsive design treated the page as the unit of responsiveness. Modern design treats each component as responsive, adapting to its container rather than the viewport.
Fluid Typography with clamp()
Fluid typography scales smoothly between breakpoints without discrete jumps.
h1 {
font-size: clamp(2rem, 5vw + 1rem, 4rem);
line-height: clamp(1.2, 3vw + 1, 1.5);
}The clamp() function takes three values: minimum, preferred, and maximum. This ensures typography remains readable at all sizes.
Container Queries Revolution
Container queries enable truly component-responsive design.
.product-card {
container-type: inline-size;
}
@container (min-width: 400px) {
.product-card__content {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
@container (min-width: 600px) {
.product-card__image {
height: 300px;
}
}Components now respond to their available space, not viewport size.
Fluid Spacing Scale
Create consistent spacing that scales proportionally.
:root {
--space-unit: clamp(0.25rem, 1vw, 0.5rem);
--space-xs: calc(var(--space-unit) * 1);
--space-sm: calc(var(--space-unit) * 2);
--space-md: calc(var(--space-unit) * 3);
--space-lg: calc(var(--space-unit) * 4);
--space-xl: calc(var(--space-unit) * 6);
}The 1rem Base Strategy
Set base font-size on html to scale everything proportionally.
html {
font-size: clamp(100%, 2vw, 112.5%);
}
body {
font-size: 1rem;
}All rem-based values now scale smoothly with viewport width.
Responsive Images with srcset
Serve appropriately sized images based on device resolution.
<img
src="hero-800.jpg"
srcset="hero-400.jpg 400w,
hero-800.jpg 800w,
hero-1200.jpg 1200w,
hero-1600.jpg 1600w"
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
33vw"
alt="Hero image"
/>Browser downloads the optimal image size for the device.
Mobile-First Progressive Enhancement
Start with mobile, enhance for larger screens.
/* Base styles - mobile */
.card {
padding: 1rem;
display: flex;
flex-direction: column;
}
/* Tablet */
@media (min-width: 768px) {
.card {
flex-direction: row;
gap: 2rem;
}
}
/* Desktop */
@media (min-width: 1024px) {
.card {
padding: 2rem;
}
}This approach ensures mobile users get the leanest, fastest experience.
Adaptive Grid Patterns
Use auto-fit and auto-fill for adaptive grids.
.gallery {
display: grid;
grid-template-columns: repeat(
auto-fit,
minmax(min(100%, 280px), 1fr)
);
gap: 1rem;
}Grid automatically adjusts column count based on available space.
Responsive Modals
Modals should adapt their behavior based on screen size.
.modal {
position: fixed;
inset: 0;
display: grid;
place-items: center;
}
@media (min-width: 768px) {
.modal__content {
width: min(90vw, 600px);
max-height: 80vh;
}
}
@media (max-width: 767px) {
.modal__content {
width: 100vw;
height: 100vh;
border-radius: 0;
}
}Responsive Navigation Patterns
Desktop: Horizontal Bar
@media (min-width: 1024px) {
.nav {
flex-direction: row;
}
}Mobile: Hamburger Menu
@media (max-width: 1023px) {
.nav {
position: fixed;
inset: 0;
flex-direction: column;
}
}Mobile: Bottom Tab Bar (App-Like)
@media (max-width: 767px) {
.nav {
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
}Responsive Data Tables
Tables are notoriously difficult on mobile. Use card transformation.
@media (max-width: 768px) {
table {
display: block;
}
tr {
display: block;
margin-bottom: 1rem;
border: 1px solid #ddd;
}
td {
display: block;
text-align: right;
}
td::before {
content: attr(data-label);
float: left;
font-weight: bold;
}
}Touch-Friendly Sizing
Ensure interactive elements meet minimum touch targets.
.button {
min-height: 44px;
min-width: 44px;
padding: 0.75rem 1.5rem;
}Apple and Google recommend 44x44px minimum touch targets.
Orientation Awareness
Adapt layouts based on device orientation.
@media (orientation: landscape) {
.hero {
grid-template-columns: 1fr 1fr;
}
}
@media (orientation: portrait) {
.hero {
grid-template-columns: 1fr;
}
}Print Media Queries
Don't forget print responsiveness.
@media print {
.no-print {
display: none;
}
body {
font-size: 12pt;
}
a[href]:after {
content: " (" attr(href) ")";
}
}Performance Monitoring
Use Core Web Vitals to measure responsive performance.
// Monitor LCP, FID, CLS across viewport sizes
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log(entry.name, entry.value);
}
});
observer.observe({ entryTypes: ['largest-contentful-paint'] });Conclusion
Modern responsive design is fluid, component-driven, and adaptive. Move beyond simple breakpoints to create experiences that feel native on every device. Use container queries for component responsiveness, fluid values for smooth scaling, and progressive enhancement for optimal performance.