1、浏览器渲染过程
http://blog.csdn.net/xiaozhuxmen/article/details/52014901
解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树
解析过程:
(1) HTML/SVG/XHTML,解析这三种文件会产生一个 DOM Tree。
(2) CSS,解析 CSS 会产生 CSS 规则树。
(3) Javascript脚本,主要是通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree
HTML页面加载和解析流程
- 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
- 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
- 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
- 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
- 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
- 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
- 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
- Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码;
- 终于等到了</html>的到来,浏览器泪流满面……
- 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
- 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。
2、无刷新路由的实现
使用数组存储路由对象,对象中存放url地址和组件名
跳转时通过window.history.pushState(state, title, url)或者window.history.replaceState(state, title, url)修改
如果不支持html5,则使用hash
3、三次握手改为两次握手或四次握手
两次握手:A->B , B->A, A->B, 第三次对第二次的确认了,才算连接成功。如果改为两次,第二个包能否发送到A,B是不知道的。对第二个包, A如果能成功收到,A则知道建立连接成功了,如果超时,A可判断第二个包发送失败,连接失败。对第二个包,B是不知道能否发送成功的(需要地三个包来确认)
四次握手:三次握手就可以确认客户端和服务器都确立收到包了,可以确立连接了
4、原生JS实现lodash.flatten
function flatten (arr, isDeep) {
var ret = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] instanceof Array) {
ret = isDeep
? ret.concat(flatten(arr[i], true))
: ret.concat(arr[i]);
} else {
ret.push(arr[i]);
}
}
return ret;
}
5、什么时候用到document.write()
-
加载需要配合JS脚本使用的外部CSS文件
<scirpt> document.write('<link rel="stylesheet" href="style_neads_js.css">'); </script>
将所有需要用到JS的样式都放到这个外部样式表中,如果浏览器不禁用JS,那么该样式表就会被顺利加载,否则页面就不会使用该样式。
-
在新的窗口中写入新的页面数据时
document.open(); document.write('anthing') document.close();
弊端:
- 在非loading阶段调用document.write会清除已加载的页面;
- document.write不能够在XHTML中使用;
- 嵌入script中的document.write不能给任意节点添加子节点,因为它是随着DOM的构建执行的;
- 利用document.write写入HTML字符串流并不是一个好方法,它有违DOM操作的概念;
- 利用document.write添加script加载外部脚本时,浏览器的HTML解析会被script的加载所阻塞;
6、js 位运算
http://www.cnblogs.com/xljzlw/p/4231354.html
7、font-face
CSS3 自定义字体
@font-face{
font-family: myFont;
src: url('myFont.ttf'),
url('myFont.eot') // 字体资源路径
}
8、json 和 xml比较
http://www.cnblogs.com/SanMaoSpace/p/3139186.html
-
XML的优点
- 格式统一,符合标准;
- 容易与其他系统进行远程交互,数据共享比较方便。
-
XML的缺点
- XML文件庞大,文件格式复杂,传输占带宽;
- 服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
- 客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
- 服务器端和客户端解析XML花费较多的资源和时间。
-
JSON的优点:
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
- 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
- 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
- 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
JSON的缺点
没有XML那么通用性;
9、Web缓存
Web缓存分为数据库缓存、代理服务器缓存、CDN缓存和浏览器缓存
浏览器缓存设置HTTP缓存、WebStorage
10、HTTP协议
Http是一个基于请求与响应模式的无状态的、应用层的协议,常基于TCP的连接方式
HTTP请求由请求行、消息报头、请求正文组成
HTTP响应由响应行、消息报头、响应正文组成
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
11、最小生成树
无向图n个顶点,构造成一棵树,有n-1条边,没有构成环,加权值最小
https://www.2cto.com/kf/201603/496259.html
12、SSL协议
上层协议:SSL握手协议、SSL密码变化协议、SSL警告协议
底层协议:SSL记录协议
- SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥、实现服务器和客户端的身份验证。
- SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
- SSL警告协议:用来向通信对端报告告警信息,消息中包含告警的严重级别和描述。
- SSL记录协议:主要负责对上层的数据(SSL握手协议、SSL密码变化协议、SSL警告协议和应用层协议报文)进行分块、计算并添加MAC值、加密,并把处理后的记录块传输给对端。
http://www.jianshu.com/p/d366e5fcd58b
13、前后端分离做SEO
- 首屏预渲染
- 服务端渲染SSR,实现前后端同构,一套代码在浏览器和node环境都可以运行
- Google搜索引擎支持hashtag再rewrite访问静态页面,使用pushState实现无刷新路由控制
https://www.zhihu.com/question/52235652
14、上千条数据显示在DOM列表中,如何防止卡顿
只创建一定数量的DOM节点,滚动时根据滚动条修改DOM节点的内容,比如Framework7的Virtual List组件,通过相对定位设置每个li标签的top,滚动时根据一定的条件,同时修改top和li标签的内容
15、data-xxx 属性
data-属性用来存储页面或应用程序的私有自定义数据
16、margin
在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考
17、BFC
Block Formatting Context,中文直译为块级格式上下文。BFC就是一种布局方式,在这种布局方式下,盒子们自所在的containing block顶部一个接一个垂直排列,水平方向上撑满整个宽度(除非内部盒子自己建立了新的BFC)。两个相邻的BFC之间的距离由margin决定。在同一个BFC内部,两个垂直方向相邻的块级元素的margin会发生“塌陷”
创建BFC:
- float属性不为none
- overflow不为visible(可以是hidden、scroll、auto)
- position为absolute或fixed
- display为inline-block、table-cell、table-caption
BFC作用:
- 清除浮动
- 垂直margin合并
- 创建自适应两栏布局
18、绝对定位和相对定位
绝对定位:absolute,相对于第一个具有定位元素(absolute,relative)的祖先元素,吗,没有定位元素的祖先元素则相对于body定位
相对定位:relative,相对于其在普通流中的位置进行定位的
19、margin叠加
- 浮动元素和其他任何元素之间不发生外边距叠加 (包括和它的子元素).
- 创建了 BFC 的元素不会和它的子元素发生外边距叠加
- 绝对定位元素和其他任何元素之间不发生外边距叠加(包括和它的子元素).
- inline-block 元素和其他任何元素之间不发生外边距叠加 (包括和它的子元素).
- 普通流中的块级元素的 margin-bottom 永远和它相邻的下一个块级元素的 margin-top 叠加(除非相邻的兄弟元素clear)
- 普通流中的块级元素(没有 border-top、没有 padding-top )的 margin-top 和它的第一个普通流中的子元素(没有 clear )发生 margin-top 叠加
- 普通流中的块级元素( height 为 auto、min-height 为 0、没有 border-bottom、没有 padding-bottom )和它的最后一个普通流中的子元素(没有自身发生 margin 叠加或 clear )发生 margin-bottom 叠加
- 如果一个元素的 min-height 为 0、没有 border、没有 padding、高度为 0 或者 auto、不包含子元素,那么它自身的外边距会发生叠加
20、元素
块级元素:P|H1|H2|H3|H4|H5|H6|UL|OL|PRE| DL | DIV | NOSCRIPT | BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS
行内元素:#PCDATA(即文本)| TT | I | B | BIG | SMALL|EM | STRONG | DFN | CODE |SAMP | KBD | VAR | CITE | ABBR | ACRONYM|A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO|INPUT | SELECT | TEXTAREA | LABEL | BUTTON
可置换元素:img|input|select|textarea|button|label
21、响应式布局和流式布局
响应式布局:根据不同设备宽度设定不同样式,主要靠媒体查询实现
流式布局:即百分比布局,宽度用百分比,高度用px做单位