Media queries in CSS are a cornerstone for building responsive web design. They enable developers to apply specific styles based on device characteristics like width, height, orientation, and resolution.

Understanding what are media queries in CSS is crucial for anyone aiming to create flexible and adaptive website layouts compatible with various screen sizes, from mobile phones to desktop monitors.

What will you gain from this article?

By exploring this guide, you will dive deep into the syntax of media queries, learn to implement them for different screen resolutions and orientations, and understand how they enhance user experience.

Whether you are employing CSS3 in responsive web design, using frameworks like Bootstrap or Tailwind CSS, or optimizing content for print, mastering media queries will give you an edge in front-end development.

Expect insights into practical examples, best practices, and common pitfalls to avoid. The goal is to make your designs more efficient and accessible across all devices.

What are Media Queries in CSS?

Media Queries in CSS are techniques used to apply styles based on the characteristics of the user’s device, such as screen size, resolution, orientation, or color scheme. They enable responsive design by allowing developers to adapt layouts and content dynamically, ensuring an optimal user experience across various devices and screen sizes.

Understanding Media Query Syntax and Structure

Basic Syntax of Media Queries

YouTube player

The basic structure of media queries in CSS is pretty straightforward and essential for responsive design. Here’s what you need to know about the components involved:

Components: Media Type, Feature, and Rules

Media Types: Determines the type of device or screen a stylesheet applies to. Common types include allscreen, and print.

Media Features: Specifies the capabilities or characteristics of the device, like widthheightorientationresolution, etc.

Rules: The CSS properties and values applied when the media query conditions are met.

Example Media Query: Structure and Explanation

A simple media query example:

@media screen and (max-width: 768px) {
    body {
        background-color: lightblue;
    }
}

Here’s the breakdown:

  • @media triggers the query.
  • screen specifies the media type.
  • and (max-width: 768px) is the media feature.
  • { body { background-color: lightblue; } } are the rules applied if the conditions are satisfied.

Media Types

Common Types: all, screen, print

all: Applies to all media types by default, useful when there’s no need to differentiate between devices.

screen: Targets the screens, essential for designing responsive layouts.

print: Specifically for print media, helping format documents for printers.

Deprecated Types: aural, tv, projection

Some types have fallen out of use and are considered outdated:

  • aural: Originally for speech synthesizers.
  • tv: Targeted televisions.
  • projection: Meant for projectors.

Media Features

Viewport-Specific Features: width, height, orientation

width and height: Key for defining the size of the viewport, crucial for responsive layouts.

orientation: Determines whether the device is in portrait or landscape mode, accommodating different layouts for different orientations.

Device-Specific Features: resolution, color, monochrome

resolution: Targets devices based on pixel density, differentiating between standard and high-resolution displays.

color: Specifies the number of bits per color component on the device.

monochrome: Used to check if the device’s display is limited to monochrome colors.

Logical Operators in Media Queries

Using and for Multiple Conditions

The and operator allows combining multiple conditions. It creates more specific rules:

@media screen and (max-width: 800px) and (orientation: landscape) {
    /* your rules here */
}

not for Negation

The not operator applies rules when the condition is false:

@media not all and (max-width: 800px) {
    /* styles for devices wider than 800px */
}

Combining Queries with only and Comma-Separation

The only keyword is used to hide styles from older browsers that do not support media queries. The comma-separation method lets you combine multiple queries into one rule set:

@media only screen and (max-width: 600px), only screen and (min-width: 1001px) {
    /* styles for small and large screens */
}

Practical Application of Media Queries in CSS

Responsive Design: Adapting Layouts for Different Devices

Responsive design is all about making a website usable and visually appealing on all devices. From mobiles to desktop monitors, the adaptability of layouts changes the game.

Mobile-First Approach: Strategy and Implementation

In the mobile-first approach, start by designing for the smallest screens and progressively enhance the design as more screen real estate becomes available. This is a strategic way to ensure your designs are functional on all devices.

Use media queries to add layers of styles as the screen size increases. Begin with a global default:

body {
    font-size: 14px;
    padding: 10px;
}
@media only screen and (min-width: 600px) {
    body {
        font-size: 16px;
        padding: 15px;
    }
}
@media only screen and (min-width: 1024px) {
    body {
        font-size: 18px;
        padding: 20px;
    }
}

