CSS媒体查询重叠的规则是什么?

新手上路,请多包涵

我们如何准确地分隔媒体查询以避免重叠?

例如,如果我们考虑以下代码:

 @media (max-width: 20em) {
    /* for narrow viewport */
}

@media (min-width: 20em) and (max-width: 45em) {
    /* slightly wider viewport */
}

@media (min-width: 45em) {
    /* everything else */
}

在所有支持的浏览器中,恰好 20em 和 45em 会发生什么?

我见过人们使用:799px 和 800px 之类的东西,但是 799.5 px 的屏幕宽度呢? (显然不是在常规显示器上,而是在视网膜显示器上?)

考虑到规范,我对这里的答案非常好奇。

原文由 Baumr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

CSS媒体查询重叠的规则是什么?

级联。

@media 规则对级联是透明的,所以当两个或更多 @media 规则同时匹配时,浏览器应该应用所有匹配的规则中的样式,并解决级联因此。 1

在所有支持的浏览器中,恰好 20em 和 45em 会发生什么?

在正好 20em 宽处,您的第一个和第二个媒体查询都将匹配。浏览器将在 @media 规则中应用样式并相应地级联,因此如果有任何需要覆盖的冲突规则,最后声明的规则获胜(考虑到特定的选择器, !important , ETC)。当视口正好是 45em 宽时,第二个和第三个媒体查询也是如此。

考虑到您的示例代码,添加了一些实际的样式规则:

 @media (max-width: 20em) {
    .sidebar { display: none; }
}

@media (min-width: 20em) and (max-width: 45em) {
    .sidebar { display: block; float: left; }
}

当浏览器视口正好是 20em 宽时,这两个媒体查询都将返回 true。通过级联, display: block 覆盖 display: nonefloat: left 将适用于任何具有类 .sidebar 的元素 —432a172e0606。

您可以将其视为应用规则,就好像媒体查询一开始就不存在一样:

 .sidebar { display: none; }
.sidebar { display: block; float: left; }

当浏览器匹配两个或多个媒体查询时如何发生级联的另一个示例可以在 这个其他答案 中找到。

但是请注意,如果您的声明在两个 @media 规则中 重叠,那么所有这些规则都将适用。这里发生的是 @media 规则中的声明的 联合,而不仅仅是后者完全推翻了前者……这让我们想到了你之前的问题:

我们如何准确地分隔媒体查询以避免重叠?

如果您希望避免重叠,您只需要编写互斥的媒体查询。

请记住 min-max- 前缀的意思是“最小包含”和“最大包含”;这意味着 (min-width: 20em)(max-width: 20em) 都将匹配正好为 20em 宽的视口。

看起来您已经有一个示例,这将我们带到您的最后一个问题:

我见过人们使用:799px 和 800px 之类的东西,但是 799.5 px 的屏幕宽度呢? (显然不是在常规显示器上,而是在视网膜显示器上?)

这我不完全确定; CSS 中的所有像素值都是逻辑像素,我一直很难找到一个浏览器可以报告视口宽度的小数像素值。我尝试过使用一些 iframe,但无法提出任何建议。

从我的实验来看,iOS 上的 Safari 似乎会舍入所有小数像素值,以确保 max-width: 799pxmin-width: 800px 将匹配,即使视口真的是 799.5px(显然匹配前者)。


1尽管在 Conditional Rules 模块Cascade 模块(后者目前计划重写)中都没有明确说明,但级联暗示正常发生,因为规范只是说在任何以及所有与浏览器或媒体匹配的 @media 规则。

原文由 BoltClock 发布,翻译遵循 CC BY-SA 3.0 许可协议

我已经按照这里的建议尝试过:

 @media screen and (max-width: calc(48em - 1px)) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

但发现这不是一个好主意,因为它现在不能在我的 Ubuntu 桌面或我的 Android 手机上的 Chrome 上运行。 (如此处所述: calc() 在媒体查询中不起作用)但是,我找到了更好的方法……

 @media screen and (max-width: 47.9999em) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

和砰!

原文由 Pierre-Verthume Larivière 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题