在浏览器地址栏输入URLcss
浏览器查看缓存(强缓存)html
浏览器解析URL获取协议,主机,端口,path浏览器
浏览器组装一个HTTP(GET)请求报文缓存
浏览器根据DNS服务器得要域名的IP地址服务器
打开一个socket与目标IP地址,端口创建TCP连接dom
向这个IP的机器发送http/https请求异步
服务器收处处理并返回http请求socket
判断协商缓存async
服务器将响应报文经过TCP链接发送回浏览器函数
关闭TCP链接
浏览器检查响应状态吗作出不一样处理
若是资源可缓存,进行缓存
浏览器获得返回的内容
根据HTML结构生成DOM Tree
根据CSS生成CSSOM
将DOM和CSSOM整合成RenderTree(渲染树,比DOM树多了样式)
根据RenderTree开始渲染和展现
HTML解析器遇到没有async和defer的script时,会执行并阻塞渲染 (js可能会改变dom结构)
浏览器在Document对象上触发DOMContentLoaded事件
显示页面
图片加载完毕
调用onload
在html渲染以前渲染css
若是css放在html元素后面,会先按没有css的状况渲染html,而后加载到css后再从新渲染html元素,这样会损耗性能。
1.不会阻塞body中元素的渲染,能让页面更快出来
2.script能拿到全部的标签
图片是异步请求,不会影响dom树的渲染
window.addEventListener('load',function(){ //页面资源所有加载完成,包括图片视频 }); document.addEventListener('DOMContentLoaded',function(){ //DOM 渲染完便可执行,图片视频尚未加载完 });
var show = console.log.bind(console); show('观察脚本加载的顺序') document.addEventListener("DOMContentLoaded", function () { show('DOMContentLoaded回调') }, false); window.addEventListener("load", function () { show('load事件回调') }, false); show('脚本解析一'); $(document).ready(function () { show('$(document).ready') }) // 测试加载 $(function () { show('脚本解析二'); }) $(window).load(function () { show('$(document).load'); }); show('脚本解析三');
DOM结构中的元素都有本身的盒子,这些都须要浏览器根据各类样式来计算并根据计算结果来将元素放到他们该出现的位置,称为Reflow。
触发reflow的条件:
1.增删改dom节点
2.移动dom位置或者有动画
3.修改css样式
4.resize窗口或者滚动(移动端没有该问题)
页面要呈现的内容绘制在屏幕上。
DOM改动,CSS改动(判断页面呈现的内容有没有发生变化)
1.尽可能用class来修改样式
若是要修改多个样式,每一个样式修改时都会出发reflow,能够将这些样式保存在一个class中,每次修改只reflow一次。