What Are Media Queries?
Media queries are a CSS feature that allows you to apply styles based on device characteristics and environment conditions. Introduced as part of the CSS3 specification, media queries have become an essential tool in every web developer's toolkit.
The Evolution of Responsive Design
Before media queries, creating layouts for different screens required separate stylesheets or JavaScript detection methods. Media queries standardized this process, allowing developers to define responsive behavior directly in CSS. This approach is more efficient, maintainable, and aligns with modern web development practices that emphasize clean, performant code.
Core Purpose
The primary purpose of media queries is to enable conditional styling based on factors such as viewport dimensions, device orientation, display capabilities, and user preferences. This conditional styling is what makes responsive design possible.
Media Query Syntax
The basic syntax of a media query follows this pattern:
@media media-type and (media-feature: value) {
/* CSS rules */
}
Media Types
Media types specify the general category of device:
- screen: Devices with screens (most common for web development)
- print: Printed materials and print preview
- all: Matches all devices (default if no type specified)
- speech: Speech synthesizers
For most web development purposes, you'll use screen or simply omit the media type (which defaults to all).
Media Features
Media features describe specific device characteristics:
Viewport Dimensions:
width: Exact viewport widthheight: Exact viewport heightmin-width: Viewport width at minimummax-width: Viewport width at maximum
Device Characteristics:
orientation:portraitorlandscapeaspect-ratio: Width-to-height ratio
Display Capabilities:
resolution: Pixel densityprefers-color-scheme: User's light/dark mode preferenceprefers-reduced-motion: Motion preference accessibility
1/* AND - Both conditions must be true */2@media screen and (min-width: 768px) and (max-width: 1024px) {3 /* Tablet styles */4}5 6/* OR - Either condition can be true */7@media (min-width: 768px), (orientation: landscape) {8 /* Wide or landscape */9}10 11/* NOT - Negates the condition */12@media not screen and (color) {13 /* Non-color screens */14}Breakpoint Strategies
Device-Based Breakpoints
Traditional approach using common device dimensions:
/* Mobile */
@media (max-width: 767px) { }
/* Tablet */
@media (min-width: 768px) and (max-width: 1023px) { }
/* Desktop */
@media (min-width: 1024px) { }
/* Large desktop */
@media (min-width: 1280px) { }
Content-Based Breakpoints
Modern approach letting content determine breakpoints:
/* Add breakpoints where layout breaks, not at arbitrary device sizes */
@media (max-width: 900px) {
/* Navigation becomes cramped here */
}
@media (max-width: 600px) {
/* Three-column layout doesn't fit */
}
Content-based breakpoints typically result in more maintainable CSS because they respond to actual design needs rather than targeting specific devices that may change over time.
| Breakpoint | Typical Use |
|---|---|
| 576px | Small phones |
| 768px | Large phones/small tablets |
| 992px | Tablets |
| 1200px | Small desktops |
| 1400px | Large desktops |
Mobile-First Development
Mobile-first is the recommended approach for responsive design.
What Is Mobile-First?
Mobile-first means writing base styles for mobile devices, then using min-width media queries to progressively enhance for larger screens. This methodology aligns with modern performance optimization best practices.
Benefits of Mobile-First
- Performance: Mobile devices typically have slower connections, so starting with optimized mobile styles reduces initial payload
- Progressive Enhancement: Add features for capable devices rather than trying to strip them from desktop designs
- Cleaner Code: Start simple and add complexity as needed, rather than managing complex desktop styles for mobile
- Better User Experience: Core experience works everywhere, with enhancements for larger screens
Implementation Strategy
When building responsive websites for our clients, we start with mobile layouts and progressively enhance using min-width breakpoints. This approach ensures fast initial load times and excellent performance across all devices.
1/* Base styles (mobile first) */2.container {3 padding: 1rem;4 font-size: 16px;5}6 7/* Tablet and up */8@media (min-width: 768px) {9 .container {10 padding: 1.5rem;11 font-size: 18px;12 }13}14 15/* Desktop and up */16@media (min-width: 1024px) {17 .container {18 padding: 2rem;19 font-size: 20px;20 max-width: 1200px;21 }22}Code Examples
Responsive Typography
/* Fluid typography using clamp() and media queries */
html {
font-size: clamp(16px, 2vw, 20px);
}
/* Responsive font sizes */
@media (min-width: 768px) {
h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
h3 { font-size: 1.75rem; }
}
@media (min-width: 1200px) {
h1 { font-size: 3rem; }
}
Responsive Navigation
/* Mobile navigation */
.nav-menu {
display: none;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
}
.nav-menu.active {
display: block;
}
@media (min-width: 768px) {
.nav-menu {
display: flex;
position: static;
background: transparent;
}
.menu-toggle {
display: none;
}
}
1/* Mobile: single column */2.grid {3 display: grid;4 gap: 1rem;5 grid-template-columns: 1fr;6}7 8/* Tablet: two columns */9@media (min-width: 768px) {10 .grid {11 grid-template-columns: repeat(2, 1fr);12 }13}14 15/* Desktop: three columns */16@media (min-width: 1024px) {17 .grid {18 grid-template-columns: repeat(3, 1fr);19 }20}21 22/* Large screens: four columns */23@media (min-width: 1400px) {24 .grid {25 grid-template-columns: repeat(4, 1fr);26 }27}Dark Mode Support
Use prefers-color-scheme to detect user's system preference for light or dark mode. Essential for accessible [web design](/services/web-development/).
Reduced Motion
Respect accessibility preferences with prefers-reduced-motion for users sensitive to animation. Part of inclusive design practices.
High Contrast
Adapt styles for prefers-contrast to improve readability for users who need more contrast in their interface.
Fluid Design
Combine media queries with CSS clamp() for truly fluid, responsive typography and spacing that scales smoothly.
Dark Mode Support
/* Light mode (default) */
body {
background-color: white;
color: #1a1a1a;
}
/* Dark mode preference */
@media (prefers-color-scheme: dark) {
body {
background-color: #1a1a1a;
color: white;
}
}
Reduced Motion
/* Respect user motion preferences */
@media (prefers-reduced-motion: no-preference) {
.animation {
transition: transform 0.3s ease;
}
}
@media (prefers-reduced-motion: reduce) {
.animation {
transition: none;
}
}
These user preference queries are essential for building accessible websites that respect visitor settings and provide inclusive experiences for all users.
Best Practices
Organize Your CSS
/* Base styles (mobile-first) */
.element { }
/* Medium breakpoints */
@media (min-width: 768px) { }
/* Large breakpoints */
@media (min-width: 1024px) { }
/* Extra large */
@media (min-width: 1200px) { }
Use Relative Units
Prefer relative units over fixed pixels:
/* Good */
.container {
max-width: 60ch; /* Measure based on character width */
padding: 2rem; /* Scales with root font size */
}
Performance Considerations
- Minimize Breakpoints: Too many breakpoints create complex, hard-to-maintain CSS. Focus on key layout transitions
- Use Container Queries: For component-level responsiveness in reusable components
- Lazy Load Resources: Use
loading="lazy"for below-fold images to improve initial load - Avoid Expensive Properties: Be cautious with layout-triggering CSS properties that cause reflows
Accessibility
Always respect user preferences for a more inclusive experience:
/* High contrast mode */
@media (prefers-contrast: more) {
/* Ensure sufficient contrast */
}
Implementing these accessibility features aligns with our commitment to inclusive web design that serves all users effectively.
Modern Developments
Container Queries
Container queries allow components to respond to their parent container's size, not the viewport. This enables truly reusable responsive components that adapt to their context rather than the screen size.
/* Define a container */
.card-container {
container-type: inline-size;
container-name: card;
}
/* Container query instead of media query */
@container card (min-width: 400px) {
.card {
display: flex;
flex-direction: row;
}
}
Container queries are now supported in all modern browsers and should be used alongside media queries for the most flexible responsive design. This combination of techniques represents the current state of modern web development.
Fluid Design with clamp()
Combine fluid sizing with constraints for truly responsive typography:
/* Fluid typography */
h1 {
font-size: clamp(1.5rem, 5vw, 3rem);
}
/* Fluid spacing */
.section {
padding: clamp(1rem, 3vw, 3rem);
}
Using clamp() with media queries provides the smoothest possible scaling between breakpoints while maintaining readable text sizes on all devices.
Frequently Asked Questions
Sources
- MDN Web Docs - Using media queries - Authoritative CSS syntax and feature reference
- LogRocket Blog - CSS Breakpoints Responsive Design - Modern breakpoint strategies and container queries
- BrowserStack - Responsive Design Breakpoints - Device-specific breakpoint recommendations
- CSS Media Queries Level 4 Specification - W3C official specification