当前位置: 首页 > 面试题库 >

如何避免媒体查询重叠?

齐飞星
2023-03-14
问题内容

级联正是CSS变得特别而强大的原因。但在媒体查询的情况下,重叠 似乎有问题。

考虑以下CSS(CSS媒体查询重叠的连续规则):

/* Standard - for all screens below 20em */

body { color: black; font-size: 1em; }

/* Query A - slightly wider, mobile viewport */

@media (min-width: 20em) and (max-width: 45em) {
    body { color: red; } /* supposed to be unique for this width */
}

/* Query B - everything else */

@media (min-width: 45em) {
    body { font-size: larger; } /* because viewport is bigger */
}

因此,当屏幕正好为45em宽时,将根据标准CSS级联来处理45em处的重叠:

  • 所有max-width: 45em定义都将首先应用,
  • min-width: 45em并将在此之后全部应用。

请考虑以下两个条件:

  • 通常black,所有文本都是,但是 查询A 是唯一的并且具有color: red
  • 由于 查询B 适用于较大的视口,因此其文本具有CSS font-size: larger

因此,在恰好为45em的宽度处,我们将得到 大而红色的文本避免这种情况的最佳解决方案是什么?

我看到两种可能性:

  1. 重新声明要color: blackQuery B中 包含的文本,但是如果您以后选择更改,则要管理两个声明color。(当然,这单行代码不是这样的问题,但是可以想象还有很多其他的声明和选择器。)

  2. 通过使用像max-width: 799px和这样的像素值来避免重叠min-width: 800px,但是您使用的是像素-我猜它们分别可能是49.9375em和50em。但是,如果默认值不再是16em而又四舍五入怎么办?而且我们仍然不确定在这个差距会发生什么。(打破时空连续性的黑洞?)

两者都有缺点…还有其他想法吗?


问题答案:

@media为任何给定的媒体查询创建两个互斥的块的唯一可靠方法not在其中一个块中取反。不幸的是,这意味着对每个@media块重复一次媒体查询。因此,例如:

@media (max-width: 49.9375em) {
    body {
        color: red;
    }
}

@media (min-width: 50em) {
    body {
        font-size: larger;
    }
}

您将拥有:

/* 
 * Note: Media Queries 4 still requires 'not' to be followed by a
 * media type (e.g. 'all' or 'screen') for reasons I cannot comprehend.
 */
@media not all and (min-width: 50em) {
    body {
        color: red;
    }
}

@media (min-width: 50em) {
    body {
        font-size: larger;
    }
}

这在缩小范围媒体功能(例如width和)之间的差距方面非常有效,height因为它实际上将其变成了“或非”方案。但是,就像前两个选项一样,它也不是完美的:如上所述,您必须重复两次相同的媒体查询,然后将not其中一个添加。没有条件规则3中@media所述的if / else构造。

尽管我在回答上一个问题时提到了这一点:

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

应该指出的是,在四舍五入时,我注意到了一些怪癖。不过,我一直没能找到一个分数值,将回避 双方
媒体查询,最终没有从任一组规则(其中,顺便说一句,这是最坏的情况接受的风格,所以不用担心关于可能创建时空裂痕的内容)。这必须意味着浏览器(至少是我测试过的Safari)在确保它们满足媒体查询方面做得很合理,即使您的值不同(相差1个CSS像素)。

但是,当涉及到在桌面浏览器上可以观察到的较大间隙的单元时,就像ems一样,存在较大的误差范围。例如,有一条评论建议使用49.99999em而不是比49.9375em更为随意的内容,但显然存在区别,至少默认字体大小为16px。

我简化了代码,将媒体查询更改为使用十进制值,然后将代码放入jsFiddle中:

@media (max-width: 49.9375em) {
    body {
        color: red;
    }
}

@media (min-width: 50em) {
    body {
        font-size: larger;
    }
}

如果将“结果”窗格的大小调整为正好为800像素(文本将更新以指导您前进),则实际上最终会根据[@media (max-width: 49.9375em)使用了还是[@media (max-width:49.99999em)使用了不同的结果(我也对此感到惊讶)…

无论哪种方式,您都是对的:选项2也有其缺点。老实说,我并不特别喜欢它,因为我不想打破我无法控制的设备和用户代理怪癖。如果您像我一样,我认为最好以更警惕您的代码的代价(?)来解决重新声明规则的不便之处,因为作为作者,这至少仍然在您的控制范围之内。



 类似资料:
  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 主要内容:1. 媒体类型,2. 媒体特性,3. 逻辑操作符,4. 定义媒体查询随着移动设备的快速普及,用户不再只是通过传统的电脑系来浏览 Web 内容,越来越多的用户开始使用各种尺寸的智能手机、平板电脑或者其它设备来浏览 Web 内容,为了确保使用不同设备的用户都能拥有不错的体验就需要用到媒体查询。 媒体查询是 CSS 样式表最重要的功能之一,所谓媒体查询指的就是根据不同的媒体类型(设备类型)和条件来区分各种设备(例如:电脑、手机、平板电脑、盲文设备等),并为它们分别定义不

  • 响应式网站设计只有弹性布局这一个技巧是不够用的,媒体查询( media queries )也是响应式设计的核心技巧之一。媒体查询是可应用于 CSS 样式的简单过滤器。有了这些过滤器,我们可以根据设备呈现内容的特点轻松更改样式,包括显示屏类型、宽度、高度、方向甚至是分辨率。 在 CSS2.1 中定义了媒体类型,通过给 元素添加 media 属性,可以为不同的媒体类型加载不同的样式表。 <link r

  • 在早些时候,为了满足移动用户的需求,需要为移动设备专门建立一个额外的网站。随着响应式设计的出现,这种做法已经越来越少见了。 2010年5月25日,Ethan Marcotte在A List Apart上发表了一篇开创性的文章,在这篇名为Responsive Web Design的文章中,他将媒体查询、弹性网格布局、弹性图片这三种已有的开发技术整合起来,并命名为响应式Web设计(RWD,Respon

  • 我想将此条件转换为CSS媒体查询: 编辑: 事实上,我想在这种情况下瞄准Ipad: 因此,如果是任何设备和当前宽度,则应应用CSS 谢谢