我们如何准确地分隔媒体查询以避免重叠?
例如,如果我们考虑以下代码:
@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 许可协议
级联。
@media
规则对级联是透明的,所以当两个或更多@media
规则同时匹配时,浏览器应该应用所有匹配的规则中的样式,并解决级联因此。 1在正好 20em 宽处,您的第一个和第二个媒体查询都将匹配。浏览器将在
@media
规则中应用样式并相应地级联,因此如果有任何需要覆盖的冲突规则,最后声明的规则获胜(考虑到特定的选择器,!important
, ETC)。当视口正好是 45em 宽时,第二个和第三个媒体查询也是如此。考虑到您的示例代码,添加了一些实际的样式规则:
当浏览器视口正好是 20em 宽时,这两个媒体查询都将返回 true。通过级联,
display: block
覆盖display: none
和float: left
将适用于任何具有类.sidebar
的元素 —432a172e0606。您可以将其视为应用规则,就好像媒体查询一开始就不存在一样:
当浏览器匹配两个或多个媒体查询时如何发生级联的另一个示例可以在 这个其他答案 中找到。
但是请注意,如果您的声明在两个
@media
规则中 不 重叠,那么所有这些规则都将适用。这里发生的是@media
规则中的声明的 联合,而不仅仅是后者完全推翻了前者……这让我们想到了你之前的问题:如果您希望避免重叠,您只需要编写互斥的媒体查询。
请记住
min-
和max-
前缀的意思是“最小包含”和“最大包含”;这意味着(min-width: 20em)
和(max-width: 20em)
都将匹配正好为 20em 宽的视口。看起来您已经有一个示例,这将我们带到您的最后一个问题:
这我不完全确定; CSS 中的所有像素值都是逻辑像素,我一直很难找到一个浏览器可以报告视口宽度的小数像素值。我尝试过使用一些 iframe,但无法提出任何建议。
从我的实验来看,iOS 上的 Safari 似乎会舍入所有小数像素值,以确保
max-width: 799px
和min-width: 800px
将匹配,即使视口真的是 799.5px(显然匹配前者)。1尽管在 Conditional Rules 模块 或 Cascade 模块(后者目前计划重写)中都没有明确说明,但级联暗示正常发生,因为规范只是说在任何以及所有与浏览器或媒体匹配的
@media
规则。