HTML面试题整理

doctype(⽂档类型)

告知浏览器的解析器⽤什么⽂档标准解析这个⽂档<!DOCTYPE HTML>,不同的渲染模式会影响到浏览器对于 CSS 代码甚⾄ JavaScript 脚本的解析

  • 标准模式(standards mode):⻚⾯按照 HTML 与 CSS 的定义渲染
  • 怪异模式(quirks mode)模式: 会模拟更旧的浏览器的⾏为
  • 近乎标准(almost standards)模式:会实施了⼀种表单元格尺⼨的怪异⾏为(与IE7之前的单元格布局⽅式⼀致),除此之外符合标准定义

HTML语义化

语义化从html代码来展示页面的结构,语义化的优点:

  1. 标签语义化有助于搭建良好的HTML结构,有助于搜索引擎建立索引和爬取
  2. 有利于不同设备的解析,
  3. 有利于搭建清晰的代码结构,有助于团队开发维护
H5新增标签
  • ==header== 头部、页眉
  • ==footer== 底部、页脚
  • ==hgroup==
  • ==nav== 导航区域
  • ==aside== 主要内容的附属信息部分
  • ==section== 文档中的“节”或“段”
  • ==article== 代表一个在文档,页面或者网站中自成一体的内容

cookies,sessionStorage 和 localStorage 的区别

sessionStorage 和 localStorage
  • 两者存储空间一般都在5M左右,sessionStorage在会话结束时会主动清除,localstorage则不会,需手动清除
  • 两者都有同源策略限制,跨域无法访问,sessionStorage有同标签页限制
  • 数据仅在客户端存储,不参与和服务器通信
  • 都是key value形式进行存储,value必须为字符串,如不是则自动转换成字符串,value如果是对象,需转换成JSON字符串
  • 操作方法一直,setItem(key, value)增/改、removeItem(key)删、getItem(key)查、xxxStorage.clear()清空
cookies
  • 存储大小为4k,一个站点最多20个cookies
  • 会通过http请求参与服务端的通信
  • cookie可以设定会话时间,如不设置,则默认浏览器窗口关闭清除
  • Cookie设置中有个HttpOnly参数,前端浏览器使用document.cookie是读取不到HttpOnly类型的Cookie的
项目经验
  • 小程序跳转到一个页面,保存之后goback,但无法传参,可以利用本地存储来处理

DOM事件

事件处理程序
  • HTML事件处理程序 - 通过HTML标签属性,如<p onclick='dosomethind()'></p>
  • DOM0事件处理程序 - 将事件处理放入js总,如document.getElementById("#btn").onclick = function(){...}
  • DOM1事件处理成 - 采用addEventListenter绑定事件,相同方法会覆盖
事件流机制

即元素从页面接收事件的顺序,也即事件在页面的传播顺序

事件捕获和事件冒泡
  • addEventListener的第三个参数,当为true时,捕获,false时,冒泡
  • ==事件捕获==:捕获阶段事件是由上向下依次触发
  • ==冒泡阶段==:冒泡阶段事件是由下向上依次触发
  • 项目经验:上传组件上方的浮层,可以利用冒泡实现重新上传功能
事件对象

标准的Event对象主要有6个:

  1. bubbles 布尔值,表示事件是否是冒泡类型
  2. cancelable 布尔值,表示事件是否可以取消默认动作
  3. currentTarget 当前目标元素,即添加当前事件处理程序的元素
  4. target 实际目标元素,即实际触发事件的元素
  5. type 返回当前事件的名称
  6. eventPhase 事件传播的当前阶段,1表示捕获阶段
currentTarget VS target
  • ==target==: 在事件的目标阶段,指向被单击的对象
  • ==currentTarget==: 在事件流捕获、目标及冒泡阶段,只有在目标阶段,两者相同,指向当前事件的活动对象(一般为父级)

标准Event对象的方法主要有以下几个

  1. preventDefault 通知浏览器不要执行该事件的默认动作,如阻止默认跳转、表单提交等标签默认行为
    2.stopPropagation 冒泡阶段下,阻止事件继续向上冒泡
事件委托

事件委托其实就是利用冒泡事件机制,针对多子元素绑定事件的处理方式,采用父级绑定,利用target获取到子元素并响应事件

优雅降级和渐进增强概述

  • ==优雅降级==是一开始针对高版本浏览器构建完整功能,然后针对低版本浏览器进行兼容
  • ==渐进增强==是一开始针对低版本浏览器构建,保证功能,然后在针对高级浏览器追加效果达到更好的用户体验

