50道前端笔面试题及参考答案

前言

一直有一个收集一些的笔面试题的习惯。之前发过一部分,链接:
200道前端基础题及答案(上)
200道前端基础题及答案(下)
近期又收集了一些,分享给大家


目录
  1. 聊一下http和https
  2. TCP和UDP的区别
  3. WebSocket 的实现和应用
  4. 说说drag api
  5. 说一下 http2.0
  6. 400和401、403状态码
  7. 说说fetch 发送 2 次请求的原因
  8. 说说cookie、sessionStorage、localStorage
  9. 对 HTML 语义化标签的理解
  10. 聊聊iframe
  11. 说说Doctype的作用
  12. Cookie如何防范 XSS 攻击
  13. addEventListener如何使用
  14. 说说cookie和session的区别
  15. 说说http返回的状态码
  16. 说说http常用请求头
  17. 说说强缓存和协商缓存
  18. 简单说说前端优化方案
  19. 说说GET 和 POST 的区别
  20. 状态码 304 和 200
  21. CSS画一个三角形
  22. H5有哪些新增的元素
  23. 在地址栏里输入一个 URL,到这个页面呈现出来,中间会发生什么?
  24. cache-control 的值有哪些
  25. 浏览器在生成页面的时会生成哪两颗树
  26. CSRF和XSS的网络攻击及防范
  27. 如何看网站的性能如何
  28. 说说HTTP 协议特征
  29. 简述输入 URL 到页面加载显示完成发生了什么
  30. cookie的编码方式
  31. 说说css 盒模型
  32. link标签和@import 标签的区别
  33. transition和animation的区别
  34. 说说flex布局
  35. 说说BFC
  36. JS动画和css3动画的差异
  37. 行内元素和块级元素以及行级块元素
  38. visibility=hidden和opacity=0以及display:none的区别
  39. 外边距折叠
  40. CSS权重
  41. 实现图片在某个容器中居中
  42. 如何实现元素的垂直居中
  43. 浮动元素其display 是什么
  44. 隐藏页面中某个元素的方法
  45. 关于calc
  46. 聊聊display:table和table标签
  47. 说说position都有哪些值
  48. 关于z-index
  49. 说说CSS3有哪些新特性
  50. height和line-height的区别

1.聊一下http和https
http 和 https 的基本概念

http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
https: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即 HTTP 下加入 SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要 SSLhttps协议的主要作用是建立一个信息安全通道,来确保数组的传输,确保网站的真实性。

http 和 https 的区别:

http传输的数据都是未加密的,也就是明文的,网景公司设置了 SSL协议来对http协议传输的数据进行加密处理,简单来说https协议是由httpssl协议构建的可进行加密传输和身份认证的网络协议,比 http协议的安全性更高。
主要的区别如下:

  1. Https协议需要ca 证书,费用较高。
  2. http 是超文本传输协议,信息是明文传输,https则是具有安全性的 ssl 加密传输协议。
  3. 使用不同的链接方式,端口也不同,一般而言,http协议的端口为 80,https 的端口为443
  4. http的连接很简单,是无状态的;HTTPS协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
https 协议的工作原理

客户端在使用 HTTPS方式与 Web服务器通信时有以下几个步骤:

  1. 客户使用 https url访问服务器,则要求 web服务器建立ssl链接。web服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。
  2. 客户端和 web服务器端开始协商 SSL链接的安全等级,也就是加密等级。
  3. 客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。
  4. web 服务器通过自己的私钥解密出会话密钥。
  5. web服务器通过会话密钥加密与客户端之间的通信。
https 协议的优点
  1. 使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
  2. HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
  3. HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
  4. 谷歌曾在 20148 月份调整搜索引擎算法,并称“比起同等 HTTP 网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
https 协议的缺点
  1. https握手阶段比较费时,会使页面加载时间延长50%,增加 10%~20%的耗电。
  2. https缓存不如 http 高效,会增加数据开销。
  3. SSL证书也需要钱,功能越强大的证书费用越高。
  4. SSL 证书需要绑定IP,不能再同一个 ip 上绑定多个域名,ipv4资源支持不了这种消耗。
2. TCP和UDP的区别
  1. TCP 是面向连接的;UDP 是无连接的,即发送数据前不需要先建立链接。
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。 并且因为TCP可靠,面向连接,不会丢失数据因此适合大数据量的交换。
  3. TCP是面向字节流,UDP 面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如 IP电话和视频会议等)。
  4. TCP 只能是 1 对 1 的,UDP 支持 1 对 1,1 对多。
  5. TCP的首部长度较大为 20 字节,而 UDP 只有 8 字节。
  6. TCP是面向连接的可靠性传输,而UDP是不可靠的。
