# HTML5 全面解析
## 目录
1. [HTML5 简介](#1-html5-简介)
2. [基本标签](#2-基本标签)
3. [新特性](#3-新特性)
4. [本地存储](#4-本地存储)
5. [总结](#5-总结)
---
## 1. HTML5 简介
HTML5 是 HTML 的第五个主要版本,2014年由 W3C 正式发布。主要特性包括:
- 语义化标签
- 多媒体支持
- 图形绘制(Canvas/SVG)
- 本地存储能力
- Web Workers
- 地理位置
- WebSocket
---
## 2. 基本标签
### 2.1 文档结构
```html
文档标题
标签 | 描述 |
---|---|
|
页面/区块头部 |
|
导航链接 |
|
独立内容区块 |
|
文档中的节 |
|
侧边栏内容 |
|
页面/区块底部 |
|
文档主要内容 |
<input type="email" required>//用途:用于输入电子邮件地址。[email protected]
<input type="date">//用途:用于选择日期。输入的值会以 YYYY-MM-DD 格式提交
<input type="color">//用途:用于选择颜色。输入的值是一个十六进制颜色值(如 #FFFFFF)。用户点击输入框时,会弹出颜色选择器。
<input type="range" min="0" max="100">//用途:用于选择一个范围内的值(滑动条)。
特点:
显示为一个滑动条,用户可以通过拖动滑块选择值。
可以通过 min 和 max 属性设置最小值和最大值。
默认范围是 0 到 100。
<input type="search">
//用途:用于输入搜索关键词。
特点:
在支持 HTML5 的浏览器中,输入框可能会有特殊的样式(如圆角或清除按钮)。
在移动设备上,键盘可能会显示“搜索”按钮。
和 是 HTML5 中用于嵌入视频和音频的标签。它们提供了丰富的属性和方法,可以控制媒体的播放、暂停、音量等。
<video controls width="600">
<source src="movie.mp4" type="video/mp4">
您的浏览器不支持视频标签
video>
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
audio>
属性 | 描述 |
---|---|
controls |
显示浏览器默认的视频控制条(播放/暂停、音量、全屏等)。 |
width |
设置视频播放器的宽度(单位:像素)。 |
height |
设置视频播放器的高度(单位:像素)。 |
autoplay |
视频加载后自动播放(注意:部分浏览器可能会阻止自动播放)。 |
loop |
视频播放结束后自动重新播放。 |
muted |
视频静音播放。 |
poster |
设置视频封面图片(在视频未播放时显示)。 |
preload |
设置视频的预加载方式:auto (自动加载)、metadata (仅加载元数据)、none (不预加载)。 |
src |
视频文件的路径(可以直接写在 标签中,也可以通过 指定)。 |
属性 | 描述 |
---|---|
controls |
显示浏览器默认的音频控制条(播放/暂停、音量等)。 |
autoplay |
音频加载后自动播放(注意:部分浏览器可能会阻止自动播放)。 |
loop |
音频播放结束后自动重新播放。 |
muted |
音频静音播放。 |
preload |
设置音频的预加载方式:auto (自动加载)、metadata (仅加载元数据)、none (不预加载)。 |
src |
音频文件的路径(可以直接写在 标签中,也可以通过 指定)。 |
标签
标签用于为 和
提供多个媒体源,以便浏览器选择支持的格式。
属性 | 描述 |
---|---|
src |
媒体文件的路径。 |
type |
媒体文件的 MIME 类型(如 video/mp4 、audio/mpeg )。 |
格式 | MIME 类型 | 浏览器支持情况 |
---|---|---|
MP4 | video/mp4 |
几乎所有现代浏览器(H.264 编码)。 |
WebM | video/webm |
Chrome、Firefox、Edge。 |
Ogg | video/ogg |
Firefox、Chrome。 |
格式 | MIME 类型 | 浏览器支持情况 |
---|---|---|
MP3 | audio/mpeg |
几乎所有现代浏览器。 |
Ogg | audio/ogg |
Firefox、Chrome。 |
WAV | audio/wav |
Firefox、Chrome、Edge。 |
<canvas id="myCanvas" width="400" height="200">canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(10, 10, 100, 50);
script>
是 HTML5 中用于绘制图形的标签,它提供了一个 JavaScript API,可以通过脚本动态生成图形、动画、游戏等内容。下面我会详细介绍
的使用方法、常用 API 以及一些高级技巧。
基础<canvas id="myCanvas" width="400" height="200">canvas>
width
和 height
属性用于设置画布的宽度和高度(单位:像素)。width
和 height
,默认值为 300px
(宽)和 150px
(高)。const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
getContext('2d')
返回一个 2D 绘图上下文对象(CanvasRenderingContext2D
),用于绘制图形。方法 | 描述 |
---|---|
fillRect(x, y, w, h) |
绘制填充矩形 |
strokeRect(x, y, w, h) |
绘制描边矩形 |
clearRect(x, y, w, h) |
清除矩形区域 |
示例:
ctx.fillStyle = 'red'; // 设置填充颜色
ctx.fillRect(10, 10, 100, 50); // 绘制填充矩形
ctx.strokeStyle = 'blue'; // 设置描边颜色
ctx.strokeRect(50, 50, 100, 50); // 绘制描边矩形
方法 | 描述 |
---|---|
beginPath() |
开始一条新路径 |
moveTo(x, y) |
将画笔移动到指定点 |
lineTo(x, y) |
从当前点到指定点画线 |
arc(x, y, r, startAngle, endAngle) |
绘制圆弧 |
closePath() |
闭合路径 |
fill() |
填充路径 |
stroke() |
描边路径 |
示例:
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(150, 50);
ctx.lineTo(100, 150);
ctx.closePath();
ctx.fillStyle = 'green';
ctx.fill(); // 填充三角形
方法 | 描述 |
---|---|
fillText(text, x, y) |
绘制填充文本 |
strokeText(text, x, y) |
绘制描边文本 |
font |
设置字体样式 |
textAlign |
设置文本对齐方式 |
textBaseline |
设置文本基线 |
示例:
ctx.font = '20px Arial';
ctx.fillStyle = 'black';
ctx.fillText('Hello Canvas', 10, 50);
方法 | 描述 |
---|---|
drawImage(image, x, y) |
绘制图像 |
drawImage(image, x, y, w, h) |
绘制并缩放图像 |
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) |
裁剪并绘制图像 |
示例:
const img = new Image();
img.src = 'image.png';
img.onload = () => {
ctx.drawImage(img, 10, 10, 100, 100);
};
属性 | 描述 |
---|---|
fillStyle |
设置填充颜色或渐变 |
strokeStyle |
设置描边颜色或渐变 |
lineWidth |
设置描边宽度 |
lineCap |
设置线段的端点样式 |
lineJoin |
设置线段连接处的样式 |
示例:
ctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; // 半透明红色
ctx.strokeStyle = '#00FF00'; // 绿色
ctx.lineWidth = 5;
方法 | 描述 |
---|---|
createLinearGradient(x1, y1, x2, y2) |
创建线性渐变 |
createRadialGradient(x1, y1, r1, x2, y2, r2) |
创建径向渐变 |
addColorStop(position, color) |
添加颜色停止点 |
示例:
const gradient = ctx.createLinearGradient(0, 0, 200, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(1, 'blue');
ctx.fillStyle = gradient;
ctx.fillRect(10, 10, 200, 100);
通过 requestAnimationFrame
实现动画效果。
示例:
let x = 0;
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
ctx.fillRect(x, 50, 50, 50);
x += 1;
requestAnimationFrame(draw);
}
draw();
可以通过监听鼠标事件实现交互。
示例:
canvas.addEventListener('mousemove', (e) => {
const rect = canvas.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillRect(x - 25, y - 25, 50, 50);
});
方法 | 描述 |
---|---|
save() |
保存当前绘图状态 |
restore() |
恢复之前保存的绘图状态 |
示例:
ctx.fillStyle = 'red';
ctx.save(); // 保存状态
ctx.fillRect(10, 10, 50, 50);
ctx.fillStyle = 'blue';
ctx.fillRect(70, 10, 50, 50);
ctx.restore(); // 恢复状态
ctx.fillRect(130, 10, 50, 50); // 使用红色填充
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position => {
console.log(`纬度: ${position.coords.latitude}`);
console.log(`经度: ${position.coords.longitude}`);
},
error => {
console.error('定位失败:', error.message);
}
);
}
地理定位(Geolocation)是 HTML5 提供的一个 API,允许网页获取用户的地理位置信息。它基于设备的 GPS、Wi-Fi、IP 地址等方式来定位用户的位置。下面我会详细介绍地理定位的使用方法、API 和相关注意事项。
在使用地理定位之前,需要检查浏览器是否支持该功能:
if (navigator.geolocation) {
// 浏览器支持地理定位
} else {
console.error('您的浏览器不支持地理定位');
}
使用 navigator.geolocation.getCurrentPosition()
方法获取用户的当前位置。
示例:
navigator.geolocation.getCurrentPosition(
position => {
console.log('纬度:', position.coords.latitude);
console.log('经度:', position.coords.longitude);
},
error => {
console.error('定位失败:', error.message);
}
);
getCurrentPosition
方法详解getCurrentPosition(successCallback, errorCallback, options)
方法接受三个参数:
successCallback
:定位成功时的回调函数,接收一个 Position
对象。errorCallback
:定位失败时的回调函数,接收一个 PositionError
对象。options
:可选配置对象,用于设置定位行为。Position
对象successCallback
接收的 Position
对象包含以下属性:
属性 | 描述 |
---|---|
coords.latitude |
纬度(十进制度数) |
coords.longitude |
经度(十进制度数) |
coords.accuracy |
定位精度(单位:米) |
coords.altitude |
海拔高度(单位:米) |
coords.altitudeAccuracy |
海拔精度(单位:米) |
coords.heading |
设备移动方向(相对于正北,单位:度) |
coords.speed |
设备移动速度(单位:米/秒) |
timestamp |
定位时间戳 |
PositionError
对象errorCallback
接收的 PositionError
对象包含以下属性:
属性 | 描述 |
---|---|
code |
错误代码(见下表) |
message |
错误信息 |
错误代码:
代码 | 常量 | 描述 |
---|---|---|
1 |
PERMISSION_DENIED |
用户拒绝授权 |
2 |
POSITION_UNAVAILABLE |
无法获取位置信息 |
3 |
TIMEOUT |
定位超时 |
getCurrentPosition
的第三个参数是一个配置对象,可以设置以下属性:
属性 | 描述 |
---|---|
enableHighAccuracy |
是否启用高精度定位(默认:false ) |
timeout |
定位超时时间(单位:毫秒,默认:无限制) |
maximumAge |
允许返回缓存位置的最大时间(单位:毫秒,默认:0) |
示例:
navigator.geolocation.getCurrentPosition(
position => {
console.log('定位成功:', position.coords);
},
error => {
console.error('定位失败:', error.message);
},
{
enableHighAccuracy: true, // 启用高精度
timeout: 5000, // 超时时间 5 秒
maximumAge: 60000 // 允许使用 1 分钟内的缓存位置
}
);
如果需要持续获取用户的位置变化,可以使用 watchPosition
方法。
watchPosition
方法watchPosition
的用法与 getCurrentPosition
类似,但它会持续监听位置变化,并返回一个监听 ID。
示例:
const watchId = navigator.geolocation.watchPosition(
position => {
console.log('当前位置:', position.coords);
},
error => {
console.error('定位失败:', error.message);
}
);
// 停止监听
navigator.geolocation.clearWatch(watchId);
errorCallback
会收到 PERMISSION_DENIED
错误。enableHighAccuracy
可以提高精度,但会增加设备耗电。<p>点击按钮获取您的位置:p>
<button onclick="getLocation()">获取位置button>
<p id="location">p>
<script>
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position => {
const { latitude, longitude } = position.coords;
document.getElementById('location').innerText =
`纬度: ${latitude}, 经度: ${longitude}`;
},
error => {
document.getElementById('location').innerText =
`定位失败: ${error.message}`;
}
);
} else {
document.getElementById('location').innerText =
'您的浏览器不支持地理定位';
}
}
script>
Web Workers 是 HTML5 提供的一种技术,允许在浏览器中运行多线程 JavaScript 代码。它使得开发者可以将耗时的任务放到后台线程中执行,从而避免阻塞主线程(UI 线程),提升页面的响应速度和用户体验。
复杂计算(如加密、图像处理)
大数据处理(如 CSV 解析、数据过滤)
实时通信(如 WebSocket 数据处理)
其他需要长时间运行的任务
在主线程中创建一个 Worker:
const worker = new Worker('worker.js');
worker.js
是 Worker 线程中执行的脚本文件。主线程发送消息:
worker.postMessage('Hello Worker!');
Worker 接收消息:
self.onmessage = event => {
console.log('收到主线程消息:', event.data);
};
Worker 发送消息:
self.postMessage('Hello Main Thread!');
主线程接收消息:
worker.onmessage = event => {
console.log('收到 Worker 消息:', event.data);
};
当 Worker 完成任务后,可以手动终止:
worker.terminate();
postMessage
将数据发送回主线程。window
、document
、alert
等浏览器 API。WebSocket
、IndexedDB
、Fetch
等 API。worker.js
)。主线程:
const worker = new Worker('worker.js');
worker.postMessage('开始计算');
worker.onmessage = e => {
console.log('收到结果:', e.data);
};
worker.js:
self.onmessage = function(e) {
const result = heavyCalculation();
self.postMessage(result);
};
WebSocket 是一种基于 TCP 的网络协议,它允许在客户端和服务器之间建立全双工通信(双向通信)。与传统的 HTTP 请求-响应模式不同,WebSocket 提供了一种持久的连接,使得服务器可以主动向客户端推送数据,而不需要客户端不断地发送请求。
WebSocket 是 HTML5 的一部分,广泛应用于实时通信场景,如聊天应用、实时数据更新、在线游戏等。
const socket = new WebSocket('ws://example.com/socket');
socket.onopen = () => {
socket.send('Hello Server!');
};
socket.onmessage = event => {
console.log('收到消息:', event.data);
};
const socket = new WebSocket('ws://example.com/socket');
ws://
是 WebSocket 协议的 URL 前缀(类似于 HTTP 的 http://
)。wss://
(类似于 HTTPS 的 https://
)。onopen
socket.onopen = () => {
console.log('连接已建立');
socket.send('Hello Server!'); // 向服务器发送消息
};
onmessage
socket.onmessage = event => {
console.log('收到消息:', event.data); // event.data 是服务器发送的数据
};
onerror
socket.onerror = error => {
console.error('连接错误:', error);
};
onclose
socket.onclose = () => {
console.log('连接已关闭');
};
使用 send()
方法向服务器发送数据。
socket.send('Hello Server!'); // 发送文本
socket.send(JSON.stringify({ key: 'value' })); // 发送 JSON 数据
使用 close()
方法关闭连接。
socket.close();
WebSocket 连接的建立需要经过一次 HTTP 握手:
Upgrade: websocket
头。101 Switching Protocols
,表示协议升级成功。WebSocket 使用二进制数据帧传输数据,支持文本和二进制格式。
const socket = new WebSocket('ws://example.com/socket');
socket.onopen = () => {
console.log('连接已建立');
socket.send('Hello Server!');
};
socket.onmessage = event => {
console.log('收到消息:', event.data);
};
socket.onerror = error => {
console.error('连接错误:', error);
};
socket.onclose = () => {
console.log('连接已关闭');
};
ws
库)const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', ws => {
console.log('客户端已连接');
ws.on('message', message => {
console.log('收到消息:', message);
ws.send(`服务器回复: ${message}`);
});
ws.on('close', () => {
console.log('客户端已断开连接');
});
});
如果 WebSocket 不可用,可以考虑以下替代方案:
// 存储数据
localStorage.setItem('username', 'JohnDoe');
// 读取数据
const user = localStorage.getItem('username');
// 删除数据
localStorage.removeItem('username');
// 清空所有
localStorage.clear();
使用方法同 localStorage,区别:
const request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('users', { keyPath: 'id' });
store.createIndex('name', 'name', { unique: false });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
store.add({ id: 1, name: 'Alice' });
};
特性 | Cookie | localStorage | sessionStorage | IndexedDB |
---|---|---|---|---|
容量 | 4KB | 5MB | 5MB | 250MB+ |
生命周期 | 可设置过期时间 | 永久 | 会话级 | 永久 |
服务器访问 | 自动携带 | 无 | 无 | 无 |
数据类型 | 字符串 | 字符串 | 字符串 | 结构化数据 |
HTML5 的核心优势:
建议结合 CSS3 和 JavaScript API 使用,可构建现代化 Web 应用。