Reputation: 5276
I know script files can use the DEFER and ASYNC keywords on a resource include. Do these keywords also work for stylesheet (i.e., CSS) includes?
Syntax would presumably be:
<link rel="stylesheet" type="text/css" href="./path/to/style.css" defer />
I just don't know if it's allowed or not.
Upvotes: 61
Views: 80655
Reputation: 587
Credit: https://www.giftofspeed.com/defer-loading-css/
Add the following above the closing </body>
tag of your html document
<script type="text/javascript">
/* First CSS File */
var giftofspeed = document.createElement('link');
giftofspeed.rel = 'stylesheet';
giftofspeed.href = '../css/yourcssfile.css';
giftofspeed.type = 'text/css';
var godefer = document.getElementsByTagName('link')[0];
godefer.parentNode.insertBefore(giftofspeed, godefer);
/* Second CSS File */
var giftofspeed2 = document.createElement('link');
giftofspeed2.rel = 'stylesheet';
giftofspeed2.href = '../css/yourcssfile2.css';
giftofspeed2.type = 'text/css';
var godefer2 = document.getElementsByTagName('link')[0];
godefer2.parentNode.insertBefore(giftofspeed2, godefer2);
</script>
Upvotes: 19
Reputation: 5929
Lighthouse seems to like this:
<script>
window.addEventListener('load', () => {
let link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = "/path/to/style.css";
document.head.appendChild(link)
})
</script>
Upvotes: 2
Reputation: 359
As of Sep 2020 i found that at least Chrome have native support to defer CSS with the attribute rel="preload"
to make an async load of the file
<link href="main.css" rel="stylesheet" rel="preload" as="style">
You can use a more comprehensive approach using JavaScript to make it compatible with most browsers and include a noscript
option when no JS is enabled
<link href="main.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="main.css"></noscript>
source: https://web.dev/defer-non-critical-css/
Upvotes: 20
Reputation: 7388
I can't find it documented anywhere but my findings are:
How it was tested
What I tested
I have one stylesheet importing custom fonts and applying the fonts.
Before:
Text using the custom font was invisible until it was fully loaded and then it appeared.
After/Result:
So added => Result is that the text is visible immediately when the page is starting to render but using the fallback font, then after a while it switches to the custom font.
So it seems like at least Google Chrome supports defer on <link>
tags as well even if it's not documented anywhere publicly...
Upvotes: 2
Reputation: 1210
You could do this:
<link rel="stylesheet" href="/css/style.css" media="none" onload="if(media!=='all')media='all'" >
and create a noscript fallback
Upvotes: 34
Reputation: 37177
Defer
and Async
are specific attributes of the tag <script>
https://developer.mozilla.org/en/docs/Web/HTML/Element/script
They will not work in other tags, because they don't exist there. A stylesheet is not a script that contains logic to be executed in parallel or after the loading. A stylesheet is a list of static styles that get applied atomically to html.
Upvotes: 51