2022前端面试手册——HTML,CSS,浏览器相关(二)
说一下 HTML5 drag api
- dragstart: 事件主体是被拖放元素,在开始拖放被拖放元素时触发。
- darg: 事件主体是被拖放元素,在正在拖放被拖放元素时触发。
- dragenter: 事件主体是目标元素,在被拖放元素进入某元素时触发。
- dragover: 事件主体是目标元素,在被拖放在某元素内移动时触发。
- dragleave: 事件主体是目标元素,在被拖放元素移出目标元素是触发。
- drop: 事件主体是目标元素,在目标元素完全接受被拖放元素时触发。
- dragend: 事件主体是被拖放元素,在整个拖放操作结束时触发。
web 性能优化
降低请求量
: 合并资源,减少HTTP请求数,minify/gzip 压缩, webP,lazyLoad。加快请求速度
: 预解析 DNS,减少域名数,并行加载,CDN分发。缓存
: HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存 localStorage。渲染
: JS/CSS 优化,加载顺序,服务端渲染,pipeline。
浏览器缓存机制
- 缓存分为两种:
强缓存
和协商缓存
- 强缓存相关字段有 expires,cache-control。如果cache-control与 expires同时存在的话,cache-control的优先级高于 expires。
- 协商缓存相关字段有Last-Modified/If-Modified-Since, Etag/If-None-Match
- 缓存分为两种:
浏览器输入网址到页面渲染全过程
DNS域名解析
- 在客户端和浏览器,本地DNS之间的查询方式是递归查询;
- 在本地DNS服务器与根域及其子域之间的查询方式是迭代查询
建立TCP连接
- 第一次握手, 建立连接。
- 客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;
- 然后,客户端进入SYN_SEND状态,等待服务器的确认;
- 第二次握手: 服务器收到SYN报文段。
- 服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);
- 同时,自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;
- 服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态
- 第三次握手: 客户端收到服务器的SYN+ACK报文段。
- 然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,
- 这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
- 如果是HTTPS,SSL握手
- 第一次握手, 建立连接。
发送HTTP请求,服务器处理请求并返回响应结果
关闭TCP连接,四次挥手
- 第一次分手
- 主机1(可以使客户端,也可以是服务器端,设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;
- 此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
- 第二次分手
- 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;
- 主机1进入FIN_WAIT_2状态;主机2告诉主机1,我”同意”你的关闭请求;
- 第三次分手
- 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
- 第四次分手
- 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;
- 主机2收到主机1的ACK报文段以后,就关闭连接;
- 此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
- 第一次分手
HTTP报文浏览器解析渲染页面
- 构建DOM树
- 渲染进程将 HTML 内容转换为能够读懂DOM 树结构。
- 样式计算
- 渲染引擎将 CSS 样式表转化为浏览器可以理解的styleSheets,计算出 DOM 节点的样式。
- 布局阶段
- 创建布局树,并计算元素的布局信息。
- 分层
- 对布局树进行分层,并生成分层树。
- 栅格化
- 为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分图块,并栅格化将图块转换成位图。
- 显示
- 合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上。
- 构建DOM树
画一条 0.5px 的线
- 采用meta viewport的方式
1
<meta name="viewport" content="initial-scale=1. 0, maximum-scale=1.0, user-scalable=no" />
- 采用border-image的方式
- 采用transform: scale()的方式
- 采用meta viewport的方式
关于 JS 动画和 css3 动画的差异性
- JS动画(逐帧动画)
- 在时间帧上逐帧绘制帧内容,可操作性高
- 适合细腻动画,但是占用资源也大
- 兼容性好
- CSS3动画(补间动画)
- 只需确定第一帧和最后一帧的关键位置即可,两个关键帧之间帧的内容由Composite线程自动生成,不需要人为处理。
- 当然也可以多次添加关键帧的位置。
- 适合简单动画,占用少量资源
- JS动画(逐帧动画)
浮动清除
- 方法一: 使用带 clear 属性的空元素在浮动元素后使用一个空元素如
<div class="clear"></div>
- 并在CSS中赋予.clear {clear:both;}属性即可清理浮动。
- 亦可使用
<br class="clear" />
或<hr class="clear" />
来进行清理。
- 方法二: 使用CSS的 overflow 属性
- 给浮动元素的容器添加 overflow:hidden;或 overflow:auto;
- 方法三: 给浮动的元素的容器添加浮动
- 给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。
- 方法四: 使用邻接元素处理
- 给浮动元素后面的元素添加 clear 属性
- 方法五: 使用 CSS 的:after伪元素
- 方法一: 使用带 clear 属性的空元素在浮动元素后使用一个空元素如
CSS 选择器优先级
- id 选择器 > class 选择器 > 标签选择器
- !important > 内联样式 > 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式
CSS 动画如何实现
- 创建动画序列,需要使用
animation
属性或其子属性 - 动画的实际表现是由@keyframes规则实现
- transition 也可实现动画
- 创建动画序列,需要使用
CSS3 中对溢出的处理
- text-overflow 属性,
- clip 是修剪文本
- ellipsis 为显示省略符号来表被修剪的文本
- string 为使用给定的字符串来代表被修剪的文本
- text-overflow 属性,
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随心所欲录!
评论