美文网首页
html知识点整理

html知识点整理

作者: 秋枫残红 | 来源:发表于2022-03-16 20:12 被阅读0次

    1. DOCTYPE 的作用是什么?

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

    html5

    <!DOCTYPE html>
    

    html4(需要指定dtd)

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    

    2. 标准模式与兼容模式

    在W3C标准出来之前,浏览器对页面的渲染没有统一的标准,各个浏览器对同一页面的渲染有一定的差异,而每个浏览器的不同版本对页面的渲染也有一定程度上的差异。而W3C标准出来之后,浏览器对页面的渲染就有了统一的标准。前者对于浏览器使用自己的方式渲染页面的模式,我们称之为兼容模式或怪异模式;而对于后者浏览器按照标准解析执行代码的模式,我们称之为标准模式或严格模式

    在标准模式中,浏览器根据规范呈现页面;

    在兼容模式中,页面以一种比较宽松的向后兼容的方式显示。

    3. 有关DTD

    DTD( Document Type Definition 文档类型定义)是一组机器可读的规则,它们定义 XML 或 HTML 的特定版本中所有允许元素及它们的属性和层次关系的定义。换言之他会告诉浏览器这份文档是html,而不是其他文本标记语言

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

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

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

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

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

    5. 为什么HTML5 doctype不用引入DTD

    HTML 4.01 中的 doctype 需要对 DTD 进行引用,因为 HTML 4.01 基于 SGML。
    而 HTML 5 不基于 SGML,因此不需要对 DTD 进行引用,但是需要 doctype 来规范浏览器的行为。
    其中,SGML是标准通用标记语言,简单的说,就是比HTML,XML更老的标准,这两者都是由SGML发展而来的。
    BUT,HTML5不是的。

    6. HTML的元素分类

    html4将元素主要分为行内元素(inline)和块级元素(block)

    区别:

    1. 格式上行内元素不会以新行还是,块级元素会重启一行
    2. 内容上行内元素只可以包含行内元素及文本,而块级元素可以包含行内元素及块级元素
    3. 元素属性上主要体现在盒模型,行内元素设置width,height无效,margin和padding的上下不会对其他元素产生影响

    在实际开发中,我们还会用到inline-block的属性,这种对外呈现inline(格式上不会重起一行),属性上呈现block,可以设置宽高

    常见的块级元素有:div,p,ul,li...

    常见的行内元素有:a,b,span,em,sup...

    html5的将元素分为元数据内容(metadata)、流式内容(Flow)、章节内容(sectioning)、标题内容(heading)、短语内容(phrasing)、嵌入内容(embedded)、交互式内容(Interactive)七种

    元数据内容被定义用于设置其他内容的呈现或行为,或设置与其他文档的关系

    base link meta noscript script style template title

    流式内容指可以放在body中,用于组织文档结构的元素

    a abbr address area (如果是 map 元素的后代)article aside audio b bdi bdo blockquote br 
    button canvas cite code data datalist del details dfn dialog div dl em embed fieldset 
    figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr i iframe img input ins kbd label 
    link (如果 在 body 中允许)main map mark MathML math menu meta (如果 itemprop 属性存在)
    meter nav noscript object ol output p picture pre progress q ruby s samp script section 
    select slot small span strong sub supSVG svg table template textarea time u ul var video
    

    章节内容指用于定义内容区域的元素

    article aside nav section
    

    标题内容指用于定义章节标题的元素

    h1 h2 h3 h4 h5 h6 hgroup
    

    短语内容指行内形式展示的元素

    a abbr area (如果是 map 元素的后代)audio b bdi bdo br button canvas cite code data datalist 
    del dfn em embed i iframe img input ins kbd label link(如果 在 body 中允许)map mark MathML 
    math meta (如果 itemprop 属性存在)meter noscript object output picture progress q ruby s 
    samp script select slot small span strong sub sup SVG svg template textarea time u var video 
    

    嵌入内容是指需要引入其他资源的元素

    audio canvas embed iframe img MathML math object picture SVG svg video
    

    交互式内容是指会和用户尝试交互行为的元素

    a(如果 href 属性存在)audio(如果 controls 属性存在) button details embed iframe
    img(如果 usemap 属性存在)input(如果type属性存在)label object(如果 usemap 属性
    存在)select textarea video(如果 controls 属性存在)
    

    他们之间的关系如下

    image

    7. 有关link

    • link定义文档与外部资源的关系
    • link是空元素,在开始标签中关闭,没有结束标签
    • link一般存在于head中,可以出现任意次数,通常用来加载外部样式表

    8. link和@import的区别

    • @import是css提供的语法规则,只可以引入样式表,link是html标签,除了css文件,还可以引入其他文件
    • 加载顺序不同,link引入的文件会被同时加载,而@import引入的文件会在页面加载完毕后再进行加载
    • 兼容性问题,@import是css2.1的语法,故只可在 IE5+ 才能识别;link 标签作为 HTML 元素,不存在兼容性问题。
    • DOM可控性的区别,可以通过JS操作DOM插入link标签来改变样式,由于dom是基于文档的,没法使用@import的防范插入样式

    9. 浏览器

    浏览器的主要功能是将用户选择的 web 资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是 HTML,也包括 PDF、image 及其他格式。用户用 URI(Uniform Resource Identifier 统一资源标识符)来指定所请求资源的位置。

    HTML 和 CSS 规范中规定了浏览器解释 html 文档的方式,由 W3C 组织对这些规范进行维护。

    但是浏览器厂商纷纷开发自己的扩展,对规范的遵循并不完善,这为 web 开发者带来了严重的兼容性问题。

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

    10. 浏览器内核

    分类

    浏览器内核主要分为两个部分:渲染引擎JS引擎

    渲染引擎的职责就是渲染,即在窗口中展示请求到的内容,默认情况下可以展示html、xml、图片,安装插件后可以展示其他内容,如pdf

    JS引擎的职责就是解析与执行JS代码,实现网页的动态效果

    最开始渲染引擎和JS引擎并没有很明确的区分,后来JS引擎越来越独立,内核就倾向于单指渲染引擎

    常见的浏览器内核有以下几种:

    Trident:这种浏览器内核是 IE 浏览器用的内核,因为在早期 IE 占有大量的市场份额,所以这种内核比较流行,以前有很多网页也是根据这个内核的标准来编写的,但是这个内核对真正的网页标准支持不是很好,和 W3C 标准脱节比较严重。

    Gecko:这是 Firefox 和 Flock 所采用的内核,这个内核的优点是功能强大,可以支持很多复杂的网页和浏览器扩展接口,但代价是要消耗更多的资源,比如内存

    Presto:这是Oprea曾经采用的内核,优点是网页解析速度很快,在解析JS代码时会比其他内核快出2~3倍,但缺点是为了性能,丢掉了一部分网页兼容性

    Webkit:这是sefari采用的内核,他的优点是·速度也很快,虽不如Presto,但也远超Gecko和trident,缺点是对网页代码的兼容性不高,会使得一些不标准的写法无法正确显示

    Blink:这是谷歌自研的一个引擎,内置于chrome浏览器中,但实际可视为是webkit的一个分支

    常见浏览器所使用的内核

    IE:Trident内核,也成为IE内核

    Chrome:以前是webkit,现在是blink

    Firefox:Gecko

    Safari:webkit

    Oprea:最初是presto,后来是webkit,现在是blink

    360、猎豹:IE+chrome双内核

    11. 浏览器的渲染原理

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

    2. 对 CSS 进行解析,生成 CSSOM 规则树。

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

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

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

    值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html 都解析完成之后再去构建和布局 render 树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。由于JS可以改变CSS属性和DOM节点,因此CSS的解析是会阻塞JS的解析,所以CSSSOM规则树生成前,是不会执行JS的。

    12. 渲染过程中遇到JS文件怎么处理

    JavaScript 的加载、解析与执行会阻塞文档的解析,也就是说,在构建 DOM 时,HTML 解析器若遇到了 JavaScript,那么它会暂停文档的解析,将控制权移交给 JavaScript 引擎,等 JavaScript 引擎运行完毕,浏览器再从中断的地方恢复继续解析文档。

    也就是说,如果你想首屏渲染的越快,就越不应该在首屏就加载 JS 文件,这也是都建议将 script 标签放在 body 标签底部的原因。当然在当下,并不是说 script 标签必须放在底部,因为你可以给 script 标签添加 defer 或者 async 属性。

    13. CSS文件如何阻塞文档解析

    理论上,既然样式表不改变 DOM 树,也就没有必要停下文档的解析等待它们,然而,存在一个问题,JavaScript 脚本执行时可能在文档的解析过程中请求样式信息,如果样式还没有加载和解析,脚本将得到错误的值,显然这将会导致很多问题。

    所以如果浏览器尚未完成 CSSOM 的下载和构建,而我们却想在此时运行脚本,那么浏览器将延迟 JavaScript 脚本执行和文档的解析,直至其完成 CSSOM 的下载和构建。也就是说,在这种情况下,浏览器会先下载和构建 CSSOM,然后再执行 JavaScript,最后再继续文档的解析。

    14. async 和 defer 的作用是什么?有什么区别?

    1. 脚本没有 defer 或 async,浏览器会立即加载并执行指定的脚本,也就是说不等待后续载入的文档元素,读到就加载并执行。

    2. defer 属性表示延迟执行引入的 JavaScript,即这段 JavaScript 加载时 HTML 并未停止解析,这两个过程是并行的。当整个 document 解析完毕后再执行脚本文件,在 DOMContentLoaded 事件触发之前完成。多个脚本按顺序执行。

    3. async 属性表示异步执行引入的 JavaScript,与 defer 的区别在于,如果已经加载好,就会开始执行,也就是说它的执行仍然会阻塞文档的解析,只是它的加载过程不会阻塞。多个脚本的执行顺序无法保证。

    15. 什么是文档的预解析

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

    16. 渲染页面时常见哪些不良现象

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

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

    17. 如何优化关键渲染路径

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

    (1)关键资源的数量。
    (2)关键路径长度。
    (3)关键字节的数量。

    关键资源是可能阻止网页首次渲染的资源。这些资源越少,浏览器的工作量就越小,对 CPU 以及其他资源的占用也就越少。

    同样,关键路径长度受所有关键资源与其字节大小之间依赖关系图的影响:某些资源只能在上一资源处理完毕之后才能开始下载,并且资源越大,下载所需的往返次数就越多。

    最后,浏览器需要下载的关键字节越少,处理内容并让其出现在屏幕上的速度就越快。要减少字节数,我们可以减少资源数(将它们删除或设为非关键资源),此外还要压缩和优化各项资源,确保最大限度减小传送大小。

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

    (1)对关键路径进行分析和特性描述:资源数、字节数、长度。
    (2)最大限度减少关键资源的数量:删除它们,延迟它们的下载,将它们标记为异步等。
    (3)优化关键字节数以缩短下载时间(往返次数)。
    (4)优化其余关键资源的加载顺序:您需要尽早下载所有关键资产,以缩短关键路径长度。

    18. 重绘与回流

    重绘: 当渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观、风格,而不会影响布局的操作,比如 background-color,我们将这样的操作称为重绘。

    回流:当渲染树中的一部分(或全部)因为元素的规模尺寸、布局、隐藏等改变而需要重新构建的操作,会影响到布局的操作,这样的操作我们称为回流。

    常见引起回流属性和方法:

    任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流。

    (1)添加或者删除可见的 DOM 元素;
    (2)元素尺寸改变——边距、填充、边框、宽度和高度
    (3)内容变化,比如用户在 input 框中输入文字
    (4)浏览器窗口尺寸改变——resize事件发生时
    (5)计算 offsetWidth 和 offsetHeight 属性
    (6)设置 style 属性的值
    (7)当你修改网页的默认字体时。

    回流必定会发生重绘,重绘不一定会引发回流。回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流。

    常见引起重绘的属性和方法:

    image

    常见引起回流的属性和方法

    image

    如何减少回流

     (1)使用 transform 替代 top
    
     (2)不要把节点的属性值放在一个循环里当成循环里的变量
    
     (3)不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局
    
     (4)把 DOM 离线后修改。如:使用 documentFragment 对象在内存里操作 DOM
    
     (5)不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css 的 class,然后修改 DOM 的 className
    

    19. 为什么操作 DOM 慢

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

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

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

    Load 事件是当所有资源加载完成后触发的。

    21. 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;

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

    有成熟的框架可以处理,如html5shiv

    22. 对 HTML 语义化的理解?

    相关知识点:

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

    回答:

    我认为 html 语义化主要指的是我们应该使用合适的标签来划分网页内容的结构。html 的本质作用其实就是定义网页文档的结构,一个语义化的文档,能够使页面的结构更加清晰,易于理解。这样不仅有利于开发者的维护和理解,同时也能够使机器对文档内容进行正确的解读。比如说我们常用的 b 标签和 strong 标签,它们在样式上都是文字的加粗,但是 strong 标签拥有强调的语义。对于一般显示来说,可能我们看上去没有差异,但是对于机器来说,就会有很大的不同。如果用户使用的是屏幕阅读器来访问网页的话,使用 strong 标签就会有明显的语调上的变化,而 b 标签则没有。如果是搜索引擎的爬虫对我们网页进行分析的话,那么它会依赖于 html 标签来确定上下文和各个关键字的权重,一个语义化的文档对爬虫来说是友好的,是有利于爬虫对文档内容解读的,从而有利于我们网站的 SEO 。从 html5 我们可以看出,标准是倾向于以语义化的方式来构建网页的,比如新增了 header 、footer 这些语义标签,删除了 big 、font 这些没有语义的标签。
    

    23. b 与 strong 的区别和 i 与 em 的区别?

    从页面显示效果来看,被 <b> 和 <strong> 包围的文字将会被加粗,而被 <i> 和 <em> 包围的文字将以斜体的形式呈现。但是 <b> <i> 是自然样式标签,分别表示无意义的加粗,无意义的斜体,表现样式为 { font-weight: bolder},仅仅表示「这里应该用粗体显示」或者「这里应该用斜体显示」,此两个标签在 HTML4.01 中并不被推荐使用。而 <em> 和 <strong> 是语义样式标签。 <em> 表示一般的强调文本,而 <strong> 表示比 <em> 语义更强的强调文本。使用阅读设备阅读网页时:<strong> 会重读,而 <b> 是展示强调内容。

    24. 前端需要注意哪些 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)提高网站速度:网站速度是搜索引擎排序的一个重要指标

    25. 浏览器端的存储技术

    浏览器常见的存储技术有 cookie、localStorage 和 sessionStorage

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

    存储大小:
        cookie 数据大小不能超过4 k 。
        sessionStorage 和 localStorage 虽然也有存储大小的限制,但比 cookie 大得多,可以达到 5M 或更大。
    有期时间:
        localStorage    存储持久数据,浏览器关闭后数据不丢失除非主动删除数据。
        sessionStorage  数据在页面会话结束时会被清除。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。在新标签或窗口打开一个页面时会在顶级浏览上下文中初始化一个新的会话。
        cookie          设置的 cookie 过期时间之前一直有效,即使窗口或浏览器关闭。
      
     作用域:
         sessionStorage  只在当前会话中共享。
         localStorage    在所有同源窗口中都是共享的。
         cookie          在所有同源窗口中都是共享的。
    

    26. iframe 有那些缺点

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

    主要缺点有:

    (1) iframe 会阻塞主页面的 onload 事件。window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 src 可以避免这种阻塞情况。
    (2) 搜索引擎的检索程序无法解读这种页面,不利于网页的 SEO 。
    (3) iframe 和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
    (4) 浏览器的后退按钮失效。
    (5) 小型的移动设备无法完全显示框架。

    27. Label 的作用是什么?是怎么用的?

     label 标签来定义表单与控制之间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。
    
     <label for="Name">Number:</label>
     <input type=“text“ name="Name" id="Name"/>
    

    28. HTML5 的 form 的自动完成功能是什么?

    autocomplete 属性规定输入字段是否应该启用自动完成功能。默认为启用,设置为 autocomplete=off 可以关闭该功能。自动完成允许浏览器预测对字段的输入。当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项。
    autocomplete 属性适用于 <form>,以及下面的 <input> 类型:text, search, url, telephone, email, password, datepickers, range 以及 color

    29. 如何实现浏览器内多个标签页之间的通信?

    相关资料:

     (1)使用 WebSocket,通信的标签页连接同一个服务器,发送消息到服务器后,服务器推送消息给所有连接的客户端。
    
     (2)使用 SharedWorker (只在 chrome 浏览器实现了),两个页面共享同一个线程,通过向线程发送数据和接收数据来实现标签页之间的双向通行。
    
     (3)可以调用 localStorage、cookies 等本地存储方式,localStorge 另一个浏览上下文里被添加、修改或删除时,它都会触发一个 storage 事件,我们通过监听 storage 事件,控制它的值来进行页面信息通信;
    
     (4)如果我们能够获得对应标签页的引用,通过 postMessage 方法也是可以实现多个标签页通信的。
    

    回答:

     实现多个标签页之间的通信,本质上都是通过中介者模式来实现的。因为标签页之间没有办法直接通信,因此我们可以找一个中介者,让标签页和中介者进行通信,然后让这个中介者来进行消息的转发。
    
     第一种实现的方式是使用 websocket 协议,因为 websocket 协议可以实现服务器推送,所以服务器就可以用来当做这个中介者。标签页通过向服务器发送数据,然后由服务器向其他标签页推送转发。
    
     第二种是使用 ShareWorker 的方式,shareWorker 会在页面存在的生命周期内创建一个唯一的线程,并且开启多个页面也只会使用同一个线程。这个时候共享线程就可以充当中介者的角色。标签页间通过共享一个线程,然后通过这个共享的线程来实现数据的交换。
    
     第三种方式是使用 localStorage 的方式,我们可以在一个标签页对 localStorage 的变化事件进行监听,然后当另一个标签页修改数据的时候,我们就可以通过这个监听事件来获取到数据。这个时候 localStorage 对象就是充当的中介者的角色。
    
     还有一种方式是使用 postMessage 方法,如果我们能够获得对应标签页的引用,我们就可以使用 postMessage 方法,进行通信。
    

    30. 页面可见性(Page Visibility API) 可以有哪些用途?

    这个新的 API 的意义在于,通过监听网页的可见性,可以预判网页的卸载,还可以用来节省资源,减缓电能的消耗。比如,一旦用户不看网页,下面这些网页行为都是可以暂停的。

    (1)对服务器的轮询
    (2)网页动画
    (3)正在播放的音频或视频

    31. 如何在页面上实现一个圆形的可点击区域?

    (1)纯 html 实现,使用 <area> 来给 <img> 图像标记热点区域的方式,<map> 标签用来定义一个客户端图像映射,<area> 标签用来定义图像映射中的区域,area 元素永远嵌套在 map 元素内部,我们可以将 area 区域设置为圆形,从而实现可点击的圆形区域。

    (2)纯 css 实现,使用 border-radius ,当 border-radius 的长度等于宽高相等的元素值的一半时,即可实现一个圆形的点击区域。

    (3)纯 js 实现,判断一个点在不在圆上的简单算法,通过监听文档的点击事件,获取每次点击时鼠标的位置,判断该位置是否在我们规定的圆形区域内。

    32. 实现不使用 border 画出 1 px 高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。

      <div style="height:1px;overflow:hidden;background:red"></div>
    

    33. title 与 h1 的区别?

    title 属性没有明确意义只表示是个标题,h1 则表示层次明确的标题,对页面信息的抓取也有很大的影响。

    34. Img 的 title 和 alt 有什么区别?

    title 通常当鼠标滑动到元素上的时候显示
    alt 是 <img> 的特有属性,是图片内容的等价描述,用于图片无法加载时显示、读屏器阅读图片。可提图片高可访问性,除了纯装饰图片外都必须设置有意义的值,搜索引擎会重点分析。

    35. Canvas 和 SVG 有什么区别?

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

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

    36. 渐进增强和优雅降级的定义

    渐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

    优雅降级:一开始就根据高版本浏览器构建完整的功能,然后再针对低版本浏览器进行兼容。

    37. attribute 和 property 的区别是什么?

    attribute 是 dom 元素在文档中作为 html 标签拥有的属性;
    property 就是 dom 元素在 js 中作为对象拥有的属性。
    对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的,
    但是对于自定义的属性来说,他们是不同步的。

    38. 对 web 标准、可用性、可访问性的理解

    可用性(Usability):产品是否容易上手,用户能否完成任务,效率如何,以及这过程中用户的主观感受可好,是从用户的角度来看产品的质量。可用性好意味着产品质量高,是企业的核心竞争力

    可访问性(Accessibility):Web 内容对于残障用户的可阅读和可理解性

    可维护性(Maintainability):一般包含两个层次,一是当系统出现问题时,快速定位并解决问题的成本,成本低则可维护性好。二是代码是否容易被人理解,是否容易修改和增强功能。

    39. head 标签中必不少的是?

     <head> 标签用于定义文档的头部,它是所有头部元素的容器。<head> 中的元素可以引用脚本、指示浏览器在哪里找到样式表、提供元信息等等。
     文档的头部描述了文档的各种属性和信息,包括文档的标题、在 Web 中的位置以及和其他文档的关系等。绝大多数文档头部包含的数据都不会真正作为内容显示给读者。
     下面这些标签可用在 head 部分:<base>, <link>, <meta>, <script>, <style>, 以及 <title>。
     <title> 定义文档的标题,它是 head 部分中唯一必需的元素。
    

    40. HTML5 新增的表单元素有?

     datalist 规定输入域的选项列表,通过 option 创建! 
     
     keygen 提供一种验证用户的可靠方法,密钥对生成器,私钥存于客户端,公钥发到服务器,用于之后验证客户端证书!
     
     output 元素用于不同类型的输出!
    

    <title> 定义文档的标题,它是 head 部分中唯一必需的元素。

    41. 前端性能优化?

     前端性能优化主要是为了提高页面的加载速度,优化用户的访问体验。我认为可以从这些方面来进行优化。
    
     第一个方面是页面的内容方面
    
     (1)通过文件合并、css 雪碧图、使用 base64 等方式来减少 HTTP 请求数,避免过多的请求造成等待的情况。
    
     (2)通过 DNS 缓存等机制来减少 DNS 的查询次数。
    
     (3)通过设置缓存策略,对常用不变的资源进行缓存。
    
     (4)使用延迟加载的方式,来减少页面首屏加载时需要请求的资源。延迟加载的资源当用户需要访问时,再去请求加载。
    
     (5)通过用户行为,对某些资源使用预加载的方式,来提高用户需要访问资源时的响应速度。
    
     第二个方面是服务器方面
    
     (1)使用 CDN 服务,来提高用户对于资源请求时的响应速度。
    
     (2)服务器端启用 Gzip、Deflate 等方式对于传输的资源进行压缩,减小文件的体积。
    
     (3)尽可能减小 cookie 的大小,并且通过将静态资源分配到其他域名下,来避免对静态资源请求时携带不必要的 cookie
    
     第三个方面是 CSS 和 JavaScript 方面
    
     (1)把样式表放在页面的 head 标签中,减少页面的首次渲染的时间。
    
     (2)避免使用 @import 标签。
    
     (3)尽量把 js 脚本放在页面底部或者使用 defer 或 async 属性,避免脚本的加载和执行阻塞页面的渲染。
    
     (4)通过对 JavaScript 和 CSS 的文件进行压缩,来减小文件的体积。
    

    42. 扫描二维码登录网页是什么原理,前后两个事件是如何联系的?

     核心过程应该是:浏览器获得一个临时 id,通过长连接等待客户端扫描带有此 id 的二维码后,从长连接中获得客户端上报给 server的帐号信息进行展示。并在客户端点击确认后,获得服务器授信的令牌,进行随后的信息交互过程。在超时、网络断开、其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程形成有效的安全防护。
    
     我的理解
    
     二维码登录网页的基本原理是,用户进入登录网页后,服务器生成一个 uid 来标识一个用户。对应的二维码对应了一个对应 uid 的链接,任何能够识别二维码的应用都可以获得这个链接,但是它们没有办法和对应登录的服务器响应。比如微信的二维码登录,只有用微信识这个二维码才有效。当微信客户端打开这个链接时,对应的登录服务器就获得了用户的相关信息。这个时候登录网页根据先前的长连接获取到服务器传过来的用户信息进行显示。然后提前预加载一些登录后可能用到的信息。当客户端点击确认授权登陆后,服务器生成一个权限令牌给网页,网页之后使用这个令牌进行信息的交互过程。由于整个授权的过程都是在手机端进行的,因此能够很好的防止 PC 上泛滥的病毒。并且在超时、网络断开、其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程能够形成有效的安全防护。
    

    43. Html 规范中为什么要求引用资源不加协议头http或者https

     如果用户当前访问的页面是通过 HTTPS 协议来浏览的,那么网页中的资源也只能通过 HTTPS 协议来引用,否则浏览器会出现警告信息,不同浏览器警告信息展现形式不同。为了解决这个问题,我们可以省略 URL 的协议声明,省略后浏览器照样可以正常引用相应的资源,这项解决方案protocol-relative URL,暂且可译作协议相对 URL。
    如果使用协议相对 URL,无论是使用 HTTPS,还是 HTTP 访问页面,浏览器都会以相同的协议请求页面中的资源,避免弹出类似的警告信息,同时还可以节省5字节的数据量。
    

    相关文章

      网友评论

          本文标题:html知识点整理

          本文链接:https://www.haomeiwen.com/subject/ogtmdrtx.html