Desktop-First Approach: Strategy and Implementation

The desktop-first strategy inverses this logic. Start with a layout designed for larger screens, then use media queries to scale it down.

Starting with desktop styles:

body {
    font-size: 18px;
    padding: 20px;
}
@media only screen and (max-width: 1024px) {
    body {
        font-size: 16px;
        padding: 15px;
    }
}
@media only screen and (max-width: 600px) {
    body {
        font-size: 14px;
        padding: 10px;
    }
}

Defining Breakpoints: Standard vs. Content-Driven

Standard breakpoints use common device widths, like 600px for tablets or 1024px for desktops. They help simplify the design but might not always fit content perfectly.

Content-driven breakpoints adapt based on the content itself. Determine where your design breaks or looks awkward and introduce a breakpoint there. This method is more flexible and content-centric.

@media only screen and (min-width: 750px) {
    /* styles when content needs more space */
}

Combining and Nesting Media Queries

Example of Nested Queries for Complex Layouts

Nesting media queries allows you to create more complex and precise responsive designs. For a layout that adapts based on both width and height:

@media screen and (min-width: 600px) {
    .container {
        display: flex;
    }
    @media (min-height: 500px) {
        .container {
            justify-content: center;
        }
    }
}

Combining Queries for Multiple Device Conditions

Combine multiple queries to handle diverse conditions. This ensures your styles work smoothly across different device specs.

@media screen and (min-width: 600px) and (orientation: landscape) {
    body {
        background-color: lightblue;
    }
}

Flexbox and Grid Without Media Queries

Modern CSS techniques like Flexbox and Grid can achieve responsive layouts without relying heavily on media queries.

Flexbox: Creating Responsive Layouts Without Breakpoints

Flexbox simplifies layout structures. It automatically adjusts items based on the available space.

.container {
    display: flex;
    flex-wrap: wrap;
}
.item {
    flex: 1 1 200px; /* grow, shrink, base size */
}

Responsive layout here is managed through flex properties—no need for breakpoints.

Grid: Auto-Adjusting Layouts Based on Available Space

CSS Grid is even more powerful. It enables layouts that auto-adjust without explicit breakpoints.

