CSS媒体查询重叠的规则是什么?
级联。
@media
规则对级联是透明的,所以当两个或多个规则同时匹配时,浏览器应该在所有匹配的规则中应用样式,并相应地解析级联。
在所有支持的浏览器中,精确到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: none
和float: left
将应用于类.sidebar
的任何元素。
你可以把它看作是适用的规则,如果媒体查询不在那里开始:
.sidebar { display: none; }
.sidebar { display: block; float: left; }
的级联如何发生时,浏览器两个或两个以上媒体查询匹配的另一个例子被发现在this other answer。
但是,请注意,如果您在@media
规则中有不是重叠的声明,则所有这些规则将适用。这里发生的是工会在@media
规则的声明,不只是后者完全否定前...这将我们带到您先前的问题:
我们如何精确隔离媒体查询以避免重叠?
如果您希望避免重叠,您只需编写互斥的媒体查询。请注意,min-
和max-
前缀的含义是“最小包含”和“最大包含”;这意味着(min-width: 20em)
和(max-width: 20em)
都将匹配一个恰好为20em宽的视口。
看起来你已经有一个例子,它给我们带来了最后一个问题:
我见过的人使用:之类的东西799px,然后800像素,但对于799.5像素的屏幕宽度? (显然不是正规的显示屏,而是一个视网膜显示屏?)
这个我不完全确定; CSS中的所有像素值都是逻辑像素,并且我一直很难找到一个能够报告视口宽度的小数像素值的浏览器。我尝试过使用一些iframe,但一直没有能够拿出任何东西。
从我的实验来看,iOS上的Safari将所有分数像素值舍入以确保max-width: 799px
和min-width: 800px
中的任何一个匹配,即使视口真的是799.5px(显然与前者匹配)。
虽然没有这在明确陈述任Conditional Rules module或Cascade module(后者这是目前定于重写的),级联是隐含发生正常的,因为该规范简单地说,在任何和全部@media
规则中应用样式来匹配浏览器或媒体。
你目前的问题标题似乎不符合你的要求。这似乎是你的问题内容的第一行会更适合作为标题:) – BoltClock
@BoltClock,一如既往的感谢 - 我将它们转换;但你是如何解释“隔开媒体查询”的? – Baumr
guess @media(...)小于或等于,大于或等于。你最好使用最大宽度的像素 – 2012-11-28 17:40:37