HTML 面试知识点总结

648 阅读18分钟

1. DOCTYPE 的作用是什么?

<!DOCTYPE> 声明一般位于文档的第一行,它的作用主要是告诉浏览器以什么样的模式来解析文档。一般指定了之后会以标准模式来 进行文档解析,否则就以兼容模式进行解析。在标准模式下,浏览器的解析规则都是按照最新的标准进行解析的。而在兼容模式下,浏 览器会以向后兼容的方式来模拟老式浏览器的行为,以保证一些老的网站的正确访问。

2. 标准模式与兼容模式各有什么区别?

标准模式的渲染方式和 JS 引擎的解析方式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示 ,模拟老式浏览器的行为以防止站点无法工作。

3.HTML5 为什么只需要写 ,而不需要引入 DTD?

HTML5 不基于 SGML,因此不需要对 DTD 进行引用,但是需要 DOCTYPE 来规范浏览器的行为(让浏览器按照它们应该的方式来运 行)。 

 而 HTML4.01 基于 SGML ,所以需要对 DTD 进行引用,才能告知浏览器文档所使用的文档类型

4.SGML 、 HTML 、XML 和 XHTML 的区别?

SGML 是标准通用标记语言,是一种定义电子文档结构和描述其内容的国际标准语言,是所有电子文档标记语言的起源。 

 HTML 是超文本标记语言,主要是用于规定怎么显示网页。 

XML 是可扩展标记语言是未来网页语言的发展方向,XML 和 HTML 的最大区别就在于 XML 的标签是可以自己创建的,数量无限多, 而 HTML 的标签都是固定的而且数量有限。 

 XHTML 也是现在基本上所有网页都在用的标记语言,他其实和 HTML 没什么本质的区别,标签都一样,用法也都一样,就是比 HTML 更严格,比如标签必须都用小写,标签都必须有闭合标签等。

5.DTD 介绍

DTD( Document Type Definition 文档类型定义)是一组机器可读的规则,它们定义 XML 或 HTML 的特定版本中所有允许元 素及它们的属性和层次关系的定义。在解析网页时,浏览器将使用这些规则检查页面的有效性并且采取相应的措施。 DTD 是对 HTML 文档的声明,还会影响浏览器的渲染模式(工作模式)。

6. 行内元素定义

HTML4 中,元素被分成两大类: inline (内联元素)与 block(块级元素)。一个行内元素只占据它对应标签的边框所包含的空 间。 常见的行内元素有 a b span img strong sub sup button input label select textarea

7. 块级元素定义

块级元素占据其父元素(容器)的整个宽度,因此创建了一个“块”。 常见的块级元素有 div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p 

8. 行内元素与块级元素的区别?

HTML4中,元素被分成两大类:inline (内联元素)与 block (块级元素)。 (1) 格式上,默认情况下,行内元素不会以新行开始,而块级元素会新起一行。 (2) 内容上,默认情况下,行内元素只能包含文本和其他行内元素。而块级元素可以包含行内元素和其他块级元素。 (3) 行内元素与块级元素属性的不同,主要是盒模型属性上:行内元素设置 width 无效,height 无效(可以设置 line-hei ght),设置 margin 和 padding 的上下不会对其他元素产生影响。

9. 空元素定义

标签内没有内容的 HTML 标签被称为空元素。空元素是在开始标签中关闭的。 常见的空元素有:br hr img input link meta

10.link 标签定义

link 标签定义文档与外部资源的关系。 link 元素是空元素,它仅包含属性。 此元素只能存在于 head 部分,不过它可出现任何次数。 link 标签中的 rel 属性定义了当前文档与被链接文档之间的关系。常见的 stylesheet 指的是定义一个外部加载的样式表。

11.页面导入样式时,使用 link 和 @import 有什么区别?

(1)从属关系区别。 @import 是 CSS 提供的语法规则,只有导入样式表的作用;link 是 HTML 提供的标签,不仅可以加 载 CSS 文件,还可以定义 RSS、rel 连接属性、引入网站图标等。 

 (2)加载顺序区别。加载页面时,link 标签引入的 CSS 被同时加载;@import 引入的 CSS 将在页面加载完毕后被加载。 

 (3)兼容性区别。@import 是 CSS2.1 才有的语法,故只可在 IE5+ 才能识别;link 标签作为 HTML 元素,不存在兼容 性问题。 

