83

I'm attempting to use some media queries for a website I'm building. The problem I'm having however, is while the media query styles are actually being applied, they're being overridden. I can't for the life of me tell why because I'm using the same exact selectors. Can anyone point out something that I'm not seeing?

ORIGINAL CSS

#global-wrapper-outer > #global-wrapper-inner {
    width: 85%;
    height: 100%;
    margin: 0 auto;
    position: relative;
}
#global-wrapper-outer > #global-wrapper-inner > nav {
    background: #fff;
    padding-bottom: 20px;
    box-shadow: 0 4px 2px -2px gray;
}

MEDIA QUERY CSS

@media screen and (max-width:1024px) {
    #global-wrapper-outer > #global-wrapper-inner {
        width: 100%;
    }
    #global-wrapper-outer > #global-wrapper-inner > nav {
        display: none;
    }
}

The second media query is working fine, where I set the nav to have a display of none. However, when I try to set the width of #global-wrapper-inner to 100% it doesn't apply. I can see the style being "applied" when I press F12 and select that element. However, the style itself is crossed out and not actually applied and it still has the original width of 85%.

trk
  • 53
  • 5
Ben Black
  • 3,751
  • 2
  • 25
  • 43

8 Answers8

131

The selectors in your original CSS have the same specificity as the selectors within your media queries (the first declarations are also targeting the same property - width) and because the media query rule set is being overridden I'm going to assume that it appears before the original rule set.

The second media query selector works because it's targeting a property that wasn't set in your original CSS, so specificity isn't relevant.

To have the first media query selector take precedence, prepend an ancestor element to it:

@media screen and (max-width:1024px) {
    body #global-wrapper-outer > #global-wrapper-inner {
         width: 100%;
    }
    #global-wrapper-outer > #global-wrapper-inner > nav {
        display: none;
    }
}
Adrift
  • 58,167
  • 12
  • 92
  • 90
  • 3
    This was it. That's good to know. Thanks very much. Now a question to you, were I to append the tag to it and then use the same specificity later in another media query to say change it back to 85% width when it's under 768px. Would it need another ancestor or would it be okay since you said media queries have no specificity? – Ben Black Sep 26 '13 at 20:44
  • 1
    Scratch that question, I tested it out and it worked like I thought. No increased specificity needed. Thanks again! – Ben Black Sep 26 '13 at 20:46
  • What the difference between using your solution OR adding !important in the media query ? – Ashbay Jun 05 '15 at 20:52
  • 1
    can someone explain why you have to prepend an ancestor element to it? Does it have to be an ancestor element or can it be an element on the same level? – Mark Nov 26 '15 at 14:57
  • 1
    You have to prepend an ancestor element on it because that element makes it more specific. You could do a sibling element as well, it just has to be anything that makes it more specific than the other rule. This of course could be fixed by just having the media queries appear after non-media CSS. – Ben Black Mar 18 '16 at 13:06
  • Great. This works. I didn't know about prepending an ancestor element to make it more specific. Thanks for this :) – Pamela Sillah Feb 17 '18 at 04:48
18

You need to link the media query file (queries.css) later than the normal css file (style.css). That way the rules in the queries.css will override those in style.css.

Sameer Khanal
  • 1,199
  • 12
  • 11
  • 1
    This is the right approach—because it's the most elegant. – MarkDBlackwell Apr 11 '20 at 16:15
  • This was the problem for me. I had my core styles, then page specific mobile styles, then page normal styles, and this was the wrong order. Setting as core styles, page styles then page mobile styles worked perfectly. – Mike Upjohn Nov 27 '21 at 09:43
7

I have been at least 2 hours trying to find the override CSS problem till I found that my line comments where wrong... And the second definition of CSS wasn't working:

So, don't be so stupid as I !:

/* LITTLE SCREENS */ 

@media screen and (max-width: 990px) {
    ... whatever ...
}

/*  BIG SCREENS */ 

@media screen and (min-width: 990px) {
    ... whatever more ...
}

never use: Double bar as I did:

// This is not a comment in CSS!

/* This is a comment in CSS! */
Web_Designer
  • 72,308
  • 93
  • 206
  • 262
gtamborero
  • 2,898
  • 27
  • 28
3

Here is the answer. (at least what worked for me)

I've had this problem before, and it took me a while to realize what I did, but once I figured it out it's actually pretty easy.

Ok so imagine I have this as the html

<main>
  <div class = "child1"> </div>
  <div class = "child2"> </div>
</main>

and then this as the CSS

main .child1{
 height: 50px;
}

/* now let's try to use media quaries */


@media only screen and (max-width: 768px) {
   .child1{
     width: 75%;
   }
}

The code above won't affect the .child. Just like someone mentioned above, the main .child1 overrides .child1. So the way you make it work is to select the element just like we did at the very beginning of the CSS above.

/* this will work */


@media only screen and (max-width: 768px) {
   main .child1{
     width: 75%;
   }
}

So as a conclusion... select the elements the same way every time. Meaning ... for example in the above code, in your CSS, you should either select it as main .child1throughout the whole CSS or .child1 or else they get mixed up, one ends up overriding the other.

Ginfio
  • 57
  • 7
  • Another way to say this: styles within media queries do not automatically get higher specificity. – Lucas Jun 13 '22 at 02:40
1

From the code you submitted, this probably won't resolve your issue. However, in your CSS if you are nesting styles inside of one another:

.main-container {
  .main {
    background: blue;
  }
}

A media query for .main won't work because of the nesting. Take .main out of .main-container and then the media query will work as assumed:

.main-container {

}

.main {
  background: blue;
}
user2465134
  • 8,793
  • 5
  • 32
  • 46
1

Check if your media query braces are equal.

Sometimes it is very subtle but when you miss a single brace the rest of the media queries mentioned for certain break points will not work

example:

@media(min-width: 768px) and (max-width: 991px){




@media (max-width: 767px){

    .navbar-brand p {
    
        font-size: .6em;
        margin-top: 12px;}
       
    .navbar-brand img {height: 20px;}   

    #collapsable-nav a {
        font-size: 1.2em;
    }    

    #collapsable-nav a span {
    font-size: 1.2em;}
}

Here you can see i have started the braces for max-width:991px but forgot to end so the next set of codes in media query for max-width:767px will not work. It is a very simple mistake but took hours because of lot of braces in the codes. Hope it helps. Happy Coding!

0

What about using !important? If you range your media query from ( min-width: 176px ) and ( max-width: 736px ) or even up to 980px?

node_modules
  • 4,790
  • 6
  • 21
  • 37
0

There can be some reasons because of which this type of error may occur. I myself faced this issue where I was not able to understand what I am needed to do and was confused that, does media query just overrides the elements. Here's what I understood:

MEDIA QUERY CSS:

@media screen and (max-width:1024px) {
    #global-wrapper-outer > #global-wrapper-inner {
        width: 100%;
    }
    #global-wrapper-outer > #global-wrapper-inner > nav {
        display: none;
    }
}

here you were able to override #global-wrapper-inner > nav i.e., 2nd media query selector, by display: none; because you never added the display line in the original css, because of which there was nothing to override you just have given that display type should be none. Whereas just in the 1st media query selector you already had given width:80%; Basically media query doesn't override as far as I have understood but it take precedence, like already explained by one of them by which media query comes to work: https://stackoverflow.com/a/19038303/15394464

also if still did not get your doubt clear, https://www.youtube.com/watch?v=acqN6atXVAE&t=288s then this might help.