Pau*_*ina 62 html css asynchronous
我正在尝试消除2个在我的网站上呈现阻止的CSS文件 - 它们出现在Google Page Speed Insights上.我遵循了不同的方法,但都没有成功.但是,最近,我发现了一篇关于Thinking Async的帖子,当我应用这段代码时:<script async src="https://third-party.com/resource.js"></script>它确实消除了这个问题.
但是,在发布后,页面丢失了样式.我不太确定会发生什么,因为代码可以工作但是上传后的样式不起作用.非常感谢您的帮助.谢谢
Vla*_*ero 109
触发异步样式表下载的技巧是使用<link>元素并为media属性设置无效值(我使用media ="none",但任何值都可以).当媒体查询的计算结果为false时,浏览器仍会下载样式表,但在呈现页面之前不会等待内容可用.
<link rel="stylesheet" href="css.css" media="none">
Run Code Online (Sandbox Code Playgroud)
样式表下载完成后,必须将media属性设置为有效值,以便将样式规则应用于文档.onload事件用于将media属性切换为all:
<link rel="stylesheet" href="css.css" media="none" onload="if(media!='all')media='all'">
Run Code Online (Sandbox Code Playgroud)
这种加载CSS的方法将比标准方法更快地向访问者提供可用内容.关键CSS仍然可以使用通常的阻塞方法(或者您可以内联它以获得最佳性能),并且非关键样式可以逐步下载并在稍后的解析/呈现过程中应用.
此技术使用JavaScript,但您可以通过在<link>元素中包含等效的阻止元素来满足非JavaScript浏览器<noscript>:
<link rel="stylesheet" href="css.css" media="none" onload="if(media!='all')media='all'"><noscript><link rel="stylesheet" href="css.css"></noscript>
Run Code Online (Sandbox Code Playgroud)
您可以在www.itcha.edu.sv中查看该操作
jab*_*tta 51
现在,您可以使用preload关键字的link元素.
同步版本:
<link href="style.css" rel="stylesheet">
Run Code Online (Sandbox Code Playgroud)
异步版本:
<link href="style.css" rel="preload" as="style">
Run Code Online (Sandbox Code Playgroud)
最近这个功能在现代浏览器中得到广泛支持.如果您需要旧版浏览器的后备,请使用loadCSS.
Firefox中默认禁用此功能.在Firefox实施解决方案之前,loadCSS(如上所述)可能是您最好的选择.以下评论来自此讨论:
我们决定采用不同的方法来实现rel = preload.我不知道什么时候会实施.
Fli*_*imm 12
media="print"和onloadfilament group 最近(2019 年 7 月)发表了一篇文章,给出了他们关于如何异步加载 CSS 的最新建议。尽管他们是流行的 Javascript 库loadCSS的开发者,但他们实际上推荐了这个不需要 Javascript 库的解决方案:
<link
rel="stylesheet"
href="/path/to/my.css"
media="print"
onload="this.media='all'; this.onload = null"
>
Run Code Online (Sandbox Code Playgroud)
Usingmedia="print"将指示浏览器不要在屏幕上使用此样式表,而是在打印时使用。浏览器确实会下载这些打印样式表,但是是异步的,这正是我们想要的。我们还希望样式表在下载后立即使用,为此我们设置了onload="this.media='all'; this.onload = null". (有些浏览器会调用onload两次,要解决这个问题,我们需要设置this.onload = null。)如果需要,您可以<noscript>为没有启用 Javascript 的少数用户添加后备。
在原来的文章值得一读,因为它进入更详细的比我在这里。csswizardry.com 上的这篇文章也值得一读。
你可以尝试以很多方式获得它:
1.使用media="bogus"和<link>脚
<head>
<!-- unimportant nonsense -->
<link rel="stylesheet" href="style.css" media="bogus">
</head>
<body>
<!-- other unimportant nonsense, such as content -->
<link rel="stylesheet" href="style.css">
</body>
Run Code Online (Sandbox Code Playgroud)
2.以旧方式插入DOM
<script type="text/javascript">
(function(){
var bsa = document.createElement('script');
bsa.type = 'text/javascript';
bsa.async = true;
bsa.src = 'https://s3.buysellads.com/ac/bsa.js';
(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(bsa);
})();
</script>
Run Code Online (Sandbox Code Playgroud)
3.如果你可以尝试插件,你可以试试 loadCSS
<script>
// include loadCSS here...
function loadCSS( href, before, media ){ ... }
// load a file
loadCSS( "path/to/mystylesheet.css" );
</script>
Run Code Online (Sandbox Code Playgroud)
下面的函数将创建并向文档添加您希望异步加载的所有样式表.(但是,多亏了Event Listener它,它只会在所有窗口的其他资源都加载后才会这样做.)
请参阅以下内容:
function loadAsyncStyleSheets() {
var asyncStyleSheets = [
'/stylesheets/async-stylesheet-1.css',
'/stylesheets/async-stylesheet-2.css'
];
for (var i = 0; i < asyncStyleSheets.length; i++) {
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', asyncStyleSheets[i]);
document.head.appendChild(link);
}
}
window.addEventListener('load', loadAsyncStyleSheets, false);
Run Code Online (Sandbox Code Playgroud)
<link rel="preload" href="mystyles.css" as="style" onload="this.rel='stylesheet'">
Run Code Online (Sandbox Code Playgroud)