我如何 link 带有媒体查询的样式表,以便仅在满足媒体查询时才下载它

How can I link a stylesheet with a media query such that it is downloaded only when the media query is satisifed

我在一个页面中包含 2 个样式表,一个是始终需要的移动版本。在更大的屏幕上,我想另外加载 desktop.css。所以我link桌面风格是这样的:

 <link href="/css/desktop.css" rel="stylesheet" media="all and (min-width: 780px)" />

我认为浏览器足够聪明,可以只在大屏幕上下载 desktop.css。但是它总是加载它。

是否可以在不满足媒体查询时阻止浏览器下载?

不,这是不可能的。对于媒体查询,资源仍在下载(尽管通常优先级较低)但未应用。

即使 media=print 也是如此。我不清楚确切的原因,但有一个简短的讨论 in this issue,表明它破坏了太多网站 - 网站可能会检查 CSSOM 中的媒体查询,即使它们不匹配。该问题阐明 link rel=“preload” 确实在下载方面尊重媒体查询,但那里的破损风险较小(预加载只是一个优化提示)。

下载不匹配的媒体查询(但不阻塞渲染)这一事实实际上构成了 a bit of a hack to load CSS async 的基础,代码如下:

<link rel="stylesheet" href="/path/to/my.css" media="print" onload="this.media='all'">