Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nesting CSS @supports and @media queries

Tags:

I have been trying to figure out whether it's possible to nest CSS feature queries (also known as “CSS @supports”) and regular media queries, and what would be the correct way to do it.

Example A shows the feature query inside the media query.
Example B shows the media query inside the feature query.

Is it even possible to nest them at all? If so, is there a preferred nesting style? A or B?

.foo {     background: red; }  /* EXAMPLE A */ @media (min-width: 50em) {     .foo {         background: green;     }      @supports (flex-wrap: wrap) {         .foo {             background: blue;         }     } }  /* EXAMPLE B */ @supports (flex-wrap: wrap) {     .foo {         background: green;     }      @media (min-width: 50em) {         .foo {             background: blue;         }     } } 
like image 594
oelna Avatar asked Feb 24 '17 11:02

oelna


People also ask

Can you nest media queries CSS?

You can nest media queries in native CSS, as long as you're doing it from the root. It's funny to see in native CSS, but it works!

Can you put a media query inside a media query?

Yes, you can, and it doesn't really matter in what order. A CSS preprocessor is not required. It works in regular CSS. There is probably a point where the logic of that gets out of hand, so careful.

What is the difference between @media and @media only screen?

@media is the actually media query. The word screen is adding the 'conditions' to the media query. So @media screen is telling the media query to apply (whatever other conditions) to screens. For example, @media screen and (max-width: 360px) will target only screens with a max-width of 360px.


1 Answers

Both examples are valid CSS according to section 3 of the spec, and for the time being they seem to be consistently supported by browsers that understand both @supports rules and nested @media rules (also new to CSS3).

Although both examples will only apply the background: blue declaration when both the @media and @supports conditions are met,

  • A will apply either background: green or background: blue if and only if the (min-width: 50em) media query is met;
  • B will apply either declaration if and only if the browser understands @supports and supports flex-wrap: wrap.

Since your two examples mean subtly different things, which one you choose will depend on your use case:

  • If you do not want browsers that don't support @supports or flex-wrap: wrap to see either declaration, and to instead always apply background: red, choose B.
  • Otherwise, if you want any browser (that understands media queries anyway) to apply background: green at the specified viewport width, even if it will never apply background: blue due to not supporting @supports or flex-wrap: wrap, choose A.
like image 158
BoltClock Avatar answered Sep 19 '22 18:09

BoltClock