先了解一下 浏览器的渲染原理:

当我们在浏览器输入URL 时,浏览器会返回我们一个HTML文档,将文档下载下来后,便开始从上到下开始解析。解析完成之后就会生成DOM。如果页面中有css,会根据css的内容生成cssom, 然后DOM会和cssom结合生成一个渲染树,最后浏览器会根据渲染树的内容,计算出各个节点的大小和位置绘制在页面上。

js 会阻碍浏览器的解析,解析遇到js会停止渲染,优先去加载或者执行js,处理完毕后再继续渲染。

如果,js脚本标签前面有link样式链接,js会等样式加载和解析完毕才会执行JS。

在现在浏览器中,为了减缓渲染被阻塞的情况,现代的浏览器都使用了猜测预加载。当解析被阻塞的时候,浏览器会有一个轻量级的HTML(或CSS)扫描器(scanner)继续在文档中扫描,查找那些将来可能能够用到的资源文件的url,在渲染器使用它们之前将其下载下来。

在这里我们可以明确DOMContentLoaded所计算的时间,当文档中没有脚本时,浏览器解析完文档便能触发 DOMContentLoaded 事件;如果文档中包含脚本,则脚本会阻塞文档的解析,而脚本需要等位于脚本前面的css加载完才能执行。在任何情况下,DOMContentLoaded 的触发不需要等待图片等其他资源加载完成。

接下来,我们来说说load,页面上所有的资源(图片,音频,视频等)被加载以后才会触发load事件,简单来说,页面的load事件会在DOMContentLoaded被触发之后才触发。

