虽然感觉,这东西完全没啥用!写了这么久我也没遇到过 !但是万一那天遇到了,回来看看相比也是极好的!
css阻塞:css默认为阻塞渲染资源(阻塞渲染资源与非阻塞渲染资源的不同之处在于下载的优先级别问题,阻塞资源高,优先下载),无论是否为css阻塞资源 都是会下载的,时间先后而已;媒介类型和媒体查询,可以让我们标记一些css为非阻塞资源。
js阻塞:js下载的时候浏览器会终止其他文件的下载,但是新式浏览器都开始做 js 的并行下载 也就是说js阻塞 可以在未来的某个时间忽略了,js阻塞 会阻塞css下载,所以这也是为什么一般强调初学者将css放在头部 ,js放在尾部,渲染js长时间执行的函数的时候 建议使用 settimeout 将这个手动延迟 不然你的用户可能会对着白色屏幕发呆!
网上找了点资料描绘的极为详细:
【导读】:在默认情况下,CSS会被当做渲染中的阻塞性资源,也就是说浏览器即使已经处理好了某些页面内容,只要CSSOM没有构建好,便不会进行渲染。所以要给你的CSS瘦身,提高传输速度,并使用媒介类型和媒介查询来解除阻塞。
在前部分中我们看到了关键的渲染途径需要同时具备DOM(Document Object Mode,文档对象模型)和CSSOM(CSS Object Model,CSS对象模型)来构造渲染树,这在渲染性能上有一个很重要的含义:HTML和CSS都是渲染过程中的阻塞性资源。HTML很明显,因为没有DOM的话,我们也没有任何东西来渲染,但是对CSS的要求也许并不明显。如果我们尝试渲染一个普通的页面,而不让CSS阻塞渲染过程,那会发生什么呢?
学习重点
- 默认情况下CSS被视为一种阻塞性渲染资源
- 媒介类型和媒介查询让我们能把一些CSS资源标记为非阻塞性渲染资源
- 不管是阻塞性的还是非阻塞性的行为,所有的CSS资源都是通过浏览器下载的
有 CSS 的纽约时报网站 无 CSS 的纽约时报网站
上面的例子展示了NYTimes在使用和不使用CSS时的样子,这表明了为什么直到CSS可用时才渲染 — 缺少CSS的页面实际上是无法使用的。事实上,右边的用户体验通常叫做“Flash of Unstyled Content” (FOUC)。所以结果是,浏览器会在同时具备了DOM和CSSOM时才渲染界面。
CSS是一种阻塞性渲染资源,需要让它尽可能快地下载到客户端,并在第一次渲染的时候进行优化。
然而,假如一些CSS样式只能用于某些特定的条件下怎么办呢?例如,当页面被打印时,或者被投影到大屏幕时。如果这些资源能够不阻塞渲染的话,那就太棒了!
CSS “媒介类型”和“媒介查询”使我们能够处理下列情况:
1
2
3
|
<link
href
=
"style.css"
rel
=
"stylesheet"
>
<link
href
=
"print.css"
rel
=
"stylesheet"
media
=
"print"
>
<link
href
=
"other.css"
rel
=
"stylesheet"
media
="
(min
-width
:
40em
)”
>
|
一个媒介查询由一个媒介类型和0个或多个检查特殊媒介特征的条件的表达式构成。例如,我们的第一个样式声明没有使用提供任何媒介类型和查询,因此它适用于各种情况 — 也就是说,它总是会阻塞渲染。另一方面,第二种样式只被用于当内容被打印时 — 也许你想要重新设置布局或改变字体等等 — 因此当这个样式第一次被加载时,它不会阻塞页面的渲染。最后一个样式声明提供了一个由浏览器来执行的媒介查询:如果条件符合的话,浏览器会在该样式下载完并处理完后才渲染。
使用媒介查询,我们的外观可以定制成特定的使用案例,例如显示和打印,还有一些动态的条件,例如在屏幕方向上的改变,调整大小等等。当声明你的样式资源时,一定要仔细注意媒介类型和媒介查询,因为它们会对关键渲染路径有很大的性能影响!
让我们来考虑一些实际的例子:
1
2
3
4
|
<link
href
=
"style.css"
rel
=
"stylesheet"
>
<link
href
=
"style.css"
rel
=
"stylesheet"
media
=
"screen"
>
<link
href
=
"portrait.css"
rel
=
"stylesheet"
media
=
"orientation:portrait"
>
<link
href
=
"print.css"
rel
=
"stylesheet"
media
=“print"
>
|
- 第一条声明是阻塞渲染的,并且匹配所有情况。
- 第二条声明也是阻塞渲染的:“screen”是默认的类型,如果你没有指定任何类型,默认会给设置成“screen”。因此,第一条和第二条实际上是一样的。
- 第三条声明有一个动态的媒介查询,当页面正在加载时会对其进行判断。当页面加载时跟据设备的方向来决定portrait.css是否会阻塞渲染。
- 最后一条声明只用于页面正在打印时,因此当页面第一次加载到浏览器中时,它不会阻塞渲染。
最后,要记住“阻塞渲染”只与资源是否会阻塞页面在浏览器的初次渲染有关。无论是否阻塞,CSS资源仍然会通过浏览器来下载,只是作为一项非阻塞性的低优先级资源。
1 <html> 2 <head> 3 </head> 4 <body> 5 xxxxxxxxxxxxxxx 6 <h1>推迟加载</h1> 7 <script type="text/javascript" src="a.js"></script> 8 <link href="a.css" rel="stylesheet" /> 9 </body> 10 </html>
1 alert("已暂停加载") 2 alert("开始加载")
1 <script type="text/javascript" src="a.js" async></script>
1 setTimeout("alert('异步加载成功')",2000) //测试IE时候a.js文件要修改
1 <script type="text/javascript"> 2 (function() { 3 var s = document.createElement('script'); 4 s.type = 'text/javascript'; 5 s.async = true; //这句可以删除,但是效果不变。 6 s.src = 'js/a.js'; 7 var x = document.getElementsByTagName('script')[0]; 8 x.parentNode.insertBefore(s, x); 9 })(); 10 </script>
1 <script type="text/javascript"> 2 window.οnlοad=function(){ 3 document.getElementById('div').innerHTML="onload完成" 4 } 5 </script>
6 //写在html中
1 (function() { 2 function async_load(){ 3 var s = document.createElement('script'); 4 s.type = 'text/javascript'; 5 s.async = true; 6 s.src = 'js/yibujiaz.js'; 7 var x = document.getElementsByTagName('script')[0]; 8 x.parentNode.insertBefore(s, x); 9 } 10 if (window.attachEvent) 11 window.attachEvent('onload', async_load); 12 else 13 window.addEventListener('load', async_load, false); 14 })();
1 // setTimeout("alert('异步加载成功')",2000) 2 // alert("已暂停加载") 3 // alert("开始加载")
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>异步加载</title> <!-- <script type="text/javascript" src="js/yibujiaz.js" async></script> --> <script type="text/javascript"> (function() { var s = document.createElement('script'); s.type = 'text/javascript'; s.src = 'js/yibujiaz.js'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })(); </script> <!-- <script type="text/javascript"> (function() { function async_load(){ var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = 'js/yibujiaz.js'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); } if (window.attachEvent) window.attachEvent('onload', async_load); else window.addEventListener('load', async_load, false); })(); </script> <script type="text/javascript"> window.οnlοad=function(){ document.getElementById('div').innerHTML="onload完成" } </script> --> <style type="text/css"> div{ width:200px; height:200px; background-color: blue; margin:0 auto; } </style> </head> <body> <div id="div"> </div> </body> </html>