Media queries are a CSS technique that we can utilize when making our pages responsive.

We use @media to create a CSS rule that only executes if a specified condition is true.

For example, if the device browser window is 600px or smaller, set the background-color to orange:

@media only screen and (max-width: 600px) {
  body {
    background-color: orange;
  }
}

And just like that we have a rule targeting small devices!

Using media queries

We can media queries to check things, such as:

  • width and height of the viewport
  • width and height of the device
  • screen orientation (is the device landscape or portrait?)
  • screen resolution

By being able to check this information, we’re able to deliver a better experience for our users. We can create rules that display the layout in a way that best suits the device being used.

To understand the anatomy of a media query, let’s look at our options with media types, media features & logical operators.

Media types

Media types allow us load CSS based on the device type.

The following media types are available:

  • all for all media devices
  • print used for printers
  • screen used for displaying on a screen (computers, tablets, phones, etc)
  • speech used for screen readers

screen is the most commonly used type.

Media features

Media features describe specific characteristics of the users’ device.

The media query will apply when it evaluates as ‘true’.

Here’s the list of features we can test for:

  • width
  • height
  • device-width
  • device-height
  • aspect-ratio
  • device-aspect-ratio
  • resolution
  • orientation
  • scan
  • grid
  • color
  • color-index
  • monochrome

Note that each has a corresponding min-* and max-* value. And all are optional!

Logical operators

We use the logical operators not, and, and only to create a more complex media query.

and

We use and to combine multiple media features together into a single media query. Each feature must be true for the query to return true. It’s also used for joining media features with media types.

not

The not operator is used to negate a media query. It will be true if the query would otherwise return false. When using not you must also specify a media type.

only

The only operator is used to apply a style only if an entire query matches, It’s useful for preventing older browsers from applying selected styles. When using only, you must also specify a media type.

, (comma)

We can also combine multiple media queries into a single rule by separating them with commas. If any of the queries in the list are true, the entire media statement returns true. So it can be thought of as acting like an or operator.

Media query syntax

So armed with this knowledge, lets revisit the media query syntax!

A media query consists of a media type (in this case screen) and can contain one or a number of expressions (here we use max-width):

@media screen and (max-width: 600px) {
  /* ... */
}

The query will return true if the media type matches the type of device the page is being displayed on & if all expressions in the media query are true.

When a media query returns true, the corresponding style rules will be applied!

Let’s look at a more complex example..

Here the rule applies when the user has a screen device (a computer, tablet or phone), the width is between 600 and 768 pixels, and the orientation is landscape:

@media screen and (max-width: 768px) and (min-width: 600px) and (orientation: landscape) {
  /* ... */
}

Typical device breakpoints

There are tons of screens and devices with different heights and widths, so it’s quite difficult to create an exact breakpoint for each device.

Often to simply the process of coding responsive layouts, we create media queries targeting devices based screen size ranges:

/* Extra small devices (phones, less than 600px wide) */
@media only screen and (max-width: 600px) {...}
/* Small devices (portrait tablets & large phones, 600px and up) */
@media only screen and (min-width: 600px) {...}
/* Medium devices (landscape tablets, 768px and up) */
@media only screen and (min-width: 768px) {...}
/* Large devices (laptops/desktops, 992px and up) */
@media only screen and (min-width: 992px) {...}
/* Extra large devices (large laptops & desktops, 1200px and up) */
@media only screen and (min-width: 1200px) {...}

A better practice however, is to create your media queries in accordance with the needs of your content. This way you’ll reduce the likelihood of having your layout break, on devices you may not have considered.

Related Posts: