HTML面试题
本文最后更新于:2022年6月1日 下午
HTML5 新特性
移除
纯表现的元素/可以用css实现的元素:
basefont,big,center,font,s,strike对可用性产生负面影响的元素:
frame,frameset语意化更好的标签,比如
header,nav,section,article,footer,aside增强了
input类型:color,date,datetime-local,range,tel,search,url新的表单元素:
datalist,progress,meter,output,keygen表单校验(数据格式,数据范围,占位符,必填等)
canvasAPI和内联svgaudio/video音视频元素manifestweb应用离线缓存地理定位
geolocationAPIwebworker将JS计算交给后台线程websocket全双工的支持服务端推送的持久化连接协议webStorage:
localStorage sessionStoragehistoryAPI
HTML5 哪些标签可以做 SEO
title、meta、header、footer、nav、article、aside
meta元数据标签
charset字符编码keywords关键词和爬虫viewportscale页面缩放CSP内容安全策略
HTML5 的离线存储
在用户没有联网时,可以正常访问站点或应用;在联网的情况下,更新用户机器上的缓存文件。
- 页面头部加入一个 manifest 的属性
- 在 cache.manifest 文件的编写离线存储的资源
- 在离线状态下,操作 window.applicationCache 进行需求实现
浏览器是如何对 HTML5 的离线存储资源进行管理和加载的
在线的情况下,浏览器发现 HTML 头部有 manifest 属性,它会请求 manifest 文件,如果是第一次访问 app,浏览器会根据 manifest 文件的内容下载相应的资源并且进行离线存储。
如果已经访问过 app,并且资源已经离线存储,浏览器会使用离线的资源加载页面,然后浏览器会对比新的 manifest 文件,如果文件没有发生改变,就不做任何操作,否则就会重新下载文件中的资源并进行离线存储。
离线的情况下,浏览器直接使用离线存储的资源。
盒模型
HTML 文档中的每个元素都使用一个矩形盒子来描述其占用空间,这个模型称为盒模型。盒模型包含四个区域:margin(外边距),border(边框),padding(内边距),content(内容区域)
outline和box-shadow都会从margin box区域开始计算
标准模型和 IE 模型
- 标准模型
box-sizing:content-box,对其设置宽高只作用于content box区域 - ie 模型
box-sizing:border-box,对其设置宽高会作用于content box,padding box和border box区域
块级元素
display block
独占一行
可以设置 width,height,margin,padding,border 属性
默认宽度是容器的 100%
article; // h5
div;
header; // h5
section; // h5
address; // h5
ol;
ul;
aside; // h5
footer; // h5
audio; // h5
video; // h5
canvas; // h5
hgroup; // h5
p;
h1 - h6;
table;
form;行内元素
display inline
- 行内排列
- 不能设置
width、height,默认高度和宽度就是内容的高度和宽度 - 可以设置
margin-left/right,无法设置margin-top\bottom border和padding可以设置,但是border-top和padding-top到页面顶部后就不再增加
img; //可以设置宽高
span;
label;
strong;
a;
input; //可以设置宽高
select; //可以设置宽高
textarea; //可以设置宽高行内块元素
display line-block
在行内排列的块级元素
// 兼容
div {
display: inline-block;
zoom: 1; //在IE下触发hasLayout
display:inline;//一旦触发了hasLayout设置display:inline和display:block效果相似。
}DOM元素的尺寸和位置
HTMLElement.style【只能获取内联样式】window.getComputedStyle(HTMLElement)【获取包含所有样式属性的对象HTMLElement.getBoundingClientRect()【描绘元素为相对窗口的矩形盒子】HTMLElement.offsetWidth/offsetHeight【content+padding+border+scrollbar】HTMLElement.clientWidth/clientHeight【content+padding】HTMLElement.scrollWidth/scrollHeight// 【包含滚出可是区域部分的clientWidth/clientHeight】HTMLElement.scrollTop// 【从元素的左上角开始,滚动出元素的上半部分的 width/height】
!滚动到底
ele.scrollHeight - ele.scrollTop === ele.clientHeight
!元素进入可视范围(懒加载)
要加载元素的.offsetTop - 容器.scrollTop <= document.documentElement.clientHeight
要加载元素getBoundingClientRect()后的top <= document.documentElement.clientHeight
!js获取这些属性会触发重排
BFC
(Block Formatting Context) 块级格式化上下文,是一个对块级盒子的布局及浮动相互影响有特殊规则的区域
特性
一句话就是BFC内外不会互相影响。。。
BFC内盒子之间会发生外边距合并
BFC内浮动元素参与高度计算(高度塌陷)
BFC内盒子不会超出BFC边界(浮动覆盖)
下列方式会创建BFC:
- 根元素
HTML - 浮动元素:
float不为none - 绝对定位元素:
position为absolute或fixed overflow不为visibledisplay为flow-root- 行内块元素
display为inline-block - 弹性元素
display为flex或inline-flex元素的直接子元素 - 网格元素
display为grid或inline-grid元素的直接子元素 - 表格元素
display为table``table-cell或table-xxx等匿名表格元素
- 根元素
清除浮动
- 用父元素伪类清除浮动
/* 通用 */
.clearfather:after {
content: "";
clear: both;
display: block;
height: 0;
overflow: hidden;
}
.clearfather {
*zoom: 1; /* ie6/7 */
}- 空 div 清除浮动
.clearfloat {
clear: both;
}- 父元素 BFC
设置能触发 BFC 的属性均可
超链接伪类顺序
被点击访问过的超链接样式不在具有 hover 和 active 了解决方法是改变 CSS 属性排列顺序: L-V-H-A
a:link {
}
a:visited {
}
a:hover {
}
a:active {
}优雅降级和渐进增强
_优雅降级_:Web 站点在所有新式浏览器中都能正常工作,如果用户使用的是旧式浏览器,则代码会针对旧版本的 IE 进行降级处理,使之在旧式浏览器上以某种形式降级体验而不至于完全不能使用。
_渐进增强_:从被所有浏览器支持的基本功能开始,逐步地添加那些只有新版本浏览器才支持的功能,向页面增加不影响基础浏览器的额外样式和功能。当浏览器支持时,它们会自定地呈现出来并发挥作用。
常见空 VOID 元素
br、hr、img、input、link、meta
window.onLoad 和 DOMContentLoaded 的区别
window.onLoad当整个页面及所有依赖资源如样式表和图片都已完成加载时,将触发load事件。DOMContentLoaded仅当HTML和内联外联js脚本加载并同步代码都执行完。
visibilityState
通过visibilityState的值检测页面当前是否可见,以及打开页面的时间等
在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放
外边距重叠
- 同层相邻块级元素之间外边距重叠
- 子元素与父元素的外边距重叠
- 空元素(margin-top直接贴到margin-bottom时)
link 和@import 有什么区别
link是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS ,rel和图标等;@import只能加载 CSS。link支持并行下载;@import串行下载且需放在样式表顶层。@import是在 CSS2.1 提出的,低版本的浏览器(IE5 以下)不支持。link支持使用 Javascript 控制 DOM 去改变样式;而@import不支持。