如何防止 CSS 渲染阻止我的网站?

Posted

技术标签:

【中文标题】如何防止 CSS 渲染阻止我的网站?【英文标题】:How to keep CSS from render-blocking my website? 【发布时间】:2014-10-03 12:19:14 【问题描述】:

我正在尝试优化我的移动网页的加载速度,为此我正在使用该网站:

https://developers.google.com/speed/pagespeed/insights

本网站评估我的来源并告诉我可以改进的地方。在我的网站上,我下载了一种字体:

<link href="//fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet">

显然这会阻止我的页面的呈现。现在,如果这是 javascript,我可以在标签中使用 async 字,它会解决问题,但这不是我正在加载的 JavaScript 文件!

有没有办法阻止这个资源阻止我的浏览器并强制它等到它被下载?

【问题讨论】:

您可以使用 加载正文末尾的字体。 . 仍然,这会导致 FOUC,就像使用 JS 一样。你想让他们再等一会儿,还是有闪烁?就个人而言,我会等待...... @dandavis:你是对的,当然,虽然从技术上讲,stylelinkbody 内部都无效(或 html,只是 head)(虽然每晚spec 有一个scoped 允许它的属性)。但我认为世界上没有浏览器在乎。使用 JavaScript 可能没有必要。人们可能希望通过将 JS 放入 head 中来尽快开始下载最微小的部分,但浏览器的预取扫描器更有可能尽快找到 link 元素... @dandavis:谢谢,我会测试这个选项。我个人不介意 FOUC,所以我相信这是我需要的! @dandavis:FWIW,我会把它作为答案发布(引用新的scoped attribute)。 搞定了。谁来发布答案? xD 【参考方案1】:

你可以用 JavaScript 做到这一点:

<script>
(function() 
    var link = document.createElement('link');
    link.rel = "stylesheet";
    link.href = "//fonts.googleapis.com/css?family=Open+Sans:400,700";
    document.querySelector("head").appendChild(link);
)();
</script>

字体将与主渲染一起加载到带外。当然,这意味着当字体加载完成时会有视觉上的变化……如果用户禁用了 JavaScript,它根本不会加载字体。


或者,正如 dandavis 指出的那样,您可以在 body 的末尾使用 style 元素,就在结束 &lt;/body&gt; 标记之前:

<style>
@import "//fonts.googleapis.com/css?family=Open+Sans:400,700"
</style>

现在这是有效的 HTML(截至 HTML 5.2 的 20170808 草案),但如果您在 style 中放置 style 甚至在它生效之前,我从来没有遇到过关心它的浏览器。

与使用 JavaScript 相比,这样做的优点是:

    理论上,浏览器的预取扫描器可能找到 style 元素并提前开始下载(尽管如果您将 JavaScript 放入 head,这种可能性不大) , 和

    即使用户禁用了 JavaScript,它也能正常工作。

或者,您可以将link 元素移动到body 的末尾,但目前,这是无效的,scoped 属性(还没有?)似乎不适用。 (为什么让它适用于style 而不是link[rel=stylesheet]?我不知道,也许只是还没有到达那里......)

【讨论】:

这个方案和dandavis比较,有什么区别?如果没有启用 JS,他的解决方案仍然有效吗?而这个不会。这种解决方案的主要优势是什么? @Flame_Phoenix:实际上我想我可能会对 Dan 的做法稍作修改:将 link 元素放在 body 的末尾。它不是有效的 HTML,但我认为地球上没有真正关心的浏览器。或者使用style 元素;在时刻,这也是无效的,但如果你在其上抛出scoped 属性,显然它是will be valid fairly soon。 (不,我不知道他们为什么要将scoped 添加到style 而不是link[rel=stylesheet]。也许只是“还没有”。) 如果您将其添加为答案,我将给予荣誉++并接受它:D @Flame_Phoenix:dandavis 似乎不想发布答案,所以我更新了上面的内容。 @T.J.Crowder 这是有效的 HTML as of HTML 5.2【参考方案2】:
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js"></script>
<script>
 WebFont.load(
    google: 
      families: ['Open Sans:400,700,400italic,700italic']
    
  );
</script>

【讨论】:

来自审核队列:我可以请求您为您的答案添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。

以上是关于如何防止 CSS 渲染阻止我的网站?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止从我的网站下载视频

页面速度 - 消除渲染阻止

防止菜单在 768px 显示 CSS 媒体查询中折叠

如何防止我的网站页面通过iFrame的第三方网站框架加载

阻止从应用程序链接到我的网站

CSS 不会阻止 Firefox Quantum 上的渲染