3. WebSocket 的实现和应用
什么是 WebSocket

WebSocketHTML5 中的协议,支持持久连续,http 协议不支持持久性连接。Http1.0HTTP1.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个属性,upgradeconnection
基本请求如下:

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
  1. dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发
  2. darg:事件主体是被拖放元素,在正在拖放被拖放元素时触发
  3. dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发
  4. dragover:事件主体是目标元素,在被拖放在某元素内移动时触发
  5. dragleave:事件主体是目标元素,在被拖放元素移出目标元素是触发
  6. drop:事件主体是目标元素,在目标元素完全接受被拖放元素时触发
  7. dragend:事件主体是被拖放元素,在整个拖放操作结束时触发
5.说一下 http2.0
  1. http2.0 是基于1999年发布的http1.0之后的首次更新。
  2. 提升访问速度;相比 http1.0,请求资源所需时间更少,访问速度更快
  3. 允许多路复用;多路复用允许同时通过单一的 HTTP/2连接发送多重请求-响应信息。改善了:在 http1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞
  4. 二进制分帧:HTTP2.0会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码
  5. 首部压缩;http2以前的头部报文都是文本形式发生,http2为了优化网络对头部报文进行压缩编码使其内容更精简,发送更少的数据加快网络传输
  6. 服务器端推送;为了改善延迟,HTTP/2引入了server push,它允许服务端推送资源给浏览器。一个服务器经常知道一个页面需要很多附加资源,在它响应浏览器第一个请求的时候,可以开始推送这些资源。这允许服务端去完全充分地利用一个可能空闲的网络,改善页面加载时间
6.400和401、403状态码
  1. 400:请求无效
    产生原因:
    (1)前端提交数据的字段名称和字段类型与后台的实体没有保持一致;
    (2)前端提交到后台的数据应该是 json 字符串类型,但是前端没有将对象转化成字符串;
    对应的解决方法:
    (1)对照字段的名称,保持一致性
    (2)将 obj 对象通过 JSON.stringify 实现序列化
  2. 401:当前请求需要用户验证
  3. 403:服务器已经得到请求,但是拒绝执行
7.说说fetch 发送 2 次请求的原因

fetch发送post 请求的时候,总是发送2次,第一次状态码是 204,第二次才成功。
原因很简单,因为你用 fetchpost请求的时候,导致fetch第一次发送了一个 Options请求,询问服务器是否支持修改的请求头,如果服务器支持,则第二次才发送真正的请求

8.说说cookie、sessionStorage、localStorage

共同点:都是保存在浏览器端,并且是同源的

cookie 数据始终在同源的 http请求中携带(即使不需要),即 cookie在浏览器和服务器间来回传递。而 sessionStoragelocalStorage不会自动把数据发给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下, 存储的大小很小只有 4K左右。 (key:可以在浏览器和服务器端来回传递,存储容量小,只有大约 4K 左右)

sessionStorage仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持,localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的 cookie过期时间之前一直有效,即使窗口或浏览器关闭。(key:本身就是一个回话过程,关闭浏览器后消失,session为一个回话,当页面不同即使是同一页面打开两次,也被视为同一次回话)

localStorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。(key:同源窗口都会共享,并且不会失效,不管窗口或者浏览器关闭与否都会始终生效)

9. 对 HTML 语义化标签的理解

HTML5语义化标签是指正确的标签包含了正确的内容,结构良好,便于阅读,比如 nav表示导航条,类似的还有articleheaderfooter 等等标签。

10. 聊聊iframe
  1. 定义:iframe 元素会创建包含另一个文档的内联框架
  2. 提示:可以将提示文字放在<iframe></iframe>之间,来提示某些不支持iframe的浏览器
  3. 缺点:
  • 会阻塞主页面的 onload 事件
  • 搜索引擎无法解读这种页面,不利于 SEO
  • iframe 和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能。
11. 说说Doctype的作用

Doctype声明于文档最前面,告诉浏览器以何种方式来渲染页面,这里有两种模式,严格模式和混杂模式
严格模式的排版和JS 运作模式是以该浏览器支持的最高标准运行
混杂模式,向后兼容,模拟老式浏览器,防止浏览器无法兼容页面

12. Cookie如何防范 XSS 攻击

XSS(跨站脚本攻击)是指攻击者在返回的 HTML中嵌入javascript脚本