SEO优化(搜索引擎优化)

  • 合理设置title、description、keywords
  • HTML语义化,如H1可以放置网站重点内容
  • meta:robots 标签,==<meta name="robots" content="index,follow,archive">==
  • canoncial 和 alternate 标签
    • <link rel="canoncial" href="www.shop.com/goods/xxxx" /> 提升完全相同或高度相似的网页的权重
    • <link rel="alternate" href="https://m.xxx.com" media="only screen and (max-width: 750px)"/> 针对750px的访问另一个网址,适用于移动端跳转
  • robots.txt
  • sitemap

iframe有那些缺点

  1. iframe会阻塞主页面的onload事件
  2. 相同域iframe和主页面共享http连接池,多个相同域的iframe会阻塞加载
    • 解决方案:主页面加载完再去动态生成iframe
  3. iframe对seo不友好

iframe跨域通信

postMessage
quoteWindow.postmessage(data, origin, [transfer])
  • quoteWindow 数据接收方,常用为父级主页面,window.parent
  • data 需要发送的数据,它将会被结构化克隆算法序列化
  • origin 表示哪些窗口可以接收,*表示不受限制,URL地址表示只有该URL地址能接收事件
  • transfer 可选参数,高级用法,是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权
接收方
window.addEventListener('message',e=>{
    // 有三个重要属性
    // origin 表示发送消息的窗口源
    // data 表示发送消息的数据
    // source 表示对发送消息窗口的引用,可以用此来向发送消息的窗口返回数据
})

onload和domcontentloaded

  • onload 当页面 DOM 结构中的 js、css、图片,以及 js 异步加载的 js、css 、图片都加载完成之后,才会触发 load 事件
  • DOMContentLoaded 事件在 html文档加载完毕,并且 html 所引用的内联 js、以及外链 js 的同步代码都执行完毕后触发
    • 页面中引用的js 代码如果有异步加载的 js、css、图片,是会影响 load 事件触发的。
    • video、audio、flash 不会影响 load 事件触发

HTML文档的加载与页面的首次渲染

  1. 浏览器首选下载该地址所对应的html页面
  2. 浏览器解析html页面的DOM结构
  3. 开启下载线程对文档中的所有资源按优先级排序下载
  4. 主线程继续解析文档,到达head节点,head里的外部资源无非是外链样式表和外链js
  5. 解析到body
  • 只有DOM元素
    • DOM数构建完,页面首次渲染
  • 有DOM元素、外链js
    • 当解析到外链js的时候,该js尚未下载到本地,则js之前的DOM会被渲染到页面上,同时js会阻止后面的DOM的构建,即后面的DOM节点并不会添加到文档的DOM树中,所以,js执行完之前,我们在页面上看不到该js后面的DOM元素
  • 有DOM元素、外链js
    • 外链css不会影响css后面的DOM构建,但是会阻碍渲染,简单点说,外链css加载完之前,页面还是白屏
  • 有DOM元素、外链js、外链css
    • 外链js和外链css的顺序会影响页面渲染,当body中js之前的外链css未加载完之前,页面是不会被渲染
    • 当body中js之前的外链css加载完之后,js之前的DOM树和css合并渲染树,页面渲染出该js之前的DOM结构
  1. 文档解析完毕,页面渲染,但是页面引用的所有js同步代码执行完毕,厨房DOMContentLoaded事件
  2. html文档中的图片资源、js代码中有的异步加载的css、js、图片资源都加载完毕之后,load事件触发

src和href的区别

  • src 是指向外部资源的位置,指向的内容会嵌入到文档当前标签所在的位置,如css、js脚本、img等
  • href 是指向网络资源所在的位置(的超链接),如<a href='xxx'></a>

img的srcset和sizes

script标签中defer和async的区别

  • defer 浏览器指示脚本在文档被解析后执行,script被异步加载后并不会立即执行,而是等待文档被解析完毕后执行
    • <script type="text/javascript" src="x.min.js" defer="defer"></script>
    • defer只适用于外联脚本,如果script标签没有指定src属性,只是内联脚本,不要使用defer
    • 如果有多个声明了defer的脚本,则会按顺序下载和执行
    • defer脚本会在DOMContentLoaded和load事件之前执行
  • async 同样是异步加载脚本,区别是脚本加载完毕后立即执行,这导致async属性下的脚本是乱序的,对于script又先后依赖关系的情况,并不适用
    • <script type="text/javascript" src="x.min.js" async="async"></script>
    • 只适用于外联脚本,这一点和defer一致
    • 如果有多个声明了async的脚本,其下载和执行也是异步的,不能确保彼此的先后顺序
    • async会在load事件之前执行,但并不能确保与DOMContentLoaded的执行先后顺序