(4)DOM 可控性区别。可以通过 JS 操作 DOM ,插入 link 标签来改变样式;由于 DOM 方法是基于文档的,无法使用 @i mport 的方式插入样式。

12.你对浏览器的理解?

简单来说浏览器可以分为两部分,shell 和 内核。 其中 shell 的种类相对比较多,内核则比较少。shell 是指浏览器的外壳:例如菜单,工具栏等。主要是提供给用户界面操作, 参数设置等等。它是调用内核来实现各种功能的。内核才是浏览器的核心。内核是基于标记语言显示内容的程序或模块。也有一些 浏览器并不区分外壳和内核。从 Mozilla 将 Gecko 独立出来后,才有了外壳和内核的明确划分。

13.介绍一下你对浏览器内核的理解?

 主要分成两部分:渲染引擎和 JS 引擎。 渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容。默认情况下,渲染引擎可以显示 html、xml 文档及图片,它也 可以借助插件(一种浏览器扩展)显示其他类型数据,例如使用 PDF 阅读器插件,可以显示 PDF 格式。 JS 引擎:解析和执行 javascript 来实现网页的动态效果。 最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。

14.常见浏览器所用内核

 (1) IE 浏览器内核:Trident 内核,也是俗称的 IE 内核; 

 (2) Chrome 浏览器内核:统称为 Chromium 内核或 Chrome 内核,以前是 Webkit 内核,现在是 Blink内核; 

 (3) Firefox 浏览器内核:Gecko 内核,俗称 Firefox 内核; 

 (4) Safari 浏览器内核:Webkit 内核; 

 (5) Opera 浏览器内核:最初是自己的 Presto 内核,后来加入谷歌大军,从 Webkit 又到了 Blink 内核; 

 (6) 360浏览器、猎豹浏览器内核:IE + Chrome 双内核; 

 (7) 搜狗、遨游、QQ 浏览器内核:Trident(兼容模式)+ Webkit(高速模式); 

 (8) 百度浏览器、世界之窗内核:IE 内核; 

 (9) 2345浏览器内核:好像以前是 IE 内核,现在也是 IE + Chrome 双内核了; 

 (10)UC 浏览器内核:这个众口不一,UC 说是他们自己研发的 U3 内核,但好像还是基于 Webkit 和 Trident ,还有说 是基于火狐内核。

15.浏览器的渲染原理?

(1)首先解析收到的文档,根据文档定义构建一棵 DOM 树,DOM 树是由 DOM 元素及属性节点组成的。 

 (2)然后对 CSS 进行解析,生成 CSSOM 规则树。 

 (3)根据 DOM 树和 CSSOM 规则树构建渲染树。渲染树的节点被称为渲染对象,渲染对象是一个包含有颜色和大小等属性的矩 形,渲染对象和 DOM 元素相对应,但这种对应关系不是一对一的,不可见的 DOM 元素不会被插入渲染树。还有一些 DOM 元素对应几个可见对象,它们一般是一些具有复杂结构的元素,无法用一个矩形来描述。 

 (4)当渲染对象被创建并添加到树中,它们并没有位置和大小,所以当浏览器生成渲染树以后,就会根据渲染树来进行布局(也 可以叫做回流)。这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。通常这一行为也被称为“自动 重排”。 

 (5)布局阶段结束后是绘制阶段,遍历渲染树并调用渲染对象的 paint 方法将它们的内容显示在屏幕上,绘制使用 UI 基础组 件。

16.渲染过程中遇到 JS 文件怎么处理?(浏览器解析过程)

 JavaScript 的加载、解析与执行会阻塞文档的解析,也就是说,在构建 DOM 时,HTML 解析器若遇到了 JavaScript,那么 它会暂停文档的解析,将控制权移交给 JavaScript 引擎,等 JavaScript 引擎运行完毕,浏览器再从中断的地方恢复继续解 析文档。 也就是说,如果你想首屏渲染的越快,就越不应该在首屏就加载 JS 文件,这也是都建议将 script 标签放在 body 标签底部的 原因。当然在当下,并不是说 script 标签必须放在底部,因为你可以给 script 标签添加 defer 或者 async 属性。

17.async 和 defer 有什么区别?(浏览器解析过程)