为了减轻这些攻击,需要在HTTP头部配上set-cookie

  1. httponly-这个属性可以防止 XSS,它会禁止javascript脚本来访问 cookie
  2. 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的区别
  1. cookie数据存放在客户的浏览器上,session 数据放在服务器上
  2. cookie 不是很安全,别人可以分析存放在本地的 cookie并进行 cookie欺骗,考虑到安全应当使用session
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用 cookie
  4. 单个 cookie保存的数据不能超过4KB,很多浏览器都限制一个站点最多保存20cookie
15. 说说http返回的状态码

100 Continue继续。客户端应继续其请求
101 Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议
200 OK 请求成功。一般用于GETPOST 请求
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 类似。使用 GETPOST请求查看
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)

强缓存相关字段有 expirescache-control。如果 cache-controlexpires同时存在的话,cache-control的优先级高于expires
协商缓存相关字段有Last-Modified/If-Modified-SinceEtag/If-None-Match

18. 简单说说前端优化方案

这个一个超级大的问题,这里简单总结

降低请求量:合并资源,减少HTTP请求数,minify / gzip压缩,webPlazyLoad

加快请求速度:预解析 DNS,减少域名数,并行加载,CDN分发

缓存:HTTP 协议缓存请求,离线缓存manifest,离线数据缓存 localStorage

渲染:JS/CSS 优化,加载顺序,服务端渲染,pipeline

19. 说说GET 和 POST 的区别
  1. get参数通过 url传递,post 放在 request body
  2. get请求在url中传递的参数是有长度限制的,而 post没有
  3. getpost更不安全,因为参数直接暴露在 url中,所以不能用来传递敏感信息
  4. get请求只能进行 url 编码,而 post支持多种编码方式
  5. get请求会浏览器主动 cache,而 post支持多种编码方式
  6. get 请求参数会被完整保留在浏览历史记录里,而 post中的参数不会被保留
  7. getpost本质上就是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语义化,增加了 headerfooternav,aside,section 等语义化标签,在表单方面,为了增强表单,为input增加了 coloremial,data ,range等类型,在存储方面,提供了 sessionStoragelocalStorage和离线存储,通过这些存储方式方便数据在客户端的存储和获取,在多媒体方面规定了音频和视频元素audiovedio,另外还有地理定位,canvas画布,拖放,多线程编程的web workerwebsocket 协议

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树合并为渲染树,这里主要做的是排除非视觉节点,比如scriptmeta标签和排除 displaynone的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html文件中会含有图片,视频,音频等资源,在解析 DOM的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是 4-6 个,当然在这些所有的请求中我们还需要关注的就是缓存,缓存一般通过Cache-ControlLast-ModifyExpires等首部字段控制。 Cache-ControlExpires 的区别在于 Cache-Control使用相对时间,Expires使用的是基于服务器 端的绝对时间,因为存在时差问题,一般采用Cache-Control,在请求这些有设置了缓存的数据时,会先 查看是否过期,如果没有过期则直接使用本地缓存,过期则请求并在服务器校验文件是否修改,如果上一次 响应设置了 ETag值会在这次请求的时候作为If-None-Match的值交给服务器校验,如果一致,继续校验 Last-Modified,没有设置ETag则直接验证Last-Modified,再决定是否返回 304

24. cache-control 的值有哪些

cache-control是一个通用消息头字段被用于 HTTP请求和响应中,通过指定指令来实现缓存机制,这个缓存指令是单向的,常见的取值有privateno-cachemax-agemust-revalidate等,默认为 private

25. 浏览器在生成页面的时会生成哪两颗树

构造两棵树,DOM 树和 CSSOM 规则树

当浏览器接收到服务器相应来的 HTML 文档后,会遍历文档节点,生成 DOM 树,
CSSOM规则树由浏览器解析 CSS文件生成

26. CSRF和XSS的网络攻击及防范

CSRF:跨站请求伪造,可以理解为攻击者盗用了用户的身份,以用户的名义发送了恶意请求,比如用户登录了一个网站后,立刻在另一个tab页面访问量攻击者用来制造攻击的网站,这个网站要求访问刚刚登陆的网站,并发送了一个恶意请求,这时候 CSRF就产生了,比如这个制造攻击的网站使用一张图片,但是这种图片的链接却是可以修改数据库的,这时候攻击者就可以以用户的名义操作这个数据库,防御方式的话:使用验证码,检查 https头部的refer,使用 token

XSS:跨站脚本攻击,是说攻击者通过注入恶意的脚本,在用户浏览网页的时候进行攻击,比如获取cookie,或者其他用户身份信息,可以分为存储型和反射型,存储型是攻击者输入一些数据并且存储到了数据库中,其他浏览者看到的时候进行攻击,反射型的话不存储在数据库中,往往表现为将攻击代码放在url 地址的请求参数中,防御的话为cookie设置 httpOnly 属性,对用户的输入进行检查,进行特殊字符过滤

