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

我最想知道的答案在这里考虑规范。

解决方法

What are the rules for CSS media query overlap?

级联。

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

What will happen,across all supporting browsers,at exactly 20em,and 45em?

在正好20em宽,您的第一和第二媒体查询将匹配。浏览器将在@media规则和级联中相应应用样式,因此如果有任何需要重写的冲突规则,最后声明的规则将获胜(考虑特定的选择器,!重要的等等)。同样对于第二和第三媒体查询,当视口正好是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:none和float:left将应用于类.sidebar的任何元素。

您可以将其视为应用规则,就好像媒体查询不是从那里开始的:

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

当浏览器匹配两个或更多个媒体查询时,如何发生级联的另一示例可以在this other answer中找到。

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

How do we space out media queries accurately to avoid overlap?

如果你想避免重叠,你只需要写相互排斥的媒体查询

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

看起来你已经有一个例子,这使我们到你的最后一个问题:

I’ve seen people use: things like 799px and then 800px,but what about a screen width of 799.5 px? (ObvIoUsly not on a regular display,but a retina one?)

这我不完全确定; CSS中的所有像素值都是逻辑像素,我一直很难找到一个浏览器来报告视口宽度的分数像素值。我试过试验一些iframe,但没有能够提出任何东西。

从我的实验,看起来Safari上的iOS轮廓所有分数像素值,以确保max-width:799px和min-width:800px将匹配,即使视口是真正的799.5px(显然匹配前者)。

1虽然没有一个在Conditional Rules moduleCascade module(后者是目前预定重写)中明确说明,级联意味着正常发生,因为规范只是说在任何和所有@媒体规则匹配浏览器或媒体。

猜你在找的CSS相关文章