html(超文本标记语言),是一种用于创建网页的标准标记语言。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>This is a title</title>
  5. </head>
  6. <body>
  7. <p>Hello world!</p>
  8. </body>
  9. </html>

html由元素、属性、文档类型声明组成。

A.文档类型声明

在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML。DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。
HTML5 不基于 SGML,所以不需要引用 DTD。
※提示:

  1. 请始终向 HTML 文档添加 <!DOCTYPE> 声明,这样浏览器才能获知文档类型。
  2. <!DOCTYPE> 声明对大小写不敏感。

解释:
DTD(Document Type Definition)概念缘于SGML,每一份SGML文件,均应有相对应的DTD。DTD有四个组成如下:

  • 元素(Elements)
  • 属性(Attribute)
  • 实体(Entities)
  • 注释(Comments)

SGML:标准通用标记语言(Standard Generalized Markup Language,SGML)是现时常用的超文本格式的最高层次标准,是可以定义标记语言的元语言,甚至可以定义不必采用< >的常规方式。由于它的复杂,因而难以普及。

常见的面试题
1 DOCTYPE有什么作用?标准模式与混杂模式如何区分?它们有何意义?
告诉浏览器使用哪个版本的HTML规范来渲染文档。DOCTYPE不存在或形式不正确会导致HTML文档以混杂模式呈现。
标准模式(Standards mode)以浏览器支持的最高标准运行;混杂模式(Quirks mode)中页面是一种比较宽松的向后兼容的方式显示。
2 HTML5为什么只需要写 ?
HTML5不基于SGML(Standard Generalized Markup Language 标准通用标记语言),因此不需要对DTD(DTD 文档类型定义)进行引用,但是需要DOCTYPE来规范浏览器行为。
HTML4.01基于SGML,所以需要引用DTD。才能告知浏览器文档所使用的文档类型,如下:<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd">

标准模式:让IE的行为更接近标准行为
混杂模式:让IE的行为与(包含非标准特性的)IE5相同。混杂模式是一种比较宽松的向后兼容的模式。混杂模式通常模拟老式浏览器的行为,以防止老站点无法工作。如果在文档开始处没有发现文档类型声明,则所有浏览器都会默认开启混杂模式。但不推荐此种做法,因为不同浏览器在这种模式下的行为差异非常大,如果不使用某些hack技术,跨浏览器的行为根本就没有一致性可言

B.元素(文档流)

块级元素、行内元素、内联元素。

1.块级元素和行内元素的区别

  • 块元素,总是在新行上开始;内联元素,和其他元素在一行
  • 块元素,能容纳其他块元素或者内联元素;内联元素,只能容纳文本或其他内联元素
  • 块元素中高度,行高以及顶和底边距都可以控制;内联元素中高,行高及顶和底边距不可改变

2.块元素的特点:
a.总是在新行上开始;
b.高度、行高以及外边距和内边距都可控制;
c.宽度默认是它容器的100%,除非设定一个宽度;
d.他可以容纳内联元素和其他块元素。
3.内联元素的特点:
a.和其他元素都在同一行;
b.高,行高及外边距和内边距不可改变;
c.宽度就是它的文字和图片的宽度,不可改变;
d.内联元素只能容纳文本或者其他内联元素。

常见的块级元素

定义地址
定义表格标题
定义列表中定义条目
定义文档中的分区或节
定义列表
定义列表中的项目
定义一个框架集
创建 HTML 表单

定义最大的标题

定义副标题

定义标题

定义标题
定义标题
定义最小的标题

