30

默认情况下,我想给我的 body 元素一个绿色边框。在支持视网膜显示的设备上,我想先检查尺寸。在 ipad 上,我想给我的身体一个红色边框,在 iphone 上,我想给它一个蓝色边框。但是像这样嵌套媒体查询不起作用:

body { border: 1px solid green; }

@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { 
   @media (max-width: 768px) and (min-width: 320px) {
      body { border: 1px solid red; }
   }
   @media (max-width: 320px) {
      body { border: 1px solid blue; }
   }
}
4

2 回答 2

30

不,您需要使用and运算符并将其编写为两个查询。但是,您可以在 SCSS 中执行此操作,这将编译为 CSS,但它会通过展开它们并使用and运算符来组合它们。

这是一个常见的问题,一旦我第一次写 LESS 或 SCSS,我就再也不想回去写这个长手了。

长手CSS:

@media (-webkit-min-device-pixel-ratio: 2) and (max-width: 768px) and (min-width: 320px),
                  (min-resolution: 192dpi) and (max-width: 768px) and (min-width: 320px) {
  body {
    border: 1px solid red;
  }
}
@media (-webkit-min-device-pixel-ratio: 2) and (max-width: 320px),
                  (min-resolution: 192dpi) and (max-width: 320px) {
  body {
    border: 1px solid blue;
  }
}

嵌套查询可能有效,但支持因浏览器而异。

于 2013-04-19T21:58:18.220 回答
5

2020年,是的!

实际上,接受的答案已经过时了很长时间。即使在发布时,我什至不确定它在技术上是否正确。Firefox 从 2012 年开始支持嵌套,Chrome 从 2013 年开始支持嵌套(来源)。

您现在应该期待所有主要浏览器的支持,当然除了 IE 之外。

您可以使用以下 HTML 和 CSS 对其进行测试。只需在浏览器中打开开发面板并改变视口宽度即可。

<div id="abc">Example text</div>
#abc {
  background: green;
}
/* width < 801px */
@media (max-width: 800px) {
  #abc#abc {
    background: red;
  }
  /* 500px < width < 801px */
  @media (min-width: 500px) {
    #abc#abc#abc {
      background: yellow;
    }
  }
}

或者,查看这个 codepen

于 2020-03-16T03:59:30.957 回答