我们在 jQuery 中经常使用的 $(document).ready(function() { // ...代码... }); 其实监听的就是 DOMContentLoaded 事件,而 $(document).load(function() { // ...代码... }); 监听的是 load 事件。在用jquery的时候,我们一般都会将函数调用写在ready方法内,就是页面被解析后,我们就可以访问整个页面的所有dom元素,可以缩短页面的可交互时间,提高整个页面的体验。

在面试的过程中,经常会有人在回答页面的优化中提到将js放到body标签底部,原因是因为浏览器生成Dom树的时候是一行一行读HTML代码的,script标签放在最后面就不会影响前面的页面的渲染。那么问题来了,既然Dom树完全生成好后页面才能渲染出来,浏览器又必须读完全部HTML才能生成完整的Dom树,script标签不放在body底部是不是也一样,因为dom树的生成需要整个文档解析完毕。

我们再来看一下chrome在页面渲染过程中的,绿色标志线是First Paint的时间。纳尼,为什么会出现firstpaint,页面的paint不是在渲染树生成之后吗?其实现代浏览器为了更好的用户体验,渲染引擎将尝试尽快在屏幕上显示的内容。它不会等到所有HTML解析之前开始构建和布局渲染树。部分的内容将被解析并显示。也就是说浏览器能够渲染不完整的dom树和cssom,尽快的减少白屏的时间。假如我们将js放在header,js将阻塞解析dom,dom的内容会影响到First Paint,导致First Paint延后。所以说我们会将js放在后面,以减少First Paint的时间,但是不会减少DOMContentLoaded被触发的时间。我们再来看一下chrome在页面渲染过程中的,绿色标志线是First Paint的时间。纳尼,为什么会出现firstpaint,页面的paint不是在渲染树生成之后吗?其实现代浏览器为了更好的用户体验,渲染引擎将尝试尽快在屏幕上显示的内容。它不会等到所有HTML解析之前开始构建和布局渲染树。部分的内容将被解析并显示。也就是说浏览器能够渲染不完整的dom树和cssom,尽快的减少白屏的时间。假如我们将js放在header,js将阻塞解析dom,dom的内容会影响到First Paint,导致First Paint延后。所以说我们会将js放在后面,以减少First Paint的时间,但是不会减少DOMContentLoaded被触发的时间。

为什么要把js放在页面底部,css放在顶部相关推荐

  1. 高性能web建站规则(将js放在页面底部)

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/80123552 简单解释一下为什么要将js放在页面底部: 浏览 ...

  2. fish.js实现页面底部小鱼跳跃动画

    fish.js:用于绘制小鱼跳跃相关动画,依赖jquery.js var RENDERER = {POINT_INTERVAL : 5,FISH_COUNT : 3,MAX_INTERVAL_COUN ...

  3. css 图片紧贴页面底部,CSS StickyFooter——当内容不足一屏时footer紧贴底部

    本文作者:IMWeb 结一 未经同意,禁止转载 一般来说我们的footer是跟着内容走的,所以当内容较少不足一屏的时候,footer也会跟着内容往上走,导致下面一段空白.所以这里我们来探讨下当内容不足 ...

  4. 解决 vue路由跳转到新页面底部而不是顶部和后退到首页就不让他继续后退了

    mounted () {this.$router.afterEach((to, from, next) => {window.scrollTo(0, 0); //跳到别的页面会自动滚动底部 }) ...

  5. CSS样式为什么放在head中,而不放在body底部

    CSS样式为什么放在head中,而不放在body底部 1. 放在body底部 代码: <!DOCTYPE html> <html lang="en"> &l ...

  6. 元素始终置于页面底部

    本文实例: 按钮始终在距离页面底部16px的位置,注意是页面底部,不是屏幕底部 如果放置在屏幕底部,只需要给元素设置以下内容 .element {position: fixed;bottom: 16p ...

  7. js 下拉底部加载|滑轮滚动到页面底部ajax加载数据的实例

    转载链接:http://www.cnblogs.com/thinksley/archive/2013/05/12/3074237.html 滚动下拉到页面底部加载数据是很多瀑布流网站的做法,那来看看配 ...

  8. JS实现让页脚一直固定在页面底部

    2019独角兽企业重金招聘Python工程师标准>>> JS实现页脚在浏览器可视范围内始终置底. 如下图所示: 代码如下: <!DOCTYPE html> <htm ...

  9. js实现判断滚动条滚到页面底部并执行事件的方法

    这里我主要介绍JS实现判断滚动条滚到页面底部并执行事件的方法: 需要了解三个dom元素,分别是:clientHeight.offsetHeight.scrollTop. clientHeight:这个 ...

最新文章

  1. Nagios监控笔记上
  2. 【crontab】误删crontab及其恢复
  3. java 网络通信协议_JAVA-基础-网络通信协议
  4. 看准网点评没有了_大众点评“亡”于2020
  5. Winform中通过代码给PanelControl添加子控件并进行定位
  6. Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)
  7. 即时通讯音视频开发(八):常见的实时语音通讯编码标准
  8. hbuilder打包ios_ios开发证书的作用及申请步骤
  9. 分析uboot中 make xxx_config过程
  10. 当代大学查寝奇葩操作大赏 | 今日最佳
  11. 判断IE版本与各浏览器的语句
  12. 阿里云安装mysql5.7_同一服务器上二进制安装mysql5.7和mysql5.6
  13. vue element form 自定义校验1(表单校验)
  14. 13 Process Lifecycle: Process Creation and Termination
  15. 基于tetgen对曲面分隔的box区域做限定四面体剖分
  16. 淘宝店铺层级作用 店铺层级低有哪些影响
  17. 【Python技巧】字典
  18. 河南学业水平计算机,河南高中学业水平考试查询系统
  19. 小感悟:多对多关系,一定要创建关系表吗?
  20. Java数据结构第五版期末考试_数据结构(java)期末复习

热门文章

  1. 股票技术指标中的VOL,KDJ,MACD,OBV,VR,DMA分别代表什么意思?很关键,谢谢
  2. 共享2018年公司年终总结简单PPT模板
  3. Oracle EBS 基础概念:值集@多层从属值集
  4. html 自动返回首页,mui页面跳转,进入子页面后自动回到首页
  5. 产品规划该从哪几个方面进行?
  6. ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内
  7. Java缅甸文_Android键盘输入语言设置默认打开myanmar缅甸语的步骤
  8. mysql查询供应3号的顾客_现有一个商店的数据库,记录顾客及其购物情况,根据要求解答问题...
  9. 淘宝SDK高级模板开发阶段总结
  10. matlab读s2p文件,s2p文件查看工具_s2p文件查看器(SPview III)下载 v3.53官方版 - 121下载站...