async=true 用于 css 链接标签

Posted

技术标签:

【中文标题】async=true 用于 css 链接标签【英文标题】:async=true for css link tag 【发布时间】:2014-07-24 02:08:23 【问题描述】:

html5 中,脚本标签可以通过 async=true 异步加载

<script src="index.js" type="text/javascript" async="true"></script>

是否有任何等效的 CSS 资源?类似:

<link rel="stylesheet" type="text/css" async="true" href="style.css">

基本原理是让浏览器加载 css,并缓存它,以供以后的请求使用,但让其余的进程畅通无阻。 例如,在启动屏幕上。

【问题讨论】:

css 在页面加载时应用,异步如何工作? 我猜它会在样式可用时应用它们。 @serakfalcon 不是。谷歌字体块渲染页面 【参考方案1】:

我认为这行不通。

但是我们可以使用 JS 来做到这一点:

  var resource = document.createElement('link'); 
  resource.setAttribute("rel", "stylesheet");
  resource.setAttribute("href","path/to/cssfile.css");
  resource.setAttribute("type","text/css");      
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(resource);

我认为 它将实现您想要做的事情。

如果您不想使用javascript,请查看:How to load CSS asynchronously without using JavaScript?

希望对你有所帮助。

【讨论】:

这绝对与问题无关。 @RPM 怎么样?根据 OP,他想加载 css async 即,其余的 html 和这个 js script 也在做同样的事情,还有 op 标记 javascript 有问题。如果错了,请纠正我。 谢谢。这就是我最终做的事情,它适用于我的情况(急于加载缓存)。 非常感谢! +1 使用原生 javascript【参考方案2】:

2021 年编辑: 原始链接已移动 - 没有 JavaScript 的异步 CSS https://codepen.io/tigt/post/async-css-without-javascript

“似乎这个技巧会导致 Chrome & Firefox 更早地启动 body, 而且他们根本不会阻止正文样式表。”

<head>
  <!--[if IE]>
    <link rel="stylesheet" href="style.css"> 
  <![endif]-->
</head>
<body>
    <!--[if !IE]> -->
        <link rel="stylesheet" href="style.css" lazyload>
  <!-- <![endif]-->
</body>

文章还包含基准:

【讨论】:

链接失效 已修复,网址已移动【参考方案3】:

异步样式表加载不会阻止页面呈现,这对我来说非常有效((考虑到 pageSpeed 见解))...

var stylesheet = document.createElement('link');
stylesheet.href = 'fontawesome.min.css';
stylesheet.rel = 'stylesheet';
stylesheet.type = 'text/css';
// temporarily set media to something inapplicable to ensure it'll fetch without blocking render
stylesheet.media = 'only x';
// set the media back when the stylesheet loads
stylesheet.onload = function() stylesheet.media = 'all'
document.getElementsByTagName('head')[0].appendChild(stylesheet);

我能够以异步方式加载 fontawesome 图标的来源,而页面不会变慢或等待请求。

【讨论】:

【参考方案4】:

您如何看待使用 jQuery 的解决方案?

jQuery('head').append('<link rel="stylesheet" type="text/css" href="path/to/cssfile.css" />');

【讨论】:

【参考方案5】:

在不阻塞渲染的情况下加载 css

<link rel="preload" media="(min-width:801px)" href="styledesk.css" as="style">
<link rel="stylesheet" media="(min-width:801px)" href="styledesk.css">

更多信息在这里: https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content

【讨论】:

很有趣,但正如codepen.io/tigt/post/async-css-without-javascript 中提到的那样,如果您针对的是旧浏览器,这将无济于事,因为那里不存在此功能。【参考方案6】:

我的两分钱:

默认情况下,使用 src 或 href 在正文中下载的所有外部文件都是异步的

因此,不要将样式表的 link 标记(您希望以异步方式下载)放在 head 标记 中,而是将它们放在正文中的某个位置,最好是在顶端。示例:

<body>
    <link rel="stylesheet" href="path/to/your/file">
    <!--body content-->
</body>

脚本标签也是如此,如果您希望异步下载脚本,而不是将脚本标签放在头标签中,而是将其放在正文中的任何位置。在 body 内部的 script 标签中使用 async 属性是多余的,如果您希望在 DOM 加载后执行脚本,可以使用 defer 标签。

<body>
    <script src="path/to/your/file"></script>
    <!--body content-->
</body>

还有一点,async 和 defer 属性没有值,比如 true 或 false,它们的用法如下:

<script src="index.js" type="text/javascript" async></script>
<script src="index.js" type="text/javascript" defer></script>
<script src="index.js" type="text/javascript" defer></script>

所有这些都在 Chrome 83.0 上测试过

【讨论】:

以上是关于async=true 用于 css 链接标签的主要内容,如果未能解决你的问题,请参考以下文章

SAMLRequest 403 在 css 链接标签中拒绝访问

link 标签中“rel=stylesheet”的作用

前端1标签(input),css(选择器),js(Bom,Dom)

浅谈script标签中的async和defer

HTML a 标签的基本用法和常用属性

a标签链接添加颜色