小编典典

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

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呢?(显然不是常规显示器,而是视网膜显示器?)

考虑到规格,我对此最好奇。


阅读 585

收藏
2020-05-16

共1个答案

小编典典

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

级联。

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

在所有支持的浏览器上,分别以20em和45em会发生什么?

恰好在20em宽处,您的第一个和第二个媒体查询都将匹配。浏览器将在这两个@media规则中应用样式,并相应地进行级联,因此,如果有任何冲突的规则需要被覆盖,则最后声明的一个将获胜(考虑特定的选择器!important等)。当视口恰好为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

您可以将其视为应用规则,就好像媒体查询并非始于此:

.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: 799px和之一min-width: 800px匹配,即使视口确实为799.5px(显然与前者匹配)也是如此。


1 尽管“ 条件规则”模块或“层叠”模(目前已计划重写)中均未明确说明,但是隐含了级联正常发生的情况,因为该规范只是说要在任何样式中应用样式以及@media与浏览器或媒体匹配的所有规则。

2020-05-16