defer:浏览器指示脚本在⽂档被解析后执⾏,script被异步加载后并不会⽴刻执⾏,⽽是等待⽂档被解析完毕后执
⾏。
async:同样是异步加载脚本,区别是脚本加载完毕后⽴即执⾏,这导致async属性下的脚本是乱序的,对于script
有先后依赖关系的情况,并不适⽤。 

18.什么是文档的预解析?(浏览器解析过程)

 Webkit 和 Firefox 都做了这个优化,当执行 JavaScript 脚本时,另一个线程解析剩下的文档,并加载后面需要通过网络加 载的资源。这种方式可以使资源并行加载从而使整体速度更快。需要注意的是,预解析并不改变 DOM 树,它将这个工作留给主解析 过程,自己只解析外部资源的引用,比如外部脚本、样式表及图片。

19.CSS 如何阻塞文档解析?(浏览器解析过程)

 理论上,既然样式表不改变 DOM 树,也就没有必要停下文档的解析等待它们,然而,存在一个问题,JavaScript 脚本执行时可 能在文档的解析过程中请求样式信息,如果样式还没有加载和解析,脚本将得到错误的值,显然这将会导致很多问题。 所以如果浏览器尚未完成 CSSOM 的下载和构建,而我们却想在此时运行脚本,那么浏览器将延迟 JavaScript 脚本执行和文档 的解析,直至其完成 CSSOM 的下载和构建。也就是说,在这种情况下,浏览器会先下载和构建 CSSOM,然后再执行 JavaScript, 最后再继续文档的解析。

20. 渲染页面时常见哪些不良现象?(浏览器渲染过程)

 FOUC:主要指的是样式闪烁的问题,由于浏览器渲染机制(比如firefox),在 CSS 加载之前,先呈现了 HTML,就会导致展示 出无样式内容,然后样式突然呈现的现象。会出现这个问题的原因主要是 css 加载时间过长,或者 css 被放在了文档底 部。 

 白屏:有些浏览器渲染机制(比如chrome)要先构建 DOM 树和 CSSOM 树,构建完成后再进行渲染,如果 CSS 部分放在 HTML 尾部,由于 CSS 未加载完成,浏览器迟迟未渲染,从而导致白屏;也可能是把 js 文件放在头部,脚本的加载会阻塞后面 文档内容的解析,从而页面迟迟未渲染出来,出现白屏问题。

21.如何优化关键渲染路径?(浏览器渲染过程)

 为尽快完成首次渲染,我们需要最大限度减小以下三种可变因素: 

 (1)关键资源的数量。 

 (2)关键路径长度。 

 (3)关键字节的数量。 

 优化关键渲染路径的常规步骤如下: 

 (1)对关键路径进行分析和特性描述:资源数、字节数、长度。  

 (2)最大限度减少关键资源的数量:删除它们,延迟它们的下载,将它们标记为异步等。

 (3)优化关键字节数以缩短下载时间(往返次数)。 

(4)优化其余关键资源的加载顺序:您需要尽早下载所有关键资产,以缩短关键路径长度。

22.什么是重绘和回流?(浏览器绘制过程)

 重绘: 当渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观、风格,而不会影响布局的操作,比如 background -color,我们将这样的操作称为重绘。 回流:当渲染树中的一部分(或全部)因为元素的规模尺寸、布局、隐藏等改变而需要重新构建的操作,会影响到布局的操作,这样 的操作我们称为回流。 常见引起回流属性和方法: 任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流。

(1)添加或者删除可见的 DOM 元素; 

(2)元素尺寸改变——边距、填充、边框、宽度和高度  

(3)内容变化,比如用户在 input 框中输入文字  

(4)浏览器窗口尺寸改变——resize事件发生时 

(5)计算 offsetWidth 和 offsetHeight 属性 

(6)设置 style 属性的值 

(7)当你修改网页的默认字体时。 回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列 回流。

23.如何减少回流?(浏览器绘制过程)

 (1)使用 transform 替代 top 

 (2)不要把节点的属性值放在一个循环里当成循环里的变量 

 (3)不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局 

 (4)把 DOM 离线后修改。如:使用 documentFragment 对象在内存里操作 DOM 

 (5)不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css 的 class,然后修改 DOM 的 className。

24.为什么操作 DOM 慢?(浏览器绘制过程)

一些 DOM 的操作或者属性访问可能会引起页面的回流和重绘,从而引起性能上的消耗。

25.DOMContentLoaded 事件和 Load 事件的区别?

 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和 子框架的加载完成。 Load 事件是当所有资源加载完成后触发的。