27. 如何看网站的性能如何

检测页面加载时间一般有两种方式:

  1. 一种是被动去测;就是在被检测的页面置入脚本或探针,当用户访问网页时,探针自动采集数据并传回数据库进行分析;
  2. 另一种主动监测;即主动的搭建分布式受控环境,模拟用户发起页面访问请求,主动采集性能数据并分析,在检测的精准度上,专业的第三方工具效果更佳,比如说性能极客等
28. 说说HTTP 协议特征

HTTP是一个基于 TCP/IP通信协议来传递数据(HTML文件, 图片文件, 查询结果等)

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URLHTTP 服务端即 WEB服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息

29. 简述输入 URL 到页面加载显示完成发生了什么
  1. DNS 解析
  2. TCP连接
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回 HTTP报文
  5. 浏览器解析渲染页面
  6. 连接结束
30. cookie的编码方式

encodeURI()

31. 说说css 盒模型

这里说的盒子本质就是用于装页面上元素的矩形区域;CSS中的盒子模型有两种,包括 IE盒模型和 W3C标准盒模型

两种盒模型最主要的区别就是width 的包含范围,在标准模型中,widthcontent部分的宽度,在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的区别:

  1. link属于html标签,而@importcss提供的;
  2. 页面被加载时,link会同时被加载,而@import引用的 css 会等到页面加载结束后加载;
  3. link方式样式的权重高于@import的;
  4. linkhtml标签,因此没有兼容性,而@import 只有IE5以上才能识别。
33. transition和animation的区别

Animationtransition大部分属性是相同的,他们都是随时间改变元素的属性值;

区别在于:

  1. transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性值
  2. transition2 帧,从from .... to,而 animation可以一帧一帧的
34. 说说flex布局

首先是父级容器上的属性

  1. flex-direction
    flex-direction 用于设置主轴方向,对应的值有row、 row-reverse、 column、 column-reverse,分别表示水平、水平翻转、垂直、垂直翻转

  2. flex-wrap
    flex-wrap用于控制子级项排列超出边界时是否换行展示;取值可以是nowrap、wrap、wrap-reverse,分别表示不换行、换行、换行并且反转行

  3. flex-flow
    flex-flow表示流动,即文档流,其实就是flex-direction和flex-wrap的复合写法

  4. justify-content
    justify-content用于设置主轴方向的对齐方式,取值有5个,分别是:flex-start、flex-end、center、space-between、space-around,表示主轴起点、主轴终点、居中、空白在元素与元素之间、空白环绕着元素

  5. align-items
    align-items与justify-content对应,justify-content表示主轴方向的对齐方式,而align-items表示侧轴上的对齐方式。但是取值有点不同,align-items的取值有:flex-start、flex-end、center、baseline、stretch(默认值),分别表示起点对齐、终点对齐、居中对齐、基线对齐、拉伸对齐

  6. align-content
    align-content 子类多行排列时,子类在侧轴方向的对齐方式。注意如果是一行,该属性无效。即需要设置换行或者换行翻转才行,取值跟justify-content一致

接着来看子级项目的相关属性

  1. align-self
    align-self用于设置子级项目自身在侧轴上的对齐方式,其实就是单独设置一些特殊子类的侧轴对齐方式,用于覆盖父级得align-items。所以优先级高于align-items。取值也与align-items一致:flex-start、flex-end、center、baseline、stretch

  2. order:n
    用于调整特定子类中在所有子类中的排序,n是整数,数值越小,排列越靠前,默认值为 0,可以是负数
    上例中将最后一个放到前面去

  3. flex-grow
    flex-grow表示子项的扩展比例,默认0 不扩展。注意:行中要存在可分配的剩余空间,子项多行时,以行为单位进行扩展,即我这行只能在我这行的剩余空间中按比例分

  4. flex-shrink
    flex-shrink用于定义子项的收缩比例,默认值为1,表示等比缩小,容器空间不足需要收缩时才有效果

  5. flex-basis
    定义子项在主轴上的基准尺寸(初始大小)
    默认值:auto,即项目原定大小;如果设定值,则优先于项目原定大小

  6. flex
    flex是flex-grow, flex-shrink 和 flex-basis的简写。多个值以空格隔开,按既定顺序排列(grow、shrink、basis)

35. 说说BFC