data-属性

HTML的数据属性,用于将数据存储在标准的HTML元素中作为额外信息,可以通过js访问,xxx.getAttribute("data-xxxx")

meta标签

name

name属性主要用于描述网页,比如网页的关键词、叙述等,与之对应的属性值为content,content中的内容是对name填入类型的具体描述,便于搜索引擎抓取。

<meta name="参数" content="具体的描述" >
参数 描述
keywords(关键词) 网页关键词,<meta name="keywords" content="Lxxyx,博客,文科生,前端">
description(网站内容的描述) <meta name="description" content="文科生,热爱前端与编程。目前大二,这是我的前端博客">
viewport(移动端的窗口) meta name="viewport" content="width=device-width, initial-scale=1">
robots(定义搜索引擎爬虫的索引方式)) robots用来告诉爬虫哪些页面需要索引,哪些页面不需要索引。content的参数有all,none,index,noindex,follow,nofollow。默认是all。<meta name="robots" content="none">
author(作者) <meta name="author" content="Lxxyx,80530@qq.com">
copyright(版权) <meta name="copyright" content="Lxxyx">
revisit-after(搜索引擎爬虫重访时间) 如果页面不是经常更新,为了减轻搜索引擎爬虫对服务器带来的压力,可以设置一个爬虫的重访时间。<meta name="revisit-after" content="7 days" >
renderer(双核浏览器渲染方式) <meta name="renderer" content="webkit">//默认webkit内核 <meta name="renderer" content="ie-comp"> //默认IE兼容模式 <meta name="renderer" content="ie-stand"> //默认IE标准模式
http-equiv

<meta http-equiv="参数" content="具体的描述">

  • content-Type(设定网页字符集)
<meta http-equiv="content-Type" content="text/html;charset=utf-8"> //旧的HTML,不推荐 
<meta charset="utf-8"> //HTML5设定网页字符集的方式,推荐使用UTF-8```
  • X-UA-Compatible(浏览器采取何种版本渲染当前页面)
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> //指定IE和Chrome使用最新版本渲染当前页面
  • cache-control(指定请求和响应遵循的缓存机制)
    • 用法1
    • <meta http-equiv="cache-control" content="no-cache">
    • no-cache: 先发送请求,与服务器确认该资源是否被更改,如果未被更改,则使用缓存。
    • no-store: 不允许缓存,每次都要去服务器上,下载完整的响应。(安全措施)
    • public : 缓存所有响应,但并非必须。因为max-age也可以做到相同效果
    • private : 只为单个用户缓存,因此不允许任何中继进行缓存。(比如说CDN就不允许缓存private的响应)
    • maxage : 表示当前请求开始,该响应在多久内能被缓存和重用,而不去服务器重新请求。例如:max-age=60表示响应可以再缓存和重用 60 秒
    • 用法2
    • 用于禁止当前页面在移动端浏览时,被百度自动转码。虽然百度的本意是好的,但是转码效果很多时候却不尽人意。所以可以在head中加入例子中的那句话,就可以避免百度自动转码了
    • <meta http-equiv="Cache-Control" content="no-siteapp" />
  • expires(网页到期时间) 用于设定网页的到期时间,过期后网页必须到服务器上重新传输
<meta http-equiv="expires" content="Sunday 26 October 2016 01:00 GMT" />
  • refresh(自动刷新并指向某页面) - 网页将在设定的时间内,自动刷新并调向设定的网址
<meta http-equiv="refresh" content="2;URL=http://www.lxxyx.win/"> //意思是2秒后跳转向我的博客
  • Set-Cookie(cookie设定) - 如果网页过期。那么这个网页存在本地的cookies也会被自动删除
<meta http-equiv="Set-Cookie" content="name, date"> //格式

<meta http-equiv="Set-Cookie" content="User=Lxxyx; path=/; expires=Sunday, 10-Jan-16 10:00:00 GMT"> //具体范例

img的srcset和sizes

H5中img有2个新属性,srcset、sizes,主要作用:

  • 控制响应式图片,根据屏幕大小来选择显示不同图片
  • 根据屏幕的不同(视网膜屏还是普通屏),展示不同质量的图片,合理控制下载资源