创建一条水平线
元素为 fieldset 元素定义标题
  • 标签定义列表项目
    </td> <td>为那些不支持框架的浏览器显示文本,于 frameset 元素内部</td> </tr> <tr> <td><noscript></td> <td>定义在脚本未被执行时的替代内容</td> </tr> <tr> <td><ol></td> <td>定义有序列表</td> </tr> <tr> <td><ul></td> <td>定义无序列表</td> </tr> <tr> <td><p></td> <td>标签定义段落</td> </tr> <tr> <td><pre></td> <td>定义预格式化的文本</td> </tr> <tr> <td><table></td> <td>标签定义 HTML 表格</td> </tr> <tr> <td><tbody></td> <td>标签表格主体(正文)</td> </tr> <tr> <td><td></td> <td>表格中的标准单元格</td> </tr> <tr> <td><tfoot></td> <td>定义表格的页脚(脚注或表注)</td> </tr> <tr> <td><th></td> <td>定义表头单元格</td> </tr> <tr> <td><thead></td> <td>标签定义表格的表头</td> </tr> <tr> <td><tr></td> <td>定义表格中的行</td> </tr> </tbody> </table> <p><a name="d6dc6818"></a></p> <h3 id="8l64p7"><a name="8l64p7" class="reference-link"></a><span class="header-link octicon octicon-link"></span>常见行内元素</h3><table> <thead> <tr> <th><a></th> <th>标签可定义锚</th> </tr> </thead> <tbody> <tr> <td><abbr></td> <td>表示一个缩写形式</td> </tr> <tr> <td><acronym></td> <td>定义只取首字母缩写</td> </tr> <tr> <td><b></td> <td>字体加粗</td> </tr> <tr> <td><bdo></td> <td>可覆盖默认的文本方向</td> </tr> <tr> <td><big></td> <td>大号字体加粗</td> </tr> <tr> <td><br></td> <td>换行</td> </tr> <tr> <td><cite></td> <td>引用进行定义</td> </tr> <tr> <td><code></td> <td>定义计算机代码文本</td> </tr> <tr> <td><dfn></td> <td>定义一个定义项目</td> </tr> <tr> <td><em></td> <td>定义为强调的内容</td> </tr> <tr> <td><i></td> <td>斜体文本效果</td> </tr> <tr> <td><img></td> <td>向网页中嵌入一幅图像</td> </tr> <tr> <td><input></td> <td>输入框</td> </tr> <tr> <td><kbd></td> <td>定义键盘文本</td> </tr> <tr> <td><label></td> <td>标签为 input 元素定义标注(标记)</td> </tr> <tr> <td><q></td> <td>定义短的引用</td> </tr> <tr> <td><samp></td> <td>定义样本文本</td> </tr> <tr> <td><select></td> <td>创建单选或多选菜单</td> </tr> <tr> <td><small></td> <td>呈现小号字体效果</td> </tr> <tr> <td><span></td> <td>组合文档中的行内元素</td> </tr> <tr> <td><strong></td> <td>语气更强的强调的内容</td> </tr> <tr> <td><sub></td> <td>定义下标文本</td> </tr> <tr> <td><sup></td> <td>定义上标文本</td> </tr> <tr> <td><textarea></td> <td>多行的文本输入控件</td> </tr> <tr> <td><tt></td> <td>打字机或者等宽的文本效果</td> </tr> <tr> <td><var></td> <td>定义变量</td> </tr> </tbody> </table> <p><a name="52dd7a89"></a></p> <h3 id="eug6fh"><a name="eug6fh" class="reference-link"></a><span class="header-link octicon octicon-link"></span>常见内联元素</h3><table> <thead> <tr> <th><button></th> <th>按钮</th> </tr> </thead> <tbody> <tr> <td><del></td> <td>定义文档中已被删除的文本</td> </tr> <tr> <td><iframe></td> <td>创建包含另外一个文档的内联框架(即行内框架)</td> </tr> <tr> <td><ins></td> <td>标签定义已经被插入文档中的文本</td> </tr> <tr> <td><map></td> <td>客户端图像映射(即热区)</td> </tr> <tr> <td><object></td> <td>object对象</td> </tr> <tr> <td><script></td> <td>客户端脚本<br /></td> </tr> </tbody> </table> <p><a name="92422450"></a></p> <h2 id="9qhcqg"><a name="9qhcqg" class="reference-link"></a><span class="header-link octicon octicon-link"></span>C.GUI渲染线程</h2><p>我们尽量采用语义化标签,而不是只会用div,span。采用语义化标签可以给css选择器的命名带来便利,无需多想创建选择器的名称。我们需要减少元素的深入层叠化。<br /><img src="https://cdn.nlark.com/yuque/0/2019/png/246174/1553842273636-ede07e8a-b389-41e3-8427-b0f3fa1dee83.png#align=left&amp;display=inline&amp;height=436&amp;name=image.png&amp;originHeight=577&amp;originWidth=287&amp;size=44058&amp;status=done&amp;width=217" alt="image.png"><br /></p> <p>为啥需要减少元素的深入层叠化呢?<br />首先每一个tab页面可以看作是浏览器内核进程,然后这个进程是多线程的,它有以上图片中的大类子线程。我们这边重点分析一下GUI渲染线层。</p> <p><img src="https://cdn.nlark.com/yuque/0/2019/png/246174/1553842788907-ceabd935-37cd-42df-a086-977f72ebc6a6.png#align=left&amp;display=inline&amp;height=146&amp;name=image.png&amp;originHeight=141&amp;originWidth=720&amp;size=60787&amp;status=done&amp;width=745" alt="image.png"></p> <p>从图中可以看的出来,总结一下</p> <pre><code class="lang-erlang">1. 解析HTML,构建DOM树 2. 解析CSS,生成CSS规则树 3. 合并DOM树和CSS规则,生成render树 4. 布局render树(Layout/reflow),负责各元素尺寸、位置的计算 5. 绘制render树(paint),绘制页面像素信息 6. 浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上 </code></pre> <p><a name="f7ec383a"></a></p> <h3 id="cobuop"><a name="cobuop" class="reference-link"></a><span class="header-link octicon octicon-link"></span>HTML解析,构建DOM树</h3><ol> <li>用HTML 解释器 将字节流解释成DOM树<br />HTML解释器的工作如下:<br /><img src="https://cdn.nlark.com/yuque/0/2019/jpeg/246174/1553843118263-14781baa-7a6c-4fbd-b2ef-34ffe5c6de9b.jpeg#align=left&amp;display=inline&amp;height=494&amp;originHeight=378&amp;originWidth=720&amp;size=0&amp;status=done&amp;width=940" alt=""><br /><em>(图片来自《Webkit技术内幕》第五章)</em><br />_解释器进行分词后,生成节点,并从节点生成DOM树。<br />那如何从“并列”的节点,生成具有层次结构的树呢?<br />解释器在构建节点属性的时候,使用了栈结构,即这样一个代码片段<div><p><span></span></p></div>,当解释到span时,此时栈中元素就是 div、p、span,当解释到</span>时,span出栈,遇到</p> p 出栈,以此类推。<br />当然,HTML解释器在工作时很有可能遇到全局的js代码!我知道此刻你要说,那就停下来执行js代码啊!<br />事实上,解释器确实是停下来了,但并不会马上执行js代码,浏览器的预扫描和预加载机制会先扫描后面的词语,如果发现有资源,那就会请求并发下载资源,然后,再执行js代码。<br />案例</li></ol> <pre><code class="lang-html">&lt;html&gt; &lt;head&gt; &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&gt; &lt;link href=&quot;style.css&quot; rel=&quot;stylesheet&quot;&gt; &lt;title&gt;Critical Path&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;p&gt;Hello &lt;span&gt;web performance&lt;/span&gt; students!&lt;/p&gt; &lt;div&gt;&lt;img src=&quot;awesome-photo.jpg&quot;&gt;&lt;/div&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> <p>浏览器是如何处理的:<br /> <img src="https://cdn.nlark.com/yuque/0/2019/png/246174/1553844143752-4a537509-13f2-41ec-937a-6989dc42a08c.png#align=left&amp;display=inline&amp;height=413&amp;name=image.png&amp;originHeight=443&amp;originWidth=800&amp;size=155949&amp;status=done&amp;width=746" alt="image.png"><br />词汇:</p> <pre><code class="lang-bash">1. Conversion转换:浏览器将获得的HTML内容(Bytes)基于他的编码转换为单个字符 2. Tokenizing分词:浏览器按照HTML规范标准将这些字符转换为不同的标记token。每个token都有自己独特的含义以及规则集 3. Lexing词法分析:分词的结果是得到一堆的token,此时把他们转换为对象,这些对象分别定义他们的属性和规则 4. DOM构建:因为HTML标记定义的就是不同标签之间的关系,这个关系就像是一个树形结构一样 例如:body对象的父节点就是HTML对象,然后段略p对象的父节点就是body对象 </code></pre> <p>最后的DOM树是什么样子的呢<br /> <img src="https://cdn.nlark.com/yuque/0/2019/png/246174/1553844234553-7febdaf3-b5f1-4927-86f4-b9ecb03363ed.png#align=left&amp;display=inline&amp;height=319&amp;name=image.png&amp;originHeight=284&amp;originWidth=665&amp;size=80494&amp;status=done&amp;width=746" alt="image.png"></p> <p><a name="d11195cb"></a></p> <h2 id="b1lqr3"><a name="b1lqr3" class="reference-link"></a><span class="header-link octicon octicon-link"></span>面试题</h2><p><strong>A 页面导入样式时,使用link和@import有什么区别?</strong><br />相同的地方,都是外部引用CSS方式,区别:</p> <ol> <li>link是xhtml标签,除了加载css外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS</li><li>link引用CSS时候,页面载入时同时加载;@import需要在页面完全加载以后加载,而且@import被引用的CSS会等到引用它的CSS文件被加载完才加载</li><li>link是xhtml标签,无兼容问题;@import是在css2.1提出来的,低版本的浏览器不支持</li><li>link支持使用javascript控制去改变样式,而@import不支持</li><li>link方式的样式的权重高于@import的权重</li><li>import在html使用时候需要<code>&lt;style type=&quot;text/css&quot;&gt;</code>标签</li></ol> <p>B <strong>简述一下你对HTML语义化的理解?</strong></p> <ol> <li>去掉或丢失样式的时候能够让页面呈现出清晰的结构。</li><li>有利于SEO和搜索引擎建立良好沟通,有助于爬虫抓取更多的信息,爬虫依赖于标签来确定上下文和各个关键字的权重。</li><li>方便其它设备解析。</li><li>便于团队开发和维护,语义化根据可读性。</li></ol> <p><a name="47dc0023"></a></p> <h2 id="5itr6g"><a name="5itr6g" class="reference-link"></a><span class="header-link octicon octicon-link"></span>文献</h2><p>1.<a rel="nofollow" href="https://www.cnblogs.com/iceflorence/p/6626187.html">https://www.cnblogs.com/iceflorence/p/6626187.html</a><br />2.<a rel="nofollow" href="https://segmentfault.com/a/1190000013311880">https://segmentfault.com/a/1190000013311880</a><br />3.<a rel="nofollow" href="https://www.jianshu.com/p/d69878549d92">https://www.jianshu.com/p/d69878549d92</a><br />4.<a rel="nofollow" href="https://zhuanlan.zhihu.com/p/30134423">https://zhuanlan.zhihu.com/p/30134423</a><br />5.<a rel="nofollow" href="https://segmentfault.com/a/1190000013662126">https://segmentfault.com/a/1190000013662126</a></p>