.container {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

This grid system ensures items fit dynamically within their containers.

Advanced Techniques with Media Queries

Targeting Features Beyond Viewport Width

Now, dive into deeper waters. Media queries aren’t just about the viewport width; they go beyond and offer more tailored control over how content displays across different device capabilities.

Detecting Device Orientation: portrait vs. landscape

Orientation—flipping your device changes the landscape:

@media (orientation: landscape) {
    body {
        background-color: lavender;
    }
}

@media (orientation: portrait) {
    body {
        background-color: coral;
    }
}

You adjust designs based on whether users prefer their screens upright or sideways.

Resolution and Pixel-Density Queries: min-resolution, max-resolution

For high-resolution displays, pixel density is a critical factor:

@media (min-resolution: 192dpi) {
    img {
        width: 100px;
    }
}

@media (max-resolution: 144dpi) {
    img {
        width: 80px;
    }
}

Accounts for retina displays or older, lower-resolution monitors, ensuring visual fidelity stays sharp.

Interaction and Accessibility Queries

Devices vary in how users interact. Different input methods and accessibility requirements can shape your approach.

Detecting Input Types: pointer and any-pointer

Distinguish between precise (mouse) and imprecise (touch) input devices:

@media (pointer: coarse) {
    button {
        padding: 15px;
    }
}

@media (pointer: fine) {
    button {
        padding: 10px;
    }
}

Fine-tune touch targets. Make sure your buttons aren’t frustrating for folks with larger fingers.

Hover Detection: hover and any-hover

Hover states matter—especially on non-touch devices:

@media (hover: hover) {
    a:hover {
        color: green;
    }
}

@media (hover: none) {
    a {
        color: blue;
    }
}

Ensures hover effects only apply where they make sense. Accessibility-first thinking right there.

User Preference Queries

User preferences can dictate design changes. Accessibility considerations enhance user experience across the board.

prefers-reduced-motion: Minimizing Animations for Accessibility

For users who prefer minimal motion:

@media (prefers-reduced-motion: reduce) {
    .animated-element {
        animation: none;
        transition: none;
    }
}

Fewer animations mean less vertigo—which is a win for users with vestibular disorders.

prefers-reduced-transparency: Enhancing Visibility with Reduced Transparency

Visibility is crucial. Some users find transparency visually chaotic:

@media (prefers-reduced-transparency: reduce) {
    .transparent-element {
        opacity: 1;
    }
}

Ensures clear, visible content for everyone.

prefers-color-scheme: Dark Mode and Light Mode Integration

Respecting dark and light mode preferences can be a game-changer:

@media (prefers-color-scheme: dark) {
    body {
        background-color: black;
        color: white;
    }
}

@media (prefers-color-scheme: light) {
    body {
        background-color: white;
        color: black;
    }
}

Easy-on-the-eyes browsing, whether it’s day or night.

Using Range Syntax for Greater Flexibility

Precision is key in responsive design. The range syntax is your toolkit.

Setting Conditions with min- and max- Prefixes

Set constraints efficiently:

@media (min-width: 500px) and (max-width: 1200px) {
    .container {
        width: 80%;
    }
}

Applies styles only within a specific range, bringing nuanced control over the layout.

Using Ranged Comparisons with < and > for Precision

Go granular. Compare values precisely:

@media (width > 600px) {
    .sidebar {
        display: block;
    }
}

@media (width < 600px) {
    .sidebar {
        display: none;
    }
}

Let content adjust perfectly to whatever device it’s viewed on.

Media Queries in HTML and JavaScript

Using Media Queries in HTML

Getting media queries into the mix of HTML can streamline responsive design. Let’s break down how to do it efficiently and effectively.

Sometimes you want to link different stylesheets based on media queries. Use the media attribute in the <link> element within the HTML:

<link rel="stylesheet" media="screen and (max-width: 768px)" href="mobile.css">
<link rel="stylesheet" media="screen and (min-width: 769px)" href="desktop.css">

This approach ensures only the relevant CSS file is loaded based on the conditions defined. It’s great for performance, as only the needed CSS gets fetched and applied.

The Role of <picture> and <source> for Responsive Images

The <picture> element combined with <source> allows for responsive images, adapting across different screen sizes or resolutions. You can define multiple sources:

<picture>
    <source srcset="small.jpg" media="(max-width: 600px)">
    <source srcset="medium.jpg" media="(max-width: 1200px)">
    <source srcset="large.jpg">
    <img src="fallback.jpg" alt="Responsive Image">
</picture>

Each <source> element specifies different images to be used under different media conditions. This setup delivers the most appropriate image, optimizing both performance and user experience.

Using Media Queries in JavaScript

Integrating media queries directly into JavaScript brings a dynamic edge. Let’s explore how to accomplish this effectively.

Introduction to window.matchMedia()

The window.matchMedia() method evaluates a media query string and returns a MediaQueryList object, representing the results:

const mediaQuery = window.matchMedia('(max-width: 600px)');

if (mediaQuery.matches) {
    console.log('Viewport is 600px or less');
} else {
    console.log('Viewport is more than 600px');
}

This method checks the media query and runs the specified JavaScript based on the result.

Adding Listeners to Detect Changes in Media Queries

Adding listeners to media query results helps react to changes live, without refreshing:

const mediaQuery = window.matchMedia('(max-width: 600px)');

function handleScreenChange(e) {
    if (e.matches) {
        console.log('Now viewport is 600px or less');
    } else {
        console.log('Now viewport is more than 600px');
    }
}

mediaQuery.addListener(handleScreenChange);

The addListener method is key here—whenever the query status changes, handleScreenChange fires, making your application more interactive and responsive.

Dynamically Applying Styles Based on Media Conditions

Dynamically apply styles directly via JavaScript based on media conditions:

const mediaQuery = window.matchMedia('(max-width: 600px)');

function applyStyles(e) {
    const element = document.getElementById('dynamic-style');

    if (e.matches) {
        element.style.backgroundColor = 'lightblue';
    } else {
        element.style.backgroundColor = 'lightcoral';
    }
}

mediaQuery.addListener(applyStyles);
applyStyles(mediaQuery);  // Initial check at load

This allows you to change styles on the fly, ensuring your design adapts in real-time to the user’s screen size or other media features.

Best Practices for Implementing Media Queries

Developing a Mobile-First Approach

Starting with Small Screens and Scaling Up

Begin by crafting the layout for the smallest screens first. This method ensures essential functionality on mobile devices. Use CSS to layer additional styles as the screen size increases. Start with basic, functional styles:

body {
    margin: 0;
    font-size: 16px;
}

@media (min-width: 600px) {
    body {
        font-size: 18px;
    }
}

@media (min-width: 900px) {
    body {
        font-size: 20px;
    }
}

Small screens get a minimal design, larger screens get enhanced styles, adapting gracefully.

Progressive Enhancement: Adding Features for Larger Screens

Don’t just scale up the design; enhance it. Utilize progressive enhancement to introduce additional features or improve usability on bigger screens. It’s about respecting device limitations and enhancing the experience where possible:

@media (min-width: 768px) {
    .sidebar {
        display: block;
    }
}

@media (min-width: 1024px) {
    .sidebar {
        width: 250px;
    }
}

Sidebars may start hidden on small screens and progressively become visible and then expand as space allows.

Determining Effective Breakpoints

Avoiding Device-Specific Breakpoints

Avoid tying breakpoints to specific devices. Devices keep evolving, and hard-coded points can get outdated. Stick to designing around content needs. Rather than designing for iPhone 5 or Galaxy Tab, focus on how your content adapts and maintains usability at different widths.

@media (max-width: 768px) {
    .gallery {
        grid-template-columns: 1fr;
    }
}

Breakpoints here hinge on the layout’s need, not on a specific device size.

Using Content-Driven Breakpoints for Optimal Layout Adjustments

Implement content-driven breakpoints. Adjust the layout where the content needs it. If text lines become too long or images break the grid, introduce a breakpoint.

@media (min-width: 800px) {
    .article-text {
        column-count: 2;
    }
}

Here, columns are introduced once there’s enough space for the text to flow without overwhelming readability.

Improving Performance with Media Queries

Loading Conditional Stylesheets for Performance Gains

Optimize loading times by using conditional stylesheets that load only when necessary. This increases performance by minimizing the amount of CSS downloaded initially.

<link rel="stylesheet" media="screen and (max-width: 600px)" href="mobile-styles.css">
<link rel="stylesheet" media="screen and (min-width: 601px)" href="desktop-styles.css">

Condensed stylesheets cut down on unnecessary data transfer for mobile users on slower connections.

Reducing File Sizes by Avoiding Unnecessary CSS Downloads

Every byte counts. Consider combining and minifying CSS files to ensure only the necessary styles are loaded, avoiding bloat.

<link rel="stylesheet" href="styles.min.css">

A minified CSS file significantly reduces the data load, enhancing overall site performance. Clean and efficient.

Accessibility Considerations in Media Queries

Addressing User Preferences for Accessibility

Tuning into user preferences for accessibility isn’t just about compliance; it’s about crafting a web experience that everyone can enjoy.

Respecting prefers-reduced-motion for Users with Vestibular Disorders

Motion can be problematic for some users. For those with vestibular disorders, reduce or eliminate non-essential animations:

@media (prefers-reduced-motion: reduce) {
    .animated {
        animation: none;
        transition: none;
    }
}

Simplifies interactions. Important. Reduces discomfort.

Enhancing Visibility with prefers-contrast and inverted-colors

Contrast considerations improve readability. Use prefers-contrast and inverted-colors for switching to high contrast modes:

@media (prefers-contrast: high) {
    body {
        background-color: black;
        color: white;
    }
}

@media (inverted-colors: inverted) {
    body {
        filter: invert(1);
    }
}

Clarity. Cleaner visuals. Saves eyes.

Managing High-Contrast Environments

High-contrast environments aren’t just beneficial for those with visual impairments. They aid everyone in different lighting situations.

Ensuring Color Choices Work in Inverted Modes

Designing with inversion in mind requires careful planning. Ensure color choices remain sensible in all modes:

@media (prefers-contrast: high) {
    .highlight {
        background-color: yellow;
        color: black;
    }
}

Combine colors thoughtfully. Both functional and aesthetic. Harmony.

Using CSS Filters to Handle Image Inversion Correctly

Images may look odd when colors are inverted. Use filters to balance:

@media (inverted-colors: inverted) {
    img {
        filter: invert(1) hue-rotate(180deg);
    }
}

Adjusting hues. Keep images natural. No disjoint.

Supporting Users with Diverse Interaction Needs

Interaction styles vary dramatically from user to user. Cater to these differences with precision.

Larger Click Targets for Touch Devices Using pointer and hover

Touch devices need larger clickable areas to avoid misclicks. Utilize pointer and hover accordingly:

@media (pointer: coarse) {
    button {
        padding: 20px;
        font-size: 18px;
    }
}

Larger targets mean fewer mistakes. User satisfaction guaranteed.

Reducing Visual Clutter for Non-Hover Devices

Devices without hover capabilities should present simpler interfaces. Minimize excess details:

@media (hover: none) {
    .tooltip {
        display: none;
    }
}

FAQ On Media Queries In CSS

How do media queries work?

Media queries use the @media rule to apply styles conditionally, depending on the result of one or more media features. For instance, you might use a media query to apply specific styles only when the viewport width is less than 768 pixels.

What is the syntax for media queries in CSS?

The basic syntax for media queries looks like this:

@media (max-width: 768px) {
  /* CSS rules here */
}

You can combine multiple conditions using logical operators such as andnot, and only.

Why are media queries important for responsive web design?

Media queries allow websites to adapt to various devices and screen sizes, ensuring an optimal user experience.

By using different CSS rules for different contexts, you make sure that your site looks good and functions well on phones, tablets, desktops, and even print media.

Can you give examples of common media queries?

Certainly. Here are a few common examples:

  • max-width: 600px for small screens.
  • min-width: 1024px for large screens.
  • orientation: landscape for landscape orientation.

Each of these media queries targets different device characteristics and adapts the content accordingly.

What are the differences between max-width and min-width?

  • max-width: Styles apply when the screen width is at most the specified value.
  • min-width: Styles apply when the screen width is at least the specified value.

Both are used extensively in responsive design to create fluid, adaptable layouts.

How do media queries affect mobile-first design?

In a mobile-first design approach, styles for mobile devices are defined first, with media queries adding rules for larger screens.

This method ensures that mobile users get the most attention in terms of performance and user experience, which aligns well with the widespread use of smartphones.

What is the difference between media types and media features?

  • Media types: Define the general category of a device, such as screenprint, or all.
  • Media features: Specify individual characteristics like width, height, or resolution. Combining both allows targeted and versatile styling.

Can media queries be used with CSS frameworks?

Absolutely, CSS frameworks like Bootstrap and Tailwind CSS use media queries extensively.

These frameworks provide pre-defined breakpoints and utility classes that make building responsive designs easier and more consistent across different projects.

What are some common pitfalls when using media queries?

Avoiding too many breakpoints can lead to overly complex CSS. Also, keep an eye on cross-browser compatibility and ensure your media queries cover the most common device types. Lastly, always test on actual devices when possible to confirm the expected behavior.

Conclusion

Understanding what are media queries in CSS is essential for effective modern web design. Media queries enable adaptable and responsive layouts by applying CSS rules based on device characteristics such as width, height, orientation, and resolution. With the @media rule, you can customize styles to ensure optimal user experience across a range of devices, from mobile phones to desktop monitors.

Key takeaways include:

  • Syntax and implementation: Media queries use specific syntax to apply styles conditionally.
  • Practical applications: Adjust styles for various screen sizes, orientations, and resolutions.
  • Frameworks: CSS frameworks like Bootstrap and Tailwind CSS leverage media queries for responsive design.
  • Avoiding pitfalls: Be mindful of too many breakpoints and ensure cross-browser compatibility.

Media queries are more than just a tool; they are a necessity in creating fluid, adaptive websites. They form the backbone of responsive design, ensuring your site looks great and performs well on all devices.

Author

Bogdan Sandu is the principal designer and editor of this website. He specializes in web and graphic design, focusing on creating user-friendly websites, innovative UI kits, and unique fonts.Many of his resources are available on various design marketplaces. Over the years, he's worked with a range of clients and contributed to design publications like Designmodo, WebDesignerDepot, and Speckyboy among others.