26.HTML5 有哪些新特性、移除了那些元素?

 HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。 新增的有: 

 绘画 canvas; 用于媒介回放的 video 和 audio 元素; 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除; 语意化更好的内容元素,比如 article、footer、header、nav、section; 表单控件,calendar、date、time、email、url、search; 新的技术 webworker, websocket; 新的文档属性 document.visibilityState 

 移除的元素有: 

 纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes;

27.如何处理 HTML5 新标签的浏览器兼容问题?

 (1) IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签,可以利用这一特性让这些浏览器 支持 HTML5 新标签,浏览器支持新标签后,还需要添加标签默认的样式。 (2) 当然也可以直接使用成熟的框架,比如 html5shim ; `<!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]-->` [if lte IE 9]……[endif] 判断 IE 的版本,限定只有 IE9 以下浏览器版本需要执行的语句。

28.简述一下你对 HTML 语义化的理解?

  1. 用正确的标签做正确的事情。  
  2. html 语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析; 
  3.  即使在没有样式 CSS 情况下也以一种文档格式显示,并且是容易阅读的; 
  4. 搜索引擎的爬虫也依赖于 HTML 标记来确定上下文和各个关键字的权重,利于 SEO ;
  5. 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

29.前端需要注意哪些 SEO ?

(1)合理的 title、description、keywords:搜索对着三项的权重逐个减小,title 值强调重点即可,重要关键词出现不要超 过2次,而且要靠前,不同页面 title 要有所不同;description 把页面内容高度概括,长度合适,不可过分堆砌关键词,不 同页面 description 有所不同;   keywords 列举出重要关键词即可。 

 (2)语义化的 HTML 代码,符合 W3C 规范:语义化代码让搜索引擎容易理解网页。 

 (3)重要内容 HTML 代码放在最前:搜索引擎抓取 HTML 顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容肯定被 抓取。 

 (4)重要内容不要用 js 输出:爬虫不会执行 js 获取内容 

 (5)少用 iframe:搜索引擎不会抓取 iframe 中的内容 

 (6)非装饰性图片必须加 alt 

 (7)提高网站速度:网站速度是搜索引擎排序的一个重要指标

30.请描述一下 cookies,sessionStorage 和 localStorage 的区别?

 SessionStorage, LocalStorage, Cookie 这三者都可以被用来在浏览器端存储数据,而且都是字符串类型的键值对。区别 在于前两者属于 HTML5 WebStorage,创建它们的目的便于客户端存储数据。而 cookie 是网站为了标示用户身份而储存在用户 本地终端上的数据(通常经过加密)。cookie 数据始终在同源(协议、主机、端口相同)的 http 请求中携带(即使不需要),会 在浏览器和服务器间来回传递。

 存储大小:

 cookie 数据大小不能超过4 k 。

 sessionStorage 和 localStorage 虽然也有存储大小的限制,但比 cookie 大得多,可以达到 5M 或更大。 

 有期时间:

 localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据。 

 sessionStorage 数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会 保持原来的页面会话。在新标签或窗口打开一个页面时会在顶级浏览上下文中初始化一个新的会话。 

 cookie 设置的 cookie 过期时间之前一直有效,即使窗口或浏览器关闭。

 作用域:

 sessionStorage 只在同源的同窗口(或标签页)中共享数据,也就是只在当前会话中共享。 localStorage 在所有同源窗口中都是共享的。 cookie 在所有同源窗口中都是共享的。

31.iframe 有那些缺点?

 iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。 

 主要缺点有: 

 (1) iframe 会阻塞主页面的 onload 事件。window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才 会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 src 可以避免这种阻塞情况。 

(2) 搜索引擎的检索程序无法解读这种页面,不利于网页的 SEO 。 

(3) iframe 和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。

 (4) 浏览器的后退按钮失效。 

 (5) 小型的移动设备无法完全显示框架。

32.Canvas 和 SVG 有什么区别?

 Canvas 是一种通过 JavaScript 来绘制 2D 图形的方法。Canvas 是逐像素来进行渲染的,因此当我们对 Canvas 进行缩放时, 会出现锯齿或者失真的情况。 

 SVG 是一种使用 XML 描述 2D 图形的语言。SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。我们可以为某个元素 附加 JavaScript 事件监听函数。并且 SVG 保存的是图形的绘制方法,因此当 SVG 图形缩放时并不会失真。