【问题标题】:Difference Between HTML LINK Media and CSS Media QueriesHTML LINK 媒体和 CSS 媒体查询之间的区别
【发布时间】:2014-10-31 21:47:03
【问题描述】:

我知道添加媒体查询有两种方法:

HTML 链接:

<LINK REL="stylesheet" TYPE="text/css" MEDIA="(max-width: 1024px)" HREF="foo.css">

CSS:

@media all and (max-width: 1024px) {
    ......
}

我已阅读文档并且了解这两种方法之间的明显区别。但是,以下是我怀疑是否可以澄清的 2 个问题:

  1. 浏览器对 HTML 媒体链接的处理方式是否与 CSS 媒体查询不同?我的意思是,我知道是否在 css 中添加了 CSS 媒体查询,无论如何,所有 css 文件都会下载到所有设备,并且当浏览器解释编译后的 css 时,只有相应的媒体查询才会生效。但是如果媒体链接是在 HTML 中添加的,是否意味着浏览器只有在匹配指定宽度的设备时才会下载 foo.css?与 Css 媒体查询相比,浏览器处理 HTML 媒体链接的方式是否有所不同,还是完全一样,只是添加到网页的方式不同?

  2. 假设 foo.css 是否还有针对 1024 像素以外的更小宽度的媒体查询,如下所示:

    身体{ 填充:10px; }
    @media all and (max-width: 900px) { 身体 { 填充:5px; }
    }
    @media all and (max-width: 800px) { 身体 { 填充:0px; }
    }

如果上面的文件是这样使用 HTML 链接添加的:

<LINK REL="stylesheet" TYPE="text/css" MEDIA="(max-width: 1024px)" HREF="foo.css">

这会变成浏览器看待它的方式的嵌套媒体查询吗?我不明白的是,如果上面是使用html链接添加的,我不知道浏览器是否真的会这样看它变得无效:

@media all and (max-width: 1024px) {
    body {
       padding: 10px;
    } 

    @media all and (max-width: 900px) {
        body {
           padding: 5px;
        } 

    }

    @media all and (max-width: 800px) {
        body {
           padding: 0px;
        } 

    }

}

所以我的问题是,如果我在使用 HTML 媒体链接添加的 css 文件中有进一步的媒体查询,那有效吗?

编辑: 我使用桌面上的 chrome 查看了开发人员工具,我可以看到即使从桌面设备浏览平板电脑文件也已下载:

  1. 所以对于问题 1,假设所有浏览器(包括旧版浏览器)和移动浏览器执行相同的操作是否安全,即下载所有文件,即使它们位于 HTML 链接中?

  2. 对于问题 2,我可以看到当浏览器屏幕调整为平板电脑宽度时,chrome 确实使用平板电脑 css 内的媒体查询。 html 中为 1024px 链接的 css 文件被视为 media="(max-width: 1024px)"。但是,这是否意味着放置在平板电脑的 css 文件中的媒体查询实际上是嵌套的媒体查询?虽然有效,但逻辑上是不是错了?一些更严格的浏览器不认为这是有效的吗?

【问题讨论】:

  • 这是您可以轻松测试的内容。只需查看您的浏览器开发人员工具,看看感兴趣的浏览器是否使用未满足的“媒体”限定符对 &lt;link&gt; 发出 HTTP 请求。
  • @Pointy 当然。我现在做了。 :) 我已经通过编辑更新了我的问题。
  • 我只是想提出一个想法,因为我不确定。当涉及到包含时,我相信媒体查询只是包含 css 的选择器,而不是执行的布尔值。我想浏览器将下载和编译所有资源,而不管媒体查询如何,并在适当的地方应用规则。
  • 所以我想最后,链接标签媒体属性的唯一用途是帮助模块化您的响应式 CSS 代码...

标签: html css media-queries


【解决方案1】:

这是 W3C 对say about this 的要求:

媒体属性表示资源适用于哪个媒体。这 value 必须是有效的媒体查询。

[...]

但是,如果链接是外部资源链接,则媒体 属性是规定性的。用户代理必须应用外部 媒体属性的值与环境匹配时的资源,并且 其他有关条件适用,不得另行适用。

注意:外部资源可能在内部定义了进一步的限制 这限制了它的适用性。例如,一个 CSS 样式表可能 有一些@media 块。本规范不会覆盖此类 进一步的限制或要求。

我使用以下标记测试了 Chrome 中的行为:

<link rel="stylesheet" href="ge-960.css" media="screen and (min-width: 960px)">
<link rel="stylesheet" href="lt-960.css" media="screen and (max-width: 959px)">
  • 显然,无论屏幕分辨率如何,Chrome 都会下载所有 CSS 文件。
  • 但是,它只应用了匹配样式表中的规则
    • 它遵守样式表中所有匹配的 @media 规则

【讨论】:

    【解决方案2】:

    关于样式表下载,这是当前spec draft 所说的:

    用户代理应重新评估媒体查询以响应用户环境的变化,例如,如果设备从横向平铺到纵向,并相应地更改依赖于这些媒体查询的任何构造的行为。

    这意味着您不能只评估每个媒体查询然后下载适当的样式表,因为环境可能会发生变化,从而导致重新评估这些媒体查询。我认为它可以进行优化,但现在all browsers 下载所有样式表,无论媒体查询如何。

    对于第二个问题,规范没有提到 HTML 和 CSS 声明的媒体查询之间的任何区别。从 CSS3 开始允许嵌套媒体查询,并且将 @media-rules 放入已经标记有 media="…" 的样式表中应该与纯 CSS 嵌套媒体查询相同。

    【讨论】:

    • 非常感谢您这样说。我现在明白了,这是有道理的,因为浏览器必须下载所有内容,以便它可以在方向发生变化时重新评估。对于第二个问题,我从未意识到允许嵌套媒体查询。我一直认为嵌套媒体查询是不允许的。我确信我没有费心去谷歌搜索以确认这一点,因此我感到困惑。感谢您指出。帮了我很多。 :)
    • 它们在 CSS 2.1 中是不允许的,但从 CSS 3 开始就是这样。
    【解决方案3】:

    对于 HTML 媒体查询,无论媒体查询是否满足,都会下载 CSS 文件。但是不需要的 CSS 的 prasing 有点延迟,这会提高你的初始渲染。在某种程度上,您可以考虑使其成为非渲染阻塞。但是对于 CSS 媒体查询,无论是否满足查询,它们都会被完全解析和处理。

    【讨论】:

    • 感谢您提供此信息! this doc 中也提到了这一点。我认为当一个人有 10 个不同的样式表用于不同的屏幕时,这种优化会非常有用。