为什么媒体查询的顺序在CSS中很重要?

dsi*_*gnr 68 css css3 media-queries responsive-design

最近,我一直在设计响应更快的网站,而且我经常使用CSS媒体查询.我注意到的一种模式是定义媒体查询的顺序实际上很重要.我没有在每个浏览器中测试它,只是在Chrome上测试.这种行为有解释吗?有时,当您的网站无法正常工作时会感到沮丧,并且您不确定它是查询还是查询的编写顺序.

这是一个例子:

HTML

<body>
    <div class="one"><h1>Welcome to my website</h1></div>
    <div class="two"><a href="#">Contact us</a></div>
</body>
Run Code Online (Sandbox Code Playgroud)

CSS:

body{
font-size:1em; /* 16px */
}

.two{margin-top:2em;}



/* Media Queries */

@media (max-width: 480px) {
    .body{font-size: 0.938em;}

}
/* iphone */
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
    body {font-size: 0.938em;}
}
/*if greater than 1280x800*/
@media (min-width: 1200px) {
       .two{margin-top:8em;}
            }
/*1024x600*/
@media (max-height: 600px) {
       .two{margin-top:4em;}
}
/*1920x1024*/
@media (min-height: 1020px) {
       .two{margin-top:9em;}
}
/*1366x768*/
@media (min-height: 750px) and (max-height: 770px) {
       .two{margin-top:7em;}
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在最后编写1024x600的查询,浏览器将忽略它并应用CSS开头指定的边距值(margin-top:2em).

/* Media Queries - Re-arranged version */

@media (max-width: 480px) {
    .body{font-size: 0.938em;}
}
/* iphone */
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
    body {font-size: 0.938em;}
}
/*if greater than 1280x800*/
@media (min-width: 1200px) {
       .two{margin-top:8em;}
}
/*1920x1024*/
@media (min-height: 1020px) {
       .two{margin-top:9em;}
}
/*1366x768*/
@media (min-height: 750px) and (max-height: 770px) {
       .two{margin-top:7em;}
}
 /*1024x600*/
@media (max-height: 600px) {
       .two{margin-top:4em;}
}
Run Code Online (Sandbox Code Playgroud)

如果我对媒体查询的理解是正确的,那么顺序应该无关紧要,但似乎确实如此.可能是什么原因?

Ale*_*olo 119

那就是CSS的设计 - 层叠样式表.

这意味着,如果你应用两个碰撞到相同元素的规则,它将选择最后一个被声明的规则,除非第一个具有!important标记或更具体(例如html > bodyvs just body,后者不太具体).

所以,鉴于这个CSS

@media (max-width: 600px) {
  body {
    background: red;
  }
}

@media (max-width: 400px) {
  body {
    background: blue;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果浏览器窗口宽度为350像素,则背景将为蓝色,而使用此CSS

@media (max-width: 400px) {
  body {
    background: blue;
  }
}

@media (max-width: 600px) {
  body {
    background: red;
  }
}
Run Code Online (Sandbox Code Playgroud)

和窗口宽度相同,背景为红色.两个规则确实匹配,但第二个规则是应用的规则,因为它是最后一条规则.

最后,用

@media (max-width: 400px) {
  body {
    background: blue !important;
  }
}

@media (max-width: 600px) {
  body {
    background: red;
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

@media (max-width: 400px) {
  html > body {
    background: blue;
  }
}

@media (max-width: 600px) {
  body {
    background: red;
  }
}
Run Code Online (Sandbox Code Playgroud)

背景为蓝色(窗口宽350像素).

  • 谢谢.我从来没有想到这样一个简单的逻辑会毁了我的睡眠,共度夜晚.谢谢. (10认同)

Lir*_*n H 18

或者您可以将min-width添加到更大的媒体查询中,并且不管顺序如何都没有任何问题.

@media (min-width: 400.1px) and (max-width: 600px) {
  body {
    background: red;
  }
}

@media (max-width: 400px) {
  body {
    background: blue;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,无论如何,对于宽度为400.1px-600px的分辨率,背景颜色将始终为红色,对于宽度为400px或更小的分辨率,背景颜色将始终为蓝色.

  • 看到像CSS中400.1px的值,我感到畏缩.或1023px,1025px等 (6认同)
  • @Monstieur 1023px 或 1025px 有什么问题吗? (3认同)