前言
一直有一个收集一些的笔面试题的习惯。之前发过一部分,链接:
200道前端基础题及答案(上)
200道前端基础题及答案(下)
近期又收集了一些,分享给大家
目录
- 聊一下http和https
- TCP和UDP的区别
- WebSocket 的实现和应用
- 说说drag api
- 说一下 http2.0
- 400和401、403状态码
- 说说fetch 发送 2 次请求的原因
- 说说cookie、sessionStorage、localStorage
- 对 HTML 语义化标签的理解
- 聊聊iframe
- 说说Doctype的作用
- Cookie如何防范 XSS 攻击
- addEventListener如何使用
- 说说cookie和session的区别
- 说说http返回的状态码
- 说说http常用请求头
- 说说强缓存和协商缓存
- 简单说说前端优化方案
- 说说GET 和 POST 的区别
- 状态码 304 和 200
- CSS画一个三角形
- H5有哪些新增的元素
- 在地址栏里输入一个 URL,到这个页面呈现出来,中间会发生什么?
- cache-control 的值有哪些
- 浏览器在生成页面的时会生成哪两颗树
- CSRF和XSS的网络攻击及防范
- 如何看网站的性能如何
- 说说HTTP 协议特征
- 简述输入 URL 到页面加载显示完成发生了什么
- cookie的编码方式
- 说说css 盒模型
- link标签和@import 标签的区别
- transition和animation的区别
- 说说flex布局
- 说说BFC
- JS动画和css3动画的差异
- 行内元素和块级元素以及行级块元素
- visibility=hidden和opacity=0以及display:none的区别
- 外边距折叠
- CSS权重
- 实现图片在某个容器中居中
- 如何实现元素的垂直居中
- 浮动元素其display 是什么
- 隐藏页面中某个元素的方法
- 关于calc
- 聊聊display:table和table标签
- 说说position都有哪些值
- 关于z-index
- 说说CSS3有哪些新特性
- height和line-height的区别
1.聊一下http和https
http 和 https 的基本概念
http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP
),用于从WWW
服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
https: 是以安全为目标的HTTP
通道,简单讲是HTTP
的安全版,即 HTTP 下
加入 SSL
层,HTTPS
的安全基础是SSL
,因此加密的详细内容就需要 SSL
。https
协议的主要作用是建立一个信息安全通道,来确保数组的传输,确保网站的真实性。
http 和 https 的区别:
http
传输的数据都是未加密的,也就是明文的,网景公司设置了 SSL
协议来对http
协议传输的数据进行加密处理,简单来说https
协议是由http
和ssl
协议构建的可进行加密传输和身份认证的网络协议,比 http
协议的安全性更高。
主要的区别如下:
-
Https
协议需要ca
证书,费用较高。 -
http
是超文本传输协议,信息是明文传输,https
则是具有安全性的ssl
加密传输协议。 - 使用不同的链接方式,端口也不同,一般而言,
http
协议的端口为80
,https 的端口为443
-
http
的连接很简单,是无状态的;HTTPS
协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比http
协议安全。
https 协议的工作原理
客户端在使用 HTTPS
方式与 Web
服务器通信时有以下几个步骤:
- 客户使用
https url
访问服务器,则要求web
服务器建立ssl
链接。web
服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。 - 客户端和
web
服务器端开始协商SSL
链接的安全等级,也就是加密等级。 - 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
-
web
服务器通过自己的私钥解密出会话密钥。 -
web
服务器通过会话密钥加密与客户端之间的通信。
https 协议的优点
- 使用
HTTPS
协议可认证用户和服务器,确保数据发送到正确的客户机和服务器; -
HTTPS
协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,要比http
协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。 -
HTTPS
是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。 - 谷歌曾在
2014
年8
月份调整搜索引擎算法,并称“比起同等HTTP
网站,采用HTTPS
加密的网站在搜索结果中的排名将会更高”。
https 协议的缺点
-
https
握手阶段比较费时,会使页面加载时间延长50%
,增加10%~20%
的耗电。 -
https
缓存不如http
高效,会增加数据开销。 -
SSL
证书也需要钱,功能越强大的证书费用越高。 -
SSL
证书需要绑定IP
,不能再同一个ip
上绑定多个域名,ipv4
资源支持不了这种消耗。
2. TCP和UDP的区别
-
TCP
是面向连接的;UDP
是无连接的,即发送数据前不需要先建立链接。 -
TCP
提供可靠的服务。也就是说,通过TCP
连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP
尽最大努力交付,即不保证可靠交付。 并且因为TCP
可靠,面向连接,不会丢失数据因此适合大数据量的交换。 -
TCP
是面向字节流,UDP
面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP
电话和视频会议等)。 -
TCP
只能是 1 对 1 的,UDP
支持 1 对 1,1 对多。 -
TCP
的首部长度较大为 20 字节,而UDP
只有 8 字节。 -
TCP
是面向连接的可靠性传输,而UDP
是不可靠的。
3. WebSocket 的实现和应用
什么是 WebSocket
WebSocket
是 HTML5
中的协议,支持持久连续,http
协议不支持持久性连接。Http1.0
和HTTP1.1
都不支持持久性的链接,HTTP1.1
中的 keep-alive
,将多个 http
请求合并为1
个
WebSocket 是什么样的协议,具体有什么优点?
HTTP
的生命周期通过 Request
来界定,也就是 Request
一个 Response
,那么在Http1.0
协议中,这次 Http
请求就结束了。在 Http1.1
中进行了改进,是的有一个connection:Keep-alive
,也就是说,在一个 Http
连接中,可以发送多个 Request
,接收多个 Response
。但是必须记住,在Http
中一个 Request
只能对应有一个 Response
,而且这个Response
是被动的,不能主动发起。
WebSocket
是基于 Http
协议的,或者说借用了Http
协议来完成一部分握手,在握手阶段与Http
是相同的。我们来看一个 websocket
握手协议的实现,基本是2
个属性,upgrade
、connection
。
基本请求如下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
多了下面2
个属性:
Upgrade:webSocket
Connection:Upgrade
告诉服务器发送的是websocket
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
4.说说drag api
- dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发
- darg:事件主体是被拖放元素,在正在拖放被拖放元素时触发
- dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发
- dragover:事件主体是目标元素,在被拖放在某元素内移动时触发
- dragleave:事件主体是目标元素,在被拖放元素移出目标元素是触发
- drop:事件主体是目标元素,在目标元素完全接受被拖放元素时触发
- dragend:事件主体是被拖放元素,在整个拖放操作结束时触发
5.说一下 http2.0
-
http2.0
是基于1999
年发布的http1.0
之后的首次更新。 - 提升访问速度;相比
http1.0
,请求资源所需时间更少,访问速度更快 - 允许多路复用;多路复用允许同时通过单一的
HTTP/2
连接发送多重请求-响应信息。改善了:在http1
中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞 - 二进制分帧:
HTTP2.0
会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码 - 首部压缩;
http2
以前的头部报文都是文本形式发生,http2
为了优化网络对头部报文进行压缩编码使其内容更精简,发送更少的数据加快网络传输 - 服务器端推送;为了改善延迟,
HTTP/2
引入了server push
,它允许服务端推送资源给浏览器。一个服务器经常知道一个页面需要很多附加资源,在它响应浏览器第一个请求的时候,可以开始推送这些资源。这允许服务端去完全充分地利用一个可能空闲的网络,改善页面加载时间
6.400和401、403状态码
- 400:请求无效
产生原因:
(1)前端提交数据的字段名称和字段类型与后台的实体没有保持一致;
(2)前端提交到后台的数据应该是 json 字符串类型,但是前端没有将对象转化成字符串;
对应的解决方法:
(1)对照字段的名称,保持一致性
(2)将 obj 对象通过 JSON.stringify 实现序列化 - 401:当前请求需要用户验证
- 403:服务器已经得到请求,但是拒绝执行
7.说说fetch 发送 2 次请求的原因
fetch
发送post
请求的时候,总是发送2
次,第一次状态码是 204
,第二次才成功。
原因很简单,因为你用 fetch
的 post
请求的时候,导致fetch
第一次发送了一个 Options
请求,询问服务器是否支持修改的请求头,如果服务器支持,则第二次才发送真正的请求
8.说说cookie、sessionStorage、localStorage
共同点:都是保存在浏览器端,并且是同源的
cookie
数据始终在同源的 http
请求中携带(即使不需要),即 cookie
在浏览器和服务器间来回传递。而 sessionStorage
和 localStorage
不会自动把数据发给服务器,仅在本地保存。cookie
数据还有路径(path
)的概念,可以限制cookie
只属于某个路径下, 存储的大小很小只有 4K
左右。 (key:可以在浏览器和服务器端来回传递,存储容量小,只有大约 4K 左右)
sessionStorage
仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持,localStorage
:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie
只在设置的 cookie
过期时间之前一直有效,即使窗口或浏览器关闭。(key:本身就是一个回话过程,关闭浏览器后消失,session
为一个回话,当页面不同即使是同一页面打开两次,也被视为同一次回话)
localStorage
在所有同源窗口中都是共享的;cookie
也是在所有同源窗口中都是共享的。(key:同源窗口都会共享,并且不会失效,不管窗口或者浏览器关闭与否都会始终生效)
9. 对 HTML 语义化标签的理解
HTML5
语义化标签是指正确的标签包含了正确的内容,结构良好,便于阅读,比如 nav
表示导航条,类似的还有article
、header
、footer
等等标签。
10. 聊聊iframe
- 定义:
iframe
元素会创建包含另一个文档的内联框架 - 提示:可以将提示文字放在
<iframe></iframe>
之间,来提示某些不支持iframe
的浏览器 - 缺点:
- 会阻塞主页面的
onload
事件 - 搜索引擎无法解读这种页面,不利于
SEO
-
iframe
和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能。
11. 说说Doctype的作用
Doctype
声明于文档最前面,告诉浏览器以何种方式来渲染页面,这里有两种模式,严格模式和混杂模式
严格模式的排版和JS
运作模式是以该浏览器支持的最高标准运行
混杂模式,向后兼容,模拟老式浏览器,防止浏览器无法兼容页面
12. Cookie如何防范 XSS 攻击
XSS
(跨站脚本攻击)是指攻击者在返回的 HTML
中嵌入javascript
脚本
为了减轻这些攻击,需要在HTTP
头部配上set-cookie
:
-
httponly
-这个属性可以防止XSS
,它会禁止javascript
脚本来访问cookie
-
secure
- 这个属性告诉浏览器仅在请求为https
的时候发送cookie
13. addEventListener如何使用
格式:ele.addEventListener(事件类型,处理函数,false)
例如:
odiv.addEventListener('click',function(e){
console.log(1);
},false)
odiv.addEventListener('click',function(e){
console.log(2);
},false)
特点:通过addEventListener绑定的方式,同个元素的同一个事件可以绑定多个处理函数,不会被覆盖
注意:IE9以下不兼容
14. 说说cookie和session的区别
-
cookie
数据存放在客户的浏览器上,session
数据放在服务器上 -
cookie
不是很安全,别人可以分析存放在本地的cookie
并进行cookie
欺骗,考虑到安全应当使用session
-
session
会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用cookie
- 单个
cookie
保存的数据不能超过4KB
,很多浏览器都限制一个站点最多保存20
个cookie
15. 说说http返回的状态码
100 Continue
继续。客户端应继续其请求
101 Switching Protocols
切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议
200 OK
请求成功。一般用于GET
与 POST
请求
201 Created
已创建。成功请求并创建了新的资源
202 Accepted
已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information
非授权信息。请求成功。但返回的 meta
信息不在原始的服务器,而是一个副本
204 No Content
无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content
重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content
部分内容。服务器成功处理了部分 GET
请求
300 Multiple Choices
多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently
永久移动。请求的资源已被永久的移动到新 URI
,返回信息会包括新的 URI
,浏览器会自动定向到新 URI
。今后任何新的请求都应使用新的URI
代替
302 Found
临时移动。与 301
类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other
查看其它地址。与301
类似。使用 GET
和POST
请求查看
304 Not Modified
未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy
使用代理。所请求的资源必须通过代理访问
306 Unused
已经被废弃的HTTP
状态码
307 Temporary Redirect
临时重定向。与 302
类似。使用 GET
请求重定向
400 Bad Request
客户端请求的语法错误,服务器无法理解
401 Unauthorized
请求要求用户的身份认证
402 Payment Required
保留,将来使用
403 Forbidden
服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found
服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed
客户端请求中的方法被禁止
406 Not Acceptable
服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required
请求要求代理的身份认证,与 401 类似,但请求者应当使用代理进行授权
408 Request Time-out
服务器等待客户端发送的请求时间过长,超时
409 Conflict
服务器完成客户端的 PUT 请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone
客户端请求的资源已经不存在。410 不同于 404,如果资源以前有现在被永久删除了可使用 410 代码,网站设计人员可通过 301 代码指定资源的新位置
411 Length Required
服务器无法处理客户端发送的不带Content-Length
的请求信息
412 Precondition Failed
客户端请求信息的先决条件错误
413 Request Entity Too Large
由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After
的响应信息
414 Request-URI Too Large
请求的 URI
过长(URI
通常为网址),服务器无法处理
415 Unsupported Media Type
服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable
客户端请求的范围无效
417 Expectation Failed
服务器无法满足Expect
的请求头信息
500 Internal Server Error
服务器内部错误,无法完成请求
501 Not Implemented
服务器不支持请求的功能,无法完成请求
502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable
由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的 Retry-After
头信息中
504 Gateway Time-out
充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported
服务器不支持请求的 HTTP
协议的版本,无法完成处理
16. 说说http常用请求头
Accept
可接受的响应内容类型(Content-Types)
Accept-Charset
可接受的字符集
Accept-Encoding
可接受的响应内容的编码方式。
Accept-Language
可接受的响应内容语言列表。
Accept-Datetime
可接受的按照时间来表示的响应内容版本
Authorization
用于表示 HTTP 协议中需要认证资源的认证信息
Cache-Control
用来指定当前的请求/回复中的,是否使用缓存机制。
Connection
客户端(浏览器)想要优先使用的连接类型
Cookie
由之前服务器通过Set-Cooki(e 见下文)设置的一个HTTP协议Cookie
Content-Length
以 8 进制表示的请求体的长度
Content-MD5
请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果
Content-Type
请求体的 MIME 类型 (用于 POST 和 PUT 请求中)
Date
发送该消息的日期和时间(以 RFC 7231 中定义的"HTTP 日期"格式来发送)
Expect
表示客户端要求服务器做出特定的行为
From
发起此请求的用户的邮件地址
Host
表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。
If-Match
仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后,该资源未被修改的情况下,才更新该资源。
If-Modified-Since
允许在对应的资源未被修改的情况下返回 304 未修改
If-None-Match
允许在对应的内容未被修改的情况下返回 304 未修改( 304 Not Modified ),参考 超文本传输协议 的实体标记
If-Range
如果该实体未被修改过,则向返回所缺少的那一个或多个部分。否则,返回整个新的实体
If-Unmodified-Since
仅当该实体自某个特定时间以来未被修改的情况下,才发送回应。
Max-Forwards
限制该消息可被代理及网关转发的次数。
Origin
发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个 Access-Control-Allow-Origin 的消息头,表示访问控制所允许的来源)。
Pragma
与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生。
Proxy-Authorization
用于向代理进行认证的认证信息。
Range
表示请求某个实体的一部分,字节偏移以 0 开始。
Referer
表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。Referer 其实是 Referrer 这个单词,但 RFC制作标准时给拼错了,后来也就将错就错使用 Referer 了。
TE
浏览器预期接受的传输时的编码方式:可使用回应协议头
Transfer-Encoding
中的值(还可以使用"trailers"表示数据传输时的分块方式)用来表示浏览器希望在最后一个大小为 0 的块之后还接收到一些额外的字段。
User-Agent
浏览器的身份标识字符串
Upgrade
要求服务器升级到一个高版本协议。
Via
告诉服务器,这个请求是由哪些代理发出的。
Warning
一个一般性的警告,表示在实体内容体中可能存在错误。
17. 说说强缓存和协商缓存
缓存分为两种:强缓存和协商缓存,根据响应的header
内容来决定
强缓存和协商缓存获取资源形式都是从缓存取
但,强缓存是不发送请求到服务器,直接从缓存取,状态码是200(from cache)
;
而协议缓存是发送请求到服务器,通过服务器来告知缓存是否可用,可用在从缓存取,状态码是304(not modified)
强缓存相关字段有 expires
,cache-control
。如果 cache-control
与expires
同时存在的话,cache-control
的优先级高于expires
协商缓存相关字段有Last-Modified/If-Modified-Since
,Etag/If-None-Match
18. 简单说说前端优化方案
这个一个超级大的问题,这里简单总结
降低请求量:合并资源,减少HTTP
请求数,minify / gzip
压缩,webP
,lazyLoad
加快请求速度:预解析 DNS
,减少域名数,并行加载,CDN
分发
缓存:HTTP
协议缓存请求,离线缓存manifest
,离线数据缓存 localStorage
渲染:JS/CSS
优化,加载顺序,服务端渲染,pipeline
19. 说说GET 和 POST 的区别
-
get
参数通过url
传递,post
放在request body
中 -
get
请求在url
中传递的参数是有长度限制的,而post
没有 -
get
比post
更不安全,因为参数直接暴露在url
中,所以不能用来传递敏感信息 -
get
请求只能进行url
编码,而post
支持多种编码方式 -
get
请求会浏览器主动cache
,而post
支持多种编码方式 -
get
请求参数会被完整保留在浏览历史记录里,而post
中的参数不会被保留 -
get
和post
本质上就是TCP
链接,并无差别。但是由于HTTP
的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。get
产生一个TCP
数据包;post
产生两个TCP
数据包
20. 状态码 304 和 200
状态码 200:请求已成功,请求所希望的响应头或数据体将随此响应返回。即返回的数据为全量的数据,如果文件不通过GZIP
压缩的话,文件是多大,则要有多大传输量
状态码 304:如果客户端发送了一个带条件的 GET
请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。即客户端和服务器端只需要传输很少的数据量来做文件的校验,如果文件没有修改过,则不需要返回全量的数据
21. CSS画一个三角形
三角形原理:边框的均分原理
div {
width:0px;
height:0px;
border-top:10px solid red;
border-right:10px solid transparent;
border-bottom:10px solid transparent;
border-left:10px solid transparent;
}
22. H5有哪些新增的元素
首先html5
为了更好的实践 web
语义化,增加了 header
,footer
,nav
,aside
,section
等语义化标签,在表单方面,为了增强表单,为input
增加了 color
,emial
,data
,range
等类型,在存储方面,提供了 sessionStorage
,localStorage
和离线存储,通过这些存储方式方便数据在客户端的存储和获取,在多媒体方面规定了音频和视频元素audio
和vedio
,另外还有地理定位,canvas
画布,拖放,多线程编程的web worker
和 websocket
协议
23. 在地址栏里输入一个 URL,到这个页面呈现出来,中间会发生什么?
输入url
后,首先需要找到这个url
域名的服务器ip
,为了寻找这个 ip
,浏览器首先会寻找缓存,查看缓存中是否有记录,缓存的查找记录为:浏览器缓存-》系统缓存-》路由器缓存,缓存中没有则查找系统的 hosts
文件中是否有记录,如果没有则查询DNS
服务器。得到服务器的ip
地址后,浏览器根据这个ip
以及相应的端口号,构造一个http
请求,这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,并将这个 http
请求封装在一个tcp
包中,这个tcp
包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应,返回相应的 html
给浏览器。因为 html
是一个树形结构,浏览器根据这个html
来构建 DOM
树,在 dom
树的构建过程中如果遇到 JS
脚本和外部JS
连接,则会停止构建DOM
树来执行和下载相应的代码,这会造成阻塞,这就是为什么推荐 JS
代码应该放在html
代码的后面,之后根据外部样式,内部样式,内联样式构建一个CSS
对象模型树 CSSOM
树,构建完成后和DOM
树合并为渲染树,这里主要做的是排除非视觉节点,比如script
,meta
标签和排除 display
为 none
的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html
文件中会含有图片,视频,音频等资源,在解析 DOM
的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是 4-6
个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过Cache-Control
、Last-Modify
、Expires
等首部字段控制。 Cache-Control
和Expires
的区别在于 Cache-Control
使用相对时间,Expires
使用的是基于服务器 端的绝对时间,因为存在时差问题,一般采用Cache-Control
,在请求这些有设置了缓存的数据时,会先 查看是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修改,如果上一次 响应设置了 ETag
值会在这次请求的时候作为If-None-Match
的值交给服务器校验,如果一致,继续校验 Last-Modified
,没有设置ETag
则直接验证Last-Modified
,再决定是否返回 304
24. cache-control 的值有哪些
cache-control
是一个通用消息头字段被用于 HTTP
请求和响应中,通过指定指令来实现缓存机制,这个缓存指令是单向的,常见的取值有private
、no-cache
、max-age
、must-revalidate
等,默认为 private
25. 浏览器在生成页面的时会生成哪两颗树
构造两棵树,DOM
树和 CSSOM
规则树
当浏览器接收到服务器相应来的 HTML
文档后,会遍历文档节点,生成 DOM
树,
CSSOM
规则树由浏览器解析 CSS
文件生成
26. CSRF和XSS的网络攻击及防范
CSRF:跨站请求伪造,可以理解为攻击者盗用了用户的身份,以用户的名义发送了恶意请求,比如用户登录了一个网站后,立刻在另一个tab页面访问量攻击者用来制造攻击的网站,这个网站要求访问刚刚登陆的网站,并发送了一个恶意请求,这时候 CSRF
就产生了,比如这个制造攻击的网站使用一张图片,但是这种图片的链接却是可以修改数据库的,这时候攻击者就可以以用户的名义操作这个数据库,防御方式的话:使用验证码,检查 https
头部的refer
,使用 token
XSS:跨站脚本攻击,是说攻击者通过注入恶意的脚本,在用户浏览网页的时候进行攻击,比如获取cookie
,或者其他用户身份信息,可以分为存储型和反射型,存储型是攻击者输入一些数据并且存储到了数据库中,其他浏览者看到的时候进行攻击,反射型的话不存储在数据库中,往往表现为将攻击代码放在url
地址的请求参数中,防御的话为cookie
设置 httpOnly
属性,对用户的输入进行检查,进行特殊字符过滤
27. 如何看网站的性能如何
检测页面加载时间一般有两种方式:
- 一种是被动去测;就是在被检测的页面置入脚本或探针,当用户访问网页时,探针自动采集数据并传回数据库进行分析;
- 另一种主动监测;即主动的搭建分布式受控环境,模拟用户发起页面访问请求,主动采集性能数据并分析,在检测的精准度上,专业的第三方工具效果更佳,比如说性能极客等
28. 说说HTTP 协议特征
HTTP
是一个基于 TCP/IP
通信协议来传递数据(HTML
文件, 图片文件, 查询结果等)
HTTP
是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990
年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW
中使用的是HTTP/1.0
的第六版,HTTP/1.1
的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)
的建议已经提出。HTTP
协议工作于客户端-服务端架构为上。浏览器作为 HTTP
客户端通过 URL
向HTTP
服务端即 WEB
服务器发送所有请求。Web
服务器根据接收到的请求后,向客户端发送响应信息
29. 简述输入 URL 到页面加载显示完成发生了什么
-
DNS
解析 -
TCP
连接 - 发送
HTTP
请求 - 服务器处理请求并返回
HTTP
报文 - 浏览器解析渲染页面
- 连接结束
30. cookie的编码方式
encodeURI()
31. 说说css 盒模型
这里说的盒子本质就是用于装页面上元素的矩形区域;CSS
中的盒子模型有两种,包括 IE
盒模型和 W3C
标准盒模型
两种盒模型最主要的区别就是width
的包含范围,在标准模型中,width
指 content
部分的宽度,在IE
盒模型中,width
表示content+padding+border
这三个部分的宽度,故这使得在计算整个盒子的宽度时存在着差异:
- 标准盒模型的盒子宽度:左右
border
+左右padding
+width
-
IE
盒模型的盒子宽度:width
在 CSS3
中引入了box-sizing
属性,box-sizing:content-box
表示标准盒模型;box-sizing:border-box
表示的是 IE
盒模型;而box-sizing:padding-box
这个属性值的宽度包含了左右padding+width
32. link标签和@import 标签的区别
link
标签和@import
的区别:
-
link
属于html
标签,而@import
是css
提供的; - 页面被加载时,
link
会同时被加载,而@import
引用的 css 会等到页面加载结束后加载; -
link
方式样式的权重高于@import
的; -
link
是html
标签,因此没有兼容性,而@import
只有IE5
以上才能识别。
33. transition和animation的区别
Animation
和transition
大部分属性是相同的,他们都是随时间改变元素的属性值;
区别在于:
-
transition
需要触发一个事件才能改变属性,而animation
不需要触发任何事件的情况下才会随时间改变属性值 -
transition
为2
帧,从from .... to
,而animation
可以一帧一帧的
34. 说说flex布局
首先是父级容器上的属性
flex-direction
flex-direction 用于设置主轴方向,对应的值有row、 row-reverse、 column、 column-reverse,分别表示水平、水平翻转、垂直、垂直翻转flex-wrap
flex-wrap用于控制子级项排列超出边界时是否换行展示;取值可以是nowrap、wrap、wrap-reverse,分别表示不换行、换行、换行并且反转行flex-flow
flex-flow表示流动,即文档流,其实就是flex-direction和flex-wrap的复合写法justify-content
justify-content用于设置主轴方向的对齐方式,取值有5个,分别是:flex-start、flex-end、center、space-between、space-around,表示主轴起点、主轴终点、居中、空白在元素与元素之间、空白环绕着元素align-items
align-items与justify-content对应,justify-content表示主轴方向的对齐方式,而align-items表示侧轴上的对齐方式。但是取值有点不同,align-items的取值有:flex-start、flex-end、center、baseline、stretch(默认值),分别表示起点对齐、终点对齐、居中对齐、基线对齐、拉伸对齐align-content
align-content 子类多行排列时,子类在侧轴方向的对齐方式。注意如果是一行,该属性无效。即需要设置换行或者换行翻转才行,取值跟justify-content一致
接着来看子级项目的相关属性
align-self
align-self用于设置子级项目自身在侧轴上的对齐方式,其实就是单独设置一些特殊子类的侧轴对齐方式,用于覆盖父级得align-items。所以优先级高于align-items。取值也与align-items一致:flex-start、flex-end、center、baseline、stretchorder:n
用于调整特定子类中在所有子类中的排序,n是整数,数值越小,排列越靠前,默认值为 0,可以是负数
上例中将最后一个放到前面去flex-grow
flex-grow表示子项的扩展比例,默认0 不扩展。注意:行中要存在可分配的剩余空间,子项多行时,以行为单位进行扩展,即我这行只能在我这行的剩余空间中按比例分flex-shrink
flex-shrink用于定义子项的收缩比例,默认值为1,表示等比缩小,容器空间不足需要收缩时才有效果flex-basis
定义子项在主轴上的基准尺寸(初始大小)
默认值:auto,即项目原定大小;如果设定值,则优先于项目原定大小flex
flex是flex-grow, flex-shrink 和 flex-basis的简写。多个值以空格隔开,按既定顺序排列(grow、shrink、basis)
35. 说说BFC
BFC 即 Block Formatting Contexts (块级格式化上下文),是一个特殊独立的渲染区域,这个取悦有一定的布局规则,比如:
- BFC 区域不会与 float box 重叠
- BFC 是页面上的一个独立容器,子元素不会影响到外面
- 计算 BFC 的高度时,浮动元素也会参与计算
那些元素会生成 BFC,即如何触发BFC:
- body 根元素
- 浮动元素:float 除 none 以外的值
- 绝对定位元素:position (absolute、fixed)
- display 为 inline-block、table-cell、table-caption,flex,inline-flex 的元素
- overflow 除了 visible 以外的值 (hidden、auto、scroll)
利用BFC,可以用于清楚浮动,防止 margin 重叠等
36. JS动画和css3动画的差异
渲染线程分为main thread
和compositor thread
,如果css
动画只改变 transform
和 opacity
,这时整个CSS
动画在compositor trhead
完成;而 JS 动画则会在 main thread
执行,然后出发compositor thread
进行下一步操作。特别注意的是如果改变transform
和opacity
是不会layout
或者paint
两者主要区别:
- 功能涵盖面,
JS
比CSS
大 - 实现难度不一,
CSS3
比JS
更加简单 - 对帧速表现不好的低版本浏览器,
css3
可以做到自然降级 -
css3
动画有天然事件支持 -
css3
有兼容性问题
37. 行内元素和块级元素以及行级块元素
行内元素
如:span strong em a del...
特点:
- 内容决定元素所占位置;
- 不可以通过
css
改变宽高;
块级元素
如:div p ul li ol form address...
特点:
- 独占一行;
- 可以通过
css
改变宽高;
行级块元素
如:img...
特点:
- 内容决定元素所占位置;
- 可以通过
css
改变宽高;
需要注意:
凡是带有inline
属性的元素都有文字特性,就会被分割,如img
,图片间有间隙,可以通过margin-left:-6px
来处理。
可以用display
来改变元素,如:inline、 inline-block 、block
38. visibility=hidden和opacity=0以及display:none的区别
opacity=0
表示该元素隐藏起来了,但不会改变页面布局,而且如果该元素已经绑定一些事件,如 click 事件,那么点击该区域,也能触发点击事件
visibility=hidden
也表示该元素隐藏起来了,也不会改变页面布局,但是它不会触发该元素已经绑定的事件
display=none
把元素隐藏起来,会改变页面布局,可以理解成在页面中把该元素删除掉一样
39. 外边距折叠
普通文档流的多个相邻块元素(兄弟或者父子关系)垂直方向margin
会重叠,这种现象也被称为margin
折叠或者margin
塌陷
折叠的规律是:
- 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值
- 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值
- 两个外边距一正一负时,折叠结果是两者的相加的和
40. CSS权重
规则如下:
·!important > 行间样式 > ID > class | 属性 > 标签选择器 | 伪类选择器 > 通配符选择器
咋一下,可能觉得这什么东西。其实这个也有一个规律:一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。
记住上面的可以解决大多数问题,但是解决不了所以的问题,特别是一些非常复杂的选择器带来的优先级问题。那怎么办呢?
这需要你来了解CSS更深入的东西,选择器权重
各个选择器的权重如下:
!important Infinity
行间样式 1000
ID选择器 100
class类选择器 | 属性选择器 10
标签选择器 | 伪类选择器 1
通配符选择器 0
实际,权重表示的就是选择器优先级。css将各个简单的选择器对应的“重要度”用一个数值来表示,我们叫它权重值,复杂选择器(如:父子选择器,直接子元素选择器,并列选择器),只要写在同行的选择器,权重值等于各个简单的选择器的权重相加。当出现属性覆盖时,权重值高的覆盖权重值底的。
注:
权重的数值是256进制
41. 实现图片在某个容器中居中
- 父元素固定宽高,利用定位及设置子元素
margin
值为自身的一半 - 父元素固定宽高,子元素设置
position: absolute
,margin:auto
平均分配margin
-
css3
属性transform
;子元素设置position: absolute
; left: 50%
;top: 50%
;transform: translate(-50%,-50%)
即可 - 将父元素设置成
display: table
, 子元素设置为单元格display: table-cell
- 弹性布局
display: flex
;设置align-items: center
;justify-content: center
42. 如何实现元素的垂直居中
有几种方式
- 父元素
display:flex;align-items:center
- 元素绝对定位,
top:50%,margin-top:-(高度/2)
- 高度不确定用
transform:translateY(-50%)
- 父元素
table
布局,子元素设置vertical-align:center
43. 浮动元素其display 是什么
block
44. 隐藏页面中某个元素的方法
隐藏页面中某个元素的方法有很多,如下:
display:none
visibility:hidden
opacity: 0
-
position
移到外部 -
z-index
涂层遮盖
......
45. 关于calc
C3中使用calc函数动态计算值,例如:
.w {
width: calc(50vmax + 3rem);
padding: calc(1vw + 1em);
transform: rotate( calc(1turn + 28deg) );
background: hsl(100, calc(3 * 20%), 40%);
font-size: calc(50vw / 3);
}
也可以嵌套:
.w {
width: calc( 100% / calc(100px * 2) )
}
clac()
已经得到普遍支持。对于不支持calc()
的浏览器,整个属性值表达式将被忽略;
不过我们可以对那些不支持calc()
的浏览器,使用一个固定值作为回退
.w {
width: 90%; /* Fallback for older browsers */
width: calc(100% - 50px);
}
46. 聊聊display:table和table标签
display:table
和本身table
是相对应的,区别在于,display:table
能够让一个html
元素和它的子节点像table
元素一样,使用基于表格的css
布局,使我们能够轻松定义一个单元格的边界,背景等样式,而不会产生因为使用了table
那样的制表标签导致的语义化问题。
之所以现在逐渐淘汰了table
系表格元素,是因为用 div+css
编写出来的文件比用 table
边写出来的文件小,而且 table
必须在页面完全加载后才显示,div
则是逐行显示;另外table
的嵌套性太多,没有 div 简洁
47. 说说position都有哪些值
使用position把元素放置在一个静态的,相对的,绝对的,固定的位置中
- static
设置为 static 的元素,他始终处于页面流给予的位置,static 元素会忽略任何top,buttom,left,right 声明 - relative
相对定位,可将元素相对于其原本正常位置移动 - absolute
绝对定位,相对于最近有定位的父级进行定位(如果无,则相对于文档进行定位) - fixed
固定定位,相对浏览器窗口的进行定位
48. 关于z-index
z-index
用于设置元素的堆叠顺序。本质是设置一个定位元素沿 z 轴的位置,z 轴定义为垂直延伸到显示区的轴。如果为正数,则离用户更近,为负数则表示离用户更远
默认值为auto
,表示堆叠顺序与父元素相等;其值还可以是inherit
,表示从父元素继承 z-index
属性的值
特别注意,z-index 仅能在定位元素上奏效
img{
position:absolute;
left:0px;
top:0px;
z-index:-1;
}
49. 说说CSS3有哪些新特性
CSS3
的新特性中,在布局方面新增了 flex
布局,在选择器方面新增了例如first-of-type,nth-child
等选择器,在盒模型方面添加了 box-sizing
来改变盒模型,在动画方面增加了 animation
,2d
变换,3d
变换等,在颜色方面添加透明,rbga
等,在字体方面允许嵌入字体和设置字体阴影,最后还有媒体查讯等
50. height和line-height的区别
height
一般是指容器的整体高度
line-height
一般是指布局里面一段文字上下行之间的高度,是针对字体来设置的