BFC 即 Block Formatting Contexts (块级格式化上下文),是一个特殊独立的渲染区域,这个取悦有一定的布局规则,比如:

  1. BFC 区域不会与 float box 重叠
  2. BFC 是页面上的一个独立容器,子元素不会影响到外面
  3. 计算 BFC 的高度时,浮动元素也会参与计算

那些元素会生成 BFC,即如何触发BFC:

  1. body 根元素
  2. 浮动元素:float 除 none 以外的值
  3. 绝对定位元素:position (absolute、fixed)
  4. display 为 inline-block、table-cell、table-caption,flex,inline-flex 的元素
  5. overflow 除了 visible 以外的值 (hidden、auto、scroll)

利用BFC,可以用于清楚浮动,防止 margin 重叠等

36. JS动画和css3动画的差异

渲染线程分为main threadcompositor thread,如果css动画只改变 transformopacity,这时整个CSS动画在compositor trhead完成;而 JS 动画则会在 main thread执行,然后出发compositor thread 进行下一步操作。特别注意的是如果改变transformopacity是不会layout或者paint

两者主要区别:

  1. 功能涵盖面,JSCSS
  2. 实现难度不一,CSS3JS 更加简单
  3. 对帧速表现不好的低版本浏览器,css3可以做到自然降级
  4. css3动画有天然事件支持
  5. css3有兼容性问题
37. 行内元素和块级元素以及行级块元素
行内元素

如:span strong em a del...
特点:

  1. 内容决定元素所占位置;
  2. 不可以通过css改变宽高;
块级元素

如:div p ul li ol form address...
特点:

  1. 独占一行;
  2. 可以通过css改变宽高;
行级块元素

如:img...
特点:

  1. 内容决定元素所占位置;
  2. 可以通过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塌陷

折叠的规律是:

  1. 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值
  2. 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值
  3. 两个外边距一正一负时,折叠结果是两者的相加的和
40. CSS权重

规则如下:
·!important > 行间样式 > ID > class | 属性 > 标签选择器 | 伪类选择器 > 通配符选择器
咋一下,可能觉得这什么东西。其实这个也有一个规律:一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。

记住上面的可以解决大多数问题,但是解决不了所以的问题,特别是一些非常复杂的选择器带来的优先级问题。那怎么办呢?

这需要你来了解CSS更深入的东西,选择器权重
各个选择器的权重如下:
!important Infinity
行间样式 1000
ID选择器 100
class类选择器 | 属性选择器 10
标签选择器 | 伪类选择器 1
通配符选择器 0
实际,权重表示的就是选择器优先级。css将各个简单的选择器对应的“重要度”用一个数值来表示,我们叫它权重值,复杂选择器(如:父子选择器,直接子元素选择器,并列选择器),只要写在同行的选择器,权重值等于各个简单的选择器的权重相加。当出现属性覆盖时,权重值高的覆盖权重值底的。
注:
权重的数值是256进制

41. 实现图片在某个容器中居中
  1. 父元素固定宽高,利用定位及设置子元素 margin 值为自身的一半
  2. 父元素固定宽高,子元素设置position: absolutemargin:auto平均分配margin
  3. css3属性transform;子元素设置position: absolute; left: 50%; top: 50%;transform: translate(-50%,-50%)即可
  4. 将父元素设置成 display: table, 子元素设置为单元格 display: table-cell
  5. 弹性布局 display: flex;设置 align-items: center; justify-content: center
42. 如何实现元素的垂直居中

有几种方式

  1. 父元素 display:flex;align-items:center
  2. 元素绝对定位,top:50%,margin-top:-(高度/2)
  3. 高度不确定用 transform:translateY(-50%)
  4. 父元素table布局,子元素设置 vertical-align:center
43. 浮动元素其display 是什么

block

44. 隐藏页面中某个元素的方法

隐藏页面中某个元素的方法有很多,如下:

  1. display:none
  2. visibility:hidden
  3. opacity: 0
  4. position移到外部
  5. 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把元素放置在一个静态的,相对的,绝对的,固定的位置中

  1. static
    设置为 static 的元素,他始终处于页面流给予的位置,static 元素会忽略任何top,buttom,left,right 声明
  2. relative
    相对定位,可将元素相对于其原本正常位置移动
  3. absolute
    绝对定位,相对于最近有定位的父级进行定位(如果无,则相对于文档进行定位)
  4. 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来改变盒模型,在动画方面增加了 animation2d变换,3d 变换等,在颜色方面添加透明,rbga等,在字体方面允许嵌入字体和设置字体阴影,最后还有媒体查讯等

50. height和line-height的区别

height一般是指容器的整体高度
line-height 一般是指布局里面一段文字上下行之间的高度,是针对字体来设置的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容