# Responsive Design Patterns
Modern responsive design patterns and techniques for creating flexible, accessible layouts that work across all devices.
## Mobile-First Approach
Start with mobile design and enhance for larger screens.
### Why Mobile-First?
**Benefits:**
- Forces focus on essential content
- Better performance (smaller base CSS)
- Progressive enhancement mindset
- Easier to add features than remove them
**Basic Pattern:**
```css
/* Base (mobile) styles - no media query */
.container {
width: 100%;
padding: 1rem;
}
/* Tablet and up */
@media (min-width: 768px) {
.container {
padding: 2rem;
}
}
/* Desktop and up */
@media (min-width: 1024px) {
.container {
max-width: 1200px;
margin: 0 auto;
padding: 3rem;
}
}
```
## Breakpoints
### Standard Breakpoints
```css
:root {
/* Mobile first - these are MIN widths */
--breakpoint-sm: 640px; /* Small tablets, large phones */
--breakpoint-md: 768px; /* Tablets */
--breakpoint-lg: 1024px; /* Laptops, desktops */
--breakpoint-xl: 1280px; /* Large desktops */
--breakpoint-2xl: 1536px; /* Extra large screens */
}
/* Usage */
@media (min-width: 768px) {
/* Tablet and up */
}
@media (min-width: 1024px) {
/* Desktop and up */
}
```
### Custom Breakpoints
```css
/* Content-based breakpoints */
@media (min-width: 400px) {
/* When content needs it, not arbitrary device size */
}
/* Prefer rem-based breakpoints for accessibility */
@media (min-width: 48rem) { /* 768px at 16px base */
/* Scales with user's font size preferences */
}
```
### Container Queries (Modern)
```css
/* Respond to container size, not viewport */
.card-container {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 200px 1fr;
}
}
```
## Responsive Typography
### Fluid Typography
```css
/* Scales smoothly between min and max */
h1 {
font-size: clamp(2rem, 5vw + 1rem, 4rem);
/* Min: 2rem (32px) */
/* Preferred: 5vw + 1rem */
/* Max: 4rem (64px) */
}
/* More examples */
.text-sm {
font-size: clamp(0.875rem, 0.85rem + 0.125vw, 1rem);
}
.text-base {
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
}
.text-lg {
font-size: clamp(1.125rem, 1.05rem + 0.375vw, 1.25rem);
}
```
### Responsive Line Height
```css
body {
/* Tighter on mobile, looser on desktop */
line-height: 1.5;
}
@media (min-width: 768px) {
body {
line-height: 1.6;
}
}
```
## Layout Patterns
### 1. Stack Layout
**Everything stacks vertically on mobile, side-by-side on larger screens.**
```css
.stack {
display: flex;
flex-direction: column;
gap: 1rem;
}
@media (min-width: 768px) {
.stack {
flex-direction: row;
}
}
```
### 2. Sidebar Layout
**Sidebar stacks on mobile, side-by-side on desktop.**
```css
.sidebar-layout {
display: grid;
gap: 2rem;
}
@media (min-width: 768px) {
.sidebar-layout {
grid-template-columns: 250px 1fr;
}
}
/* Flexible sidebar */
@media (min-width: 768px) {
.sidebar-layout--flexible {
grid-template-columns: minmax(200px, 300px) 1fr;
}
}
```
### 3. Grid Layout
**Responsive column count.**
```css
.grid {
display: grid;
gap: 1rem;
/* Mobile: 1 column */
grid-template-columns: 1fr;
}
@media (min-width: 640px) {
.grid {
/* Tablet: 2 columns */
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
/* Desktop: 3-4 columns */
grid-template-columns: repeat(4, 1fr);
}
}
/* Auto-responsive grid (no media queries!) */
.grid-auto {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* Creates as many columns as fit, minimum 250px each */
}
```
### 4. Holy Grail Layout
**Classic three-column layout that adapts to mobile.**
```css
.holy-grail {
display: grid;
gap: 1rem;
min-height: 100vh;
/* Mobile: stack everything */
grid-template:
"header" auto
"main" 1fr
"sidebar1" auto
"sidebar2" auto
"footer" auto
/ 1fr;
}
@media (min-width: 768px) {
.holy-grail {
/* Desktop: traditional layout */
grid-template:
"header header header" auto
"sidebar1 main sidebar2" 1fr
"footer footer footer" auto
/ 200px 1fr 200px;
}
}
.header { grid-area: header; }
.sidebar-1 { grid-area: sidebar1; }
.main { grid-area: main; }
.sidebar-2 { grid-area: sidebar2; }
.footer { grid-area: footer; }
```
### 5. Card Layout
**Responsive cards that adapt their internal layout.**
```css
.card {
display: grid;
gap: 1rem;
/* Mobile: stack image and content */
grid-template:
"image" auto
"content" 1fr
/ 1fr;
}
@media (min-width: 640px) {
.card {
/* Tablet+: side-by-side */
grid-template:
"image content" 1fr
/ 200px 1fr;
}
}
.card__image { grid-area: image; }
.card__content { grid-area: content; }
```
### 6. Switcher Pattern
**Switch between horizontal and vertical based on available space.**
```css
.switcher {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.switcher > * {
/* Grow to fill, but switch to vertical when < 400px */
flex-grow: 1;
flex-basis: calc((400px - 100%) * 999);
/* Clever calc that breaks at threshold */
}
```
### 7. Pancake Stack
**Header, main, footer layout that adapts height.**
```css
.pancake {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header { /* auto height */ }
.main { /* fills available space */ }
.footer { /* auto height */ }
```
## Responsive Images
### 1. Flexible Images
```css
img {
max-width: 100%;
height: auto;
display: block;
}
```
### 2. Art Direction (Different Images per Breakpoint)
```html
```
### 4. Background Images
```css
.hero {
background-image: url('small.jpg');
background-size: cover;
background-position: center;
}
@media (min-width: 768px) {
.hero {
background-image: url('medium.jpg');
}
}
@media (min-width: 1024px) {
.hero {
background-image: url('large.jpg');
}
}
@media (min-width: 1024px) and (-webkit-min-device-pixel-ratio: 2) {
.hero {
background-image: url('large@2x.jpg');
}
}
```
### 5. Aspect Ratio
```css
/* Modern aspect ratio */
.image-container {
aspect-ratio: 16 / 9;
overflow: hidden;
}
.image-container img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* Fallback for older browsers */
.image-container-fallback {
position: relative;
padding-bottom: 56.25%; /* 16:9 aspect ratio */
}
.image-container-fallback img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
```
## Responsive Navigation
### 1. Mobile Menu (Hamburger)
```html
```
```css
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
}
/* Mobile: hidden menu */
.nav__menu {
display: none;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
flex-direction: column;
padding: 1rem;
}
.nav__menu[aria-expanded="true"] {
display: flex;
}
.nav__toggle {
display: block;
}
/* Desktop: visible menu */
@media (min-width: 768px) {
.nav__menu {
display: flex;
position: static;
flex-direction: row;
gap: 2rem;
}
.nav__toggle {
display: none;
}
}
```
### 2. Priority+ Navigation
**Show important items, collapse others into "More" menu.**
```css
.priority-nav {
display: flex;
gap: 1rem;
}
.priority-nav__item {
flex-shrink: 0; /* Don't shrink */
}
.priority-nav__more {
margin-left: auto; /* Push to end */
}
/* Hide items that don't fit */
@media (max-width: 768px) {
.priority-nav__item:nth-child(n+4) {
display: none; /* Hide items 4+ */
}
}
```
## Responsive Tables
### 1. Horizontal Scroll
```css
.table-container {
overflow-x: auto;
-webkit-overflow-scrolling: touch; /* Smooth scrolling on iOS */
}
table {
min-width: 600px;
width: 100%;
}
```
### 2. Stacked Table (Card View)
```html
| Name | Role | |
|---|---|---|
| John Doe | john@example.com | Developer |
```
### Conditional Loading
```javascript
// Load component only on larger screens
if (window.matchMedia('(min-width: 768px)').matches) {
import('./DesktopComponent.js').then(module => {
// Initialize desktop component
});
}
```
### Font Loading
```css
@font-face {
font-family: 'CustomFont';
src: url('font.woff2') format('woff2');
font-display: swap; /* Show fallback while loading */
}
```
## Modern CSS Features
### 1. CSS Grid Auto-Fill
```css
.grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
/* Automatically creates columns, minimum 250px */
}
```
### 2. Flexbox Gap
```css
.flex-container {
display: flex;
flex-wrap: wrap;
gap: 1rem; /* No more margin hacks! */
}
```
### 3. Container Queries
```css
.card {
container-type: inline-size;
}
@container (min-width: 400px) {
.card__title {
font-size: 1.5rem;
}
}
```
### 4. Aspect Ratio
```css
.video-container {
aspect-ratio: 16 / 9;
}
```
### 5. Logical Properties
```css
/* Better for RTL/LTR support */
.element {
margin-block-start: 1rem; /* margin-top */
margin-block-end: 1rem; /* margin-bottom */
margin-inline-start: 1rem; /* margin-left in LTR, margin-right in RTL */
margin-inline-end: 1rem; /* margin-right in LTR, margin-left in RTL */
}
```
## Resources
- [MDN: Responsive Design](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design)
- [This is Responsive](https://bradfrost.github.io/this-is-responsive/)
- [Responsive Design Patterns](https://responsivedesign.is/patterns/)
- [CSS-Tricks: Complete Guide to Grid](https://css-tricks.com/snippets/css/complete-guide-grid/)
- [CSS-Tricks: Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/)
---
**"The best design is the one that works everywhere, for everyone."**