srcset
  • 格式一:图片源地址 空格 图片像素宽度[, 图片源地址 空格 图片像素宽度, ...],如
srcset="1.jpg 580w, 2.png 618w"

千万注意:描述图片的像素宽度是用'w'单位,且一定要是图片的真实像素宽度,如果私自改动,那么会影响浏览器对图片的选择!

表示图片1.jpg的像素宽度为580px,图片2.png的像素宽度为618px,两个图片源之间用逗号隔开

  • 格式二:图片源地址 空格 屏幕像素密度[, 图片源地址 空格 屏幕像素密度, ...],如
srcset="1.jpg 1x, 2.png 2x"

表示图片1.jpg为DPR为1时下显示的图片;2.png为DPR为2时显示的图片,如果没有更大的DPR设置的图片源,那么当大于当前设置的DPR最高值时,会采用当前设置的最大DPR的图片源。如这里如果屏幕DPR为3,那么还是会用2.png。

sizes

只有当设置了srcset,且单位为w时,sizes的设置才会起效。

srcset中设置的图片像素宽度('w'的值),组成了相应的半开半闭区间(a, b]。 图片的显示宽度(sizes规定的值)看落在哪个区间内,取区间中最大值对应的图片。若没有最大值(如∞),则取上个区间最大值。

<img src="4.jpg" srcset="3.jpg 229w,2.png 618w,1.jpg 1000w", sizes="300px">

上面设置图片要显示成300px(sizes里的值),在srcset里的几个临界值中形成了(0, 229px]、(229px, 618px]、(618px, 1000px]、(1000px, ∞]。300px落在了(229px, 618px]中,取最大值618,因此最终选择的图片就是2.png

sizes的语法结构:

[媒体查询 空格 ]图片显示宽度[, [媒体查询 空格 ]图片显示宽], ..., 其余条件宽度值]

sizes="(max-width: 500px) 400px, (max-width: 900px) 700px, 1200px"

在屏幕小于等于500px情况下,图片显示成400px宽;在屏幕小于等于900px情况下,图片显示成700px宽;其余情况显示成1200px宽。

sizes里的媒体查询条件顺序是很重要的,只要满足了越靠前的某个条件,那么后面的条件会被忽略的

如果sizes属性没有值,或者在有媒体条件下,其余条件宽度没有设值,那么默认是100vw

DPR的影响
<img src="4.jpg" srcset="3.jpg 229w,2.png 618w" sizes="(max-width: 600px) 114px">

srcset里的'w'符号,是代表的是图像的宽度像素,是个物理像素;sizes里的114px是表示逻辑像素!在DPR不为1时,要转化一下像素值才能去区间里比较,套用上述规则,如在DPR=2时,把114px转化为物理像素,即114px * 2 = 228px,用228px去(0, 229px]、(229px, 618px]、(618px, ∞]里做比较,落在了(0, 229px]中,取229px对应的3.jpg

哪⼀个标签能起到跟srcset相似作⽤

<picture>元素通过包含零或多个<source>元素和⼀个<img>元素来为不同的显示/设备场景提供图像版本。浏览器会选择最匹配的⼦<source>元素,如果没有匹配的,就选择<img>元素的src属性中的URL。然后,所选图像呈现在<img>元素占据的空间中

<picture>
    <source srcset="/media/examples/surfer-240-200.jpg" media="(min-width: 800px)">
    <img src="/media/examples/painted-hand-298-332.jpg" />
</picture>

html5和html4区别

  • 内容类型不变

    • HTML5的文件扩展符(html或.htm)与内容类型(text/html)保持不变。
  • DOCTYPE声明变化
    HTML4中需要指明是HTML的哪个版本,HTML5不需要,只使用<!DOCTYPE html>即可。

  • 指定字符编码变化

    • HTML4:<meta http-equiv=‶content-type″ content=‶text/html; charset=UTF-8″>
    • HTML5:<meta charset=‶UTF-8″>
  • 可以省略元素的标记

    • HTML5中很多元素标记可以省略
  • 具有boolean值的属性调整

    • 不指定属性值、属性名设定为属性值、字符串设为空时表示属性值为true
    • 不写该属性表示属性值为false
  • 新增的结构元素

    • section、artucle、aside、header、hgroup、footer、nav、figure
  • 新增的其他元素

    • video、audio、canvas
  • 新增的input元素的类型

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