在选择器中定义 CSS 媒体查询

Posted

技术标签:

【中文标题】在选择器中定义 CSS 媒体查询【英文标题】:Defining CSS media queries within selectors 【发布时间】:2015-05-06 10:53:49 【问题描述】:

如果不是在媒体查询中定义 css 选择器(示例 1),而是在 css 选择器中定义媒体查询(示例 2),是否会出现任何问题(性能是我的主要关注点)。

示例 1 - 媒体查询中的 css 选择器

@media (min-width: 600px) 
  .foo  ... 
  .bar  ... 
  .hello  ... 
  .world ... 


@media (min-width: 1000px) 
  .foo  ... 
  .bar  ... 
  .hello  ... 
  .world ... 


@media (min-width: 1500px) 
  .foo  ... 
  .bar  ... 
  .hello  ... 
  .world ... 

示例 2 - css 选择器中的媒体查询

.foo 
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 


.bar 
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 


.hello 
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 


.world
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 

您可能想知道“为什么要这样做?”。 LESS 在跨内部媒体查询扩展类以及范围变量方面存在一些限制。

【问题讨论】:

在 LESS 编译或浏览器渲染方面的性能差异?后者取决于 CSS 的生成方式,因为样式规则可能出现在 @media 规则中,但不会反过来。 第二个示例如何工作? “选择器”是指mixins 吗?在任何规则之外调用,这些混入应该可以工作,但你的问题中写的出现并没有 afaik。您应该添加像.foo() @media @media @media 这样的括号,这样这种情况就不会输出为(无效的)CSS,而只是定义为一个mixin,然后您可以调用这个mixin,它会输出3个媒体规则,每个规则都有规则跨度> 在我的测试中,似乎不支持这种定义媒体查询的方式。 在 Firefox 中使用 ID 选择器时,使用这种传统支持似乎不起作用:@media (min-width: 1500px) #foo ... 【参考方案1】:

问题是它不起作用!多年来,情况可能发生了变化。我尝试将媒体查询放在选择器中,至少 Firefox 抱怨它的属性名称无效。

MDN 是这样说的:

@media at 规则可以放在代码的顶层,或者 嵌套在任何其他条件组中。

它只能嵌套在另一个规则中的条件组中。

【讨论】:

我也无法让它工作。你能举个例子,“它只能嵌套在另一个条件组中。”是什么意思? @1.21gigawatts 例如@media screen 所以它不能打印,它也可以是@supports 但不在选择器内:selector 。这就是它的意思;)(如果有帮助的话)【参考方案2】:

简短的回答,不。在 CSS 选择器中定义媒体查询没有性能问题。

但是让我们潜入...

正如 Anselm Hannemann 的精彩文章 Web Performance: One or Thousands of Media Queries 中所述,以您的方式添加媒体查询不会造成性能损失。

只要在每个选择器中使用相同的媒体查询集,就不会对性能造成重大影响,只是您的 CSS 文件可能会稍大一些。

.foo 
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 


.bar 
  @media (min-width: 600px)  ... 
  @media (min-width: 1000px)  ... 
  @media (min-width: 1500px)  ... 

但是,您使用多少不同媒体查询确实很重要。不同的是不同的min-widthsmax-widths等等。

【讨论】:

【参考方案3】:

浏览器处理媒体查询的方式不应该存在性能差异。浏览器引擎会序列化并去除重复的媒体查询,因此它们只需要评估每个媒体查询一次。他们还缓存查询,以便他们以后可以重新使用它。假设您的值基本相同,则在代码中使用一个大型或多个媒体查询并不重要。


可能出现性能问题的一些可能性

您使用了多个具有不同值的媒体查询,并且浏览器窗口的大小已重新调整。随着浏览器窗口大小的调整,多个媒体查询可能会对 CPU 造成很大的开销。 当 CSS 选择器过于复杂时。与多个媒体查询相比,复杂的 CSS 选择器对性能的影响更大。因此,在复杂的选择器中包含多个媒体查询可能会导致性能问题

【讨论】:

以上是关于在选择器中定义 CSS 媒体查询的主要内容,如果未能解决你的问题,请参考以下文章

IE 的 CSS 选择器限制中如何计算媒体查询?

CSS媒体查询和选择器[重复]

JQuery Mobile、Bootstrap 和 CSS3 媒体查询,选择啥组合

针对不同媒体查询的不同 CSS 文件

覆盖 CSS 媒体查询

LESS:您可以将 CSS 选择器与媒体查询分组吗?