# HTML5
HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
> 中文网页需要使用 `<mate charset="utf-8">` 进行声明。
## HTML5 新特性
1. 绘画 canvas。
2. 用于媒介回放的 video 和 audio 元素。
3. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失。
4. sessionStorage 的数据在浏览器关闭后自动删除。
5. 语意化更好的内容元素,比如 article、footer、header、nav、section。
6. 表单控件,calendar、date、time、email、url、search。
7.新的技术webworker, websocket, Geolocation。
## HTML5 移除的元素
1. 纯表现的元素:basefont,big,center,font, s,strike,tt,u。
2. 对可用性产生负面影响的元素:frame,frameset,noframes。
## HTML5 新元素
header, section, footer, aside, nav, main, article, figure等。
> 这些新元素都是块级元素。
> 更多新元素参考:[http://www.runoob.com/html/html5-new-element.html](http://www.runoob.com/html/html5-new-element.html)
## 添加自定义元素
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>为 HTML 添加新元素</title>
<script>
document.createElement("myHero")
</script>
<style>
myHero {
display: block;
background-color: #ddd;
padding: 50px;
font-size: 30px;
}
</style>
</head>
<body>
<myHero>我的第一个新元素</myHero>
</body>
</html>
```
## canvas
> [canvas参考手册](http://www.runoob.com/tags/ref-canvas.html)
HTML5 canvas 元素用于图形的绘制,通过脚本 (通常是 JavaScript )来完成.
canvas 标签只是图形容器,您必须使用脚本来绘制图形。
你可以通过多种方法使用 canvas 绘制路径,盒、圆、字符以及添加图像。
例如:
```javascript
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(0,0,150,75);
```
### 渐变
createLinearGradient(x,y,x1,y1) -> 创建线条渐变
createRadialGradient(x,y,r,x1,y1,r1) -> 创建一个径向/圆渐变
### 文字
font -> 定义字体和大小
fillText(text,x,y) -> 在 canvas 上绘制实心的文本
strokeText(text,x,y) -> 在 canvas 上绘制空心的文本font - 定义字体
fillText(text,x,y) -> 在 canvas 上绘制实心的文本
strokeText(text,x,y) -> 在 canvas 上绘制空心的文本
### 路径(直线)
moveTo(x,y) 定义线条开始坐标。
lineTo(x,y) 定义线条结束坐标。
### 图像
drawImage(image,x,y)
## SVG
SVG 指可伸缩矢量图形 (Scalable Vector Graphics)。
SVG 用于定义用于网络的基于矢量的图形。
SVG 使用 XML 格式定义图形。
SVG 图像在放大或改变尺寸的情况下其图形质量不会有损失。
SVG 是万维网联盟的标准。
### SVG优势
与其他图像格式相比(比如 JPEG 和 GIF),使用 SVG 的优势在于:
- SVG 图像可通过文本编辑器来创建和修改
- SVG 图像可被搜索、索引、脚本化或压缩
- SVG 是可伸缩的
- SVG 图像可在任何的分辨率下被高质量地打印
- SVG 可在图像质量不下降的情况下被放大
### svg 标签
```html
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
<polygon points="100,10 40,180 190,60 10,60 160,180"
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;">
</svg>
```
### SVG 与 Canvas两者间的区别
SVG 是一种使用 XML 描述 2D 图形的语言。
Canvas 通过 JavaScript 来绘制 2D 图形。
SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。
在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。
Canvas 是逐像素进行渲染的。在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。
## MathML
> [参考文章](http://www.runoob.com/html/html5-mathml.html)
## 拖放(drag & drop)
> [参考文章](http://www.runoob.com/html/html5-draganddrop.html)
## 更多类型的 input
> [参考文章](http://www.runoob.com/html/html5-form-input-types.html)
## Page Visibility API
### document.hidden
返回表示页面是否隐藏的布尔值。
### document.visibilityState
有下面 4 个可能状态的值:
1. hidden:页面在后台标签页中或者浏览器最小化
2. visible:页面在前台标签页中
3. prerender:页面在屏幕外执行预渲染处理 document.hidden 的值为 true
4. unloaded:页面正在从内存中卸载
### Visibilitychange事件
当文档从可见变为不可见或者从不可见变为可见时,会触发该事件。
这样,我们可以监听 Visibilitychange 事件,当该事件触发时,获取 document.hidden 的值,根据该值进行页面一些事件的处理。
## 离线存储
在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
离线的情况下,浏览器就直接使用离线存储的资源。
## HTML5 兼容
1. IE8/IE7/IE6支持通过 document.createElement 方法产生的标签,
可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式。
2. 直接使用成熟的框架、比如 [html5shim](https://www.bootcdn.cn/html5shiv/)。
例如:
```html
<!--[if lt IE 9]>
<script>src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
```
> 以上代码是一个注释,作用是在 IE 浏览器的版本小于 IE9 时将读取 html5.js 文件,并解析它。另外,以上代码必须放在 head 中。
## 如何区分HTML5
- DOCTYPE声明
- 新增的结构元素
- 功能元素
- 1. HTML
- 1.1 HTML 标签
- 1.2 HTML 属性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 综合知识
- 5.1 HTTP
- 5.2 websocket
- 5.3 综合问题集合
- 5.4 前端优化
- 6. 附加知识
- 6.1 TCP/IP
- 6.2 数据结构
- 6.3 前端开发
- 7. 相关工具
- 7.1 Git
- 7.2 调试
- 7.3 Linux
- 8. 其他需要了解的内容
- 8.1 Python3
- 8.2 Java
- 8.3 数据库