Skip to content

HTML5

简介

HTML5 是 超文本标记语言(HTML)的第五个主要版本,由 W3C(万维网联盟)和 WHATWG 共同制定,于 2014 年 10 月正式成为 W3C 推荐标准。它不仅是一套新的标签,更是一整套现代 Web 开发技术的集合,包括语义化标签、多媒体支持、本地存储、Canvas 绘图、地理定位、离线应用等。

设计目的

  1. 简化 Web 开发 提供更清晰、语义化的标签(如 headerarticlenav),取代过去滥用的 div
  2. 原生支持多媒体 无需插件(如 Flash)即可播放音频(audio)和视频(video)。
  3. 提升用户体验与性能 支持离线存储(localStorageIndexedDB)、Web Workers(多线程)、WebSocket(实时通信)等。
  4. 跨平台兼容性 适配桌面、移动设备、平板等不同终端,推动“一次开发,多端运行”。
  5. 增强可访问性与 SEO 语义化结构让搜索引擎和辅助工具更容易理解页面内容。

优缺点

  1. ✅ 优点

    • 语义化更强:代码结构清晰,利于维护和 SEO。
    • 原生多媒体支持:无需第三方插件即可播放音频(audio)和视频(video)。
    • 丰富的 API:如 Canvas、Geolocation、Drag & Drop、File API 等。
    • 离线能力:通过 Application Cache(已废弃)或 Service Workers 实现离线应用。
    • 跨平台:在手机、平板、PC 上表现一致。
  2. ❌ 缺点

    • 兼容性问题:旧版浏览器(如 IE8 及以下)不支持 HTML5,需 polyfill 或降级处理。
    • 安全风险:如 localStorage 明文存储、WebSocket 需防范 CSRF 等。
    • 性能限制:复杂动画或游戏仍不如原生应用流畅(尽管 WebAssembly 正在改善这一点)。

典型应用场景

  • 响应式网站与移动 Web 应用(如新闻站、电商首页)
  • 在线音视频平台(如 YouTube、播客网站使用 video/audio)
  • 单页应用(SPA):结合 Vue/React + HTML5 History API 实现无刷新导航
  • 游戏与数据可视化:使用 canvas 或 WebGL(基于 HTML5 环境)
  • 离线应用:如笔记类 App(Evernote Web 版)、待办清单
  • 地理位置服务:打车、外卖、地图类 Web 应用

语义化标签

语义化标签 是指那些名称本身就能表达其内容含义或结构角色的 HTML 标签。相比过去大量使用 div,语义化标签让代码更清晰、可读性更强,同时有利于:SEO、无障碍访问、团队协作与代码维护。

结构标签

标签作用可重复典型位置
header表示区块的介绍性内容或头部信息(如标题、logo、导航等)页面顶部、<article><section> 内部
footer表示父级内容区块的尾部信息(如版权、作者、相关链接等)页面底部、<article><section> 底部
nav定义主要导航链接区域页面顶部、侧边栏(但主导航通常只一个)
main表示页面核心、唯一的主要内容页面中央主体区域(仅能出现一次)
section表示一个主题相关的独立内容块,通常带有标题首页模块、文章章节、表单分组等
article表示可独立分发或复用的内容单元(如博客、新闻、评论)博客列表项、新闻摘要、用户评论区
aside表示与主内容相关但可独立存在的辅助信息侧边栏、文章右侧推荐区、弹出提示旁注
figure表示自包含的媒体内容单元(如图片、图表、代码),常配合 <figcaption>文章插图、数据可视化区域、代码示例块

表单标签

新增<input>类型type

类型作用移动端键盘示例
email邮箱邮箱键盘(带 @ 和 .)<input type="email">
url网址URL 键盘(带 . / :)<input type="url">
number数字数字键盘<input type="number" min="0" max="100">
range滑块<input type="range" min="0" max="10">
date日期日期选择器<input type="date">
time时间时间键盘<input type="time">
datetime-local日期+时间日期+时间选择器<input type="datetime-local">
month年月年月选择器<input type="month">
week周选择器<input type="week">
color颜色调色板<input type="color">
search搜索带“搜索”按钮的键盘<input type="search">
tel电话号数字/拨号键盘<input type="tel">

新增表单属性

  1. 通用表单控件属性

    属性作用示例
    placeholder输入提示文本(浅灰色占位符)<input placeholder="请输入邮箱">
    required必填字段(提交时自动校验)<input required>
    autofocus页面加载时自动聚焦<input autofocus>
    autocomplete是否启用自动填充(on/off<input autocomplete="on">
    disabled禁用字段(不提交)<input disabled>
    readonly只读(可提交,但不可编辑)<input readonly>
  2. 数值/范围控制属性

    属性作用适用类型
    min / max设置最小/最大值number, range, date
    step步长(如 step="0.5"number, range
    pattern正则表达式校验所有文本类输入(text, email 等)
  3. 表单级别属性(在<form>上使用)

    属性作用
    novalidate关闭浏览器默认验证(用于自定义验证)
    autocomplete整个表单是否启用自动填充

新增表单元素

  1. <datalist>: 输入建议下拉列表,为 <input> 提供预定义的选项建议(类似自动补全)。用户既可以从下拉列表中选择,也可以手动输入自定义值。不同于 <select>,它不是强制选择,而是辅助输入。
html
<input list="browser" />
<datalist id="browser">
  <option value="Internet Explorer"></option>
  <option value="Firefox"></option>
  <option value="Chrome"></option>
  <option value="Safari"></option>
</datalist>
  1. <progress>: 任务进度指示器,表示某个任务的完成进度(如文件上传、数据加载、安装过程)。是动态、可更新的 UI 元素(通常配合 JavaScript 使用)。
html
<progress max="100" value="50"></progress>

媒体标签

<video> —— 视频播放

html
<video src="movie.mp4" controls width="640" height="360">
  您的浏览器不支持 HTML5 视频。
</video>
<video controls width="640" poster="cover.jpg">
  <source src="movie.mp4" type="video/mp4" />
  <source src="movie.webm" type="video/webm" />
  <source src="movie.ogv" type="video/ogg" />
  您的浏览器不支持 HTML5 视频。
</video>
属性说明
src视频文件路径(也可用 <source> 子元素替代)
controls显示播放控件(播放/暂停、音量、进度条等)
autoplay自动播放(部分浏览器因策略限制需配合 muted
muted静音播放(常用于自动播放场景)
loop循环播放
poster视频加载前显示的封面图
preload预加载策略:none / metadata / auto

<audio> —— 音频播放

html
<audio src="music.mp3" controls>您的浏览器不支持 audio 标签。</audio>
<audio controls>
  <source src="song.mp3" type="audio/mpeg" />
  <source src="song.ogg" type="audio/ogg" />
  您的浏览器不支持 HTML5 音频。
</audio>

属性:与 <video> 类似,包括:controlsautoplayloopmutedpreload

<source>和<track>标签

  1. <source> 标签:

    • 作为 <video><audio> 的子元素,用于指定多个媒体源
    • 浏览器会按顺序尝试加载,直到找到支持的格式。
    • 通过 type 属性帮助浏览器快速判断是否支持,避免无效请求。
  2. <track> 标签(字幕/章节支持):

    • 为视频或音频提供外挂文本轨道,如字幕、标题、描述等。
    • 支持多语言字幕,提升无障碍访问能力。
    • kind:类型(subtitles 字幕 / captions 听障字幕 / descriptions 描述 / chapters 章节)
    • srclang:语言代码(如 zh, en
    • default:默认启用该轨道

      ⚠️ 字幕文件需为 WebVTT 格式.vtt

html
<video controls>
  <source src="movie.mp4" type="video/mp4" />
  <track kind="subtitles" src="zh.vtt" srclang="zh" label="中文" default />
  <track kind="subtitles" src="en.vtt" srclang="en" label="English" />
</video>

其他功能标签

  • mark:标注;
  • time:数据标签,给搜索引擎使用; 发布日期 <time datetime="2014-12-25T09:00">9:00</time> 更新日期 <time datetime="2015-01-23T04:00" pubdate>4:00</time>
  • ruby和rt:对某一个字进行注释; <ruby><rt>注释内容</rt><rp>浏览器不支持时如何显示</rp></ruby>
  • wbr:软换行,页面宽度到需要换行时换行;
  • canvas:使用JS代码做内容进行图像绘制;
  • details :展开菜单;
  • output:输出标签,用于显示脚本的输出结果;
  • meter:度量值指示器(标量测量)

API

网络:online/offline

js
window.addEventListener("online", function () {
  console.log("网络已连通");
});
window.addEventListener("offline", function () {
  console.log("网络已断开");
});

全屏接口

方法/属性作用,说明
element.requestFullscreen()请求进入全屏,需要兼容性前缀
document.exitFullscreen()退出全屏,只能由 document 调用
document.fullscreenElement获取当前全屏元素,未全屏时返回 null

文件读取

对象作用
FileList表示用户选择的文件列表(通常来自 <input type="file">
File继承自 Blob,表示单个文件对象,包含文件名、大小、类型等元数据
FileReader用于异步读取文件内容(文本、二进制、DataURL 等)
html
<input type="file" id="fileInput" />
<script>
  document.getElementById("fileInput").addEventListener("change", function (e) {
    const file = e.target.files[0];
    if (file) {
      const reader = new FileReader();
      reader.onload = function (e) {
        console.log("文件内容:", e.target.result);
      };
      reader.readAsText(file); // 读为文本(UTF-8)
      reader.readAsDataURL(file); // 读为 Base64 Data URL(常用于图片预览)
      reader.readAsArrayBuffer(file); // 读为二进制 ArrayBuffer(用于音频/视频处理)
    }
  });
</script>

拖拽接口

  1. 可拖拽元素

    • 添加 draggable="true" 属性。默认可拖拽的元素:<a>(带 href)、<img>、选中的文本。
  2. 拖拽事件

    事件触发对象说明
    dragstart被拖拽元素拖拽开始(可设置传输数据)
    drag被拖拽元素拖拽过程中持续触发
    dragend被拖拽元素拖拽结束(无论成功与否)
    dragenter目标容器拖拽元素进入目标区域
    dragover目标容器拖拽元素在目标区域内移动(必须阻止默认行为!)
    dragleave目标容器拖拽元素离开目标区域
    drop目标容器在目标区域释放鼠标(必须阻止默认行为!)

    ⚠️ 注意

    dragover 和 drop 事件必须调用 event.preventDefault(),否则 drop 不会触发!

  3. 常用 dataTransfer 属性与方法

    dataTransfer 是 HTML5 拖拽 API 中的一个核心对象,它负责在 拖拽操作过程中传递数据。简单来说,就是拖拽过程中的"数据容器",负责在拖拽源和目标之间传递数据。

    属性/方法作用
    setData(format, data)设置拖拽数据(format'text/plain'
    getData(format)获取拖拽数据
    clearData([format])清除数据
    effectAllowed设置允许的拖拽效果(copy, move, link
    dropEffect设置实际拖拽效果(视觉反馈)
    files如果拖入的是文件,此处为 FileList(用于文件拖拽上传)
js
//示例:元素位置交换(看板/任务管理)
// 拖拽任务卡片
taskCard.addEventListener("dragstart", (e) => {
  e.dataTransfer.setData("text/plain", taskCard.id);
});
// 放入新列
column.addEventListener("drop", (e) => {
  e.preventDefault();
  const taskId = e.dataTransfer.getData("text/plain");
  column.appendChild(document.getElementById(taskId));
});

地理定位Geolocation

通过 navigator.geolocation 对象提供两个主要方法:

  1. getCurrentPosition(success, error, options)
  • 用途:获取当前位置(一次性)
  • 参数
    • success: 成功回调(必填)
    • error: 错误回调(可选)
    • options: 配置选项(可选)
  1. watchPosition(success, error, options)
  • 用途持续监听位置变化(如导航、运动轨迹)
  • 返回一个 watchId,可用于 clearWatch(watchId) 停止监听
option选项类型,默认值说明
enableHighAccuracyboolean, false是否启用高精度模式(GPS vs 网络定位)
timeoutnumber, Infinity等待位置响应的最大时间(毫秒)
maximumAgenumber, 0允许使用缓存位置的最大时间(0 = 不使用缓存)
返回值coords属性类型,说明
latitudenumber, 纬度(十进制度)
longitudenumber, 经度(十进制度)
accuracynumber, 位置精度(米)必有
altitudenumber, 海拔(米,可能为 null
altitudeAccuracynumber, 海拔精度(米,可能为 null
headingnumber, 行进方向(角度,0=北,可能为 null
speednumber, 速度(米/秒,可能为 null
error.code常量说明
1PERMISSION_DENIED用户拒绝授权
2POSITION_UNAVAILABLE无法获取位置(如 GPS 无信号)
3TIMEOUT超时未返回结果
其他自定义错误信息(error.message

⚠️ 注意

🔒 安全限制

  • 必须在 HTTPSlocalhost 下使用(现代浏览器强制要求)
  • 首次访问会弹出权限请求框
js
if ("geolocation" in navigator) {
  navigator.geolocation.getCurrentPosition(
    (position) => {
      console.log("纬度:", position.coords.latitude);
      console.log("经度:", position.coords.longitude);
      console.log("精度:", position.coords.accuracy, "米");
      console.log("海拔:", position.coords.altitude); // 可能为 null
      console.log("时间戳:", new Date(position.timestamp));
    },
    (error) => {
      switch (error.code) {
        case error.PERMISSION_DENIED:
          console.error("用户拒绝了位置请求");
          break;
        case error.POSITION_UNAVAILABLE:
          console.error("位置信息不可用");
          break;
        case error.TIMEOUT:
          console.error("请求超时");
          break;
        default:
          console.error("未知错误:", error.message);
      }
    },
    {
      enableHighAccuracy: true, // 高精度(可能更耗电)
      timeout: 10000, // 超时时间(毫秒)
      maximumAge: 60000, // 允许使用缓存位置的最大年龄(毫秒)
    },
  );
} else {
  console.error("浏览器不支持地理定位");
}

history API

作用:在不刷新页面的前提下,操作浏览器历史记录和 URL,实现 SPA(单页应用)的无刷新路由。

  1. 方法
  • pushState(state, title, url):添加新状态到历史记录栈顶
  • replaceState(state, title, url):替换当前状态
  • go(n):移动到历史记录中的第 n 个状态(n 为整数)
  • back():移动到前一个状态(与 go(-1) 相同)
  • forward():移动到下一个状态(与 go(1) 相同)
  1. 事件
  • popstate:当用户点击浏览器的前进/后退按钮或调用 go 方法时触发,pushState/replaceState 不会触发 popstate 事件
  1. 属性
  • history.length:历史记录栈的长度(当前页面索引 + 1)
  • history.state:当前状态对象(初始值为 null

WebSocket

WebSocket 是 HTML5 引入的一种全双工、持久化通信协议,允许客户端(如浏览器)与服务器之间建立单个 TCP 连接,实现双向实时数据传输

✅ 它解决了传统 HTTP “请求-响应” 模式的局限性,特别适合需要低延迟、高频交互的场景。

特性HTTP(轮询/长轮询)WebSocket
连接方式每次请求新建连接(短连接)单次握手,长期保持连接(长连接)
通信方向客户端 → 服务器(单向)客户端 ⇄ 服务器(双向)
延迟高(需反复建立连接)极低(毫秒级)
带宽开销大(每次带完整 HTTP 头)小(仅少量帧头)
适用场景普通网页加载聊天室、实时游戏、股票行情、协同编辑

前端 API 使用

  1. 创建连接
js
const socket = new WebSocket("ws://localhost:8080/chat");
// 或安全连接:new WebSocket('wss://example.com/chat')
  1. 监听事件
js
socket.addEventListener("open", (event) => {
  console.log("WebSocket 连接已建立");
  socket.send("Hello Server!");
});
socket.addEventListener("message", (event) => {
  console.log("收到消息:", event.data); // 字符串或 Blob
});
socket.addEventListener("close", (event) => {
  console.log("连接已关闭", event.code, event.reason);
});
socket.addEventListener("error", (error) => {
  console.error("WebSocket 错误:", error);
});
  1. 发送消息
js
socket.send("用户发送了一条消息"); // 只能发送字符串或二进制(ArrayBuffer/Blob)
  1. 关闭连接
js
socket.close(1000, "正常关闭"); // code + reason
  1. 常用状态码(readyState
    常量说明
    0WebSocket.CONNECTING正在连接
    1WebSocket.OPEN连接成功,可通信
    2WebSocket.CLOSING正在关闭
    3WebSocket.CLOSED已关闭或连接失败
js
if (socket.readyState === WebSocket.OPEN) {
  socket.send(data);
}

Web Workers

Web Workers 是 HTML5 提供的一种多线程机制,允许 JavaScript 在后台线程中运行脚本,不阻塞主线程(UI 线程),从而避免页面卡顿或无响应。

✅ 核心价值:让耗时任务(如计算、数据处理)在后台执行,保持页面流畅。

特性说明
多线程Worker 运行在独立线程
不阻塞 UI主线程可继续响应用户交互
无 DOM 访问Worker 不能操作 documentwindowDOM 元素
通信方式通过 postMessage()onmessage 传递消息(类似事件)
同源限制Worker 脚本必须与主页面同源(协议+域名+端口)
浏览器支持IE10+,现代浏览器全面支持

使用示例

js
// main.js  主线程:创建 Worker 并通信
const worker = new Worker("worker.js");
// 发送数据给 Worker
worker.postMessage({ action: "calculate", num: 1000000 });
// 接收 Worker 返回结果
worker.onmessage = (event) => {
  console.log("计算结果:", event.data);
};
// 错误处理
worker.onerror = (error) => {
  console.error("Worker 错误:", error);
};

// worker.js   Worker 脚本:处理任务并返回
self.onmessage = (event) => {
  const { action, num } = event.data;
  if (action === "calculate") {
    let sum = 0;
    for (let i = 0; i < num; i++) {
      sum += i;
    }
    // 将结果发回主线程
    self.postMessage(sum);
  }
};
js
// 主线程终止
worker.terminate(); // 立即杀死 Worker,无回调

// 在 worker.js 中
self.close(); // Worker 主动退出

web存储

localStoragesessionStorage

要点说明
两大接口localStorage(永久)、sessionStorage(会话)
核心方法setItem, getItem, removeItem, clear
只能存字符串对象需 JSON.stringify/parse
安全限制同源策略、HTTPS 下可用
替代 Cookie更大容量、不随请求发送
特性localStoragesessionStorage
生命周期永久存储(除非手动清除)仅限当前会话(关闭标签页/窗口后清除)
作用域同源(协议+域名+端口)的所有页面共享仅限同一个标签页/窗口内有效
存储容量约 5–10 MB(各浏览器不同)约 5–10 MB
是否随 HTTP 请求发送不发送不发送
典型用途用户偏好(主题、语言)、缓存数据表单草稿、临时状态(如购物车步骤)

💡 同源策略:以下情况被视为不同源,数据不共享。
https://example.comhttp://example.com
http://localhost:8080/http://localhost:3001/

⚠️ 注意

  1. 只能存储字符串
  • 存储数字、布尔值、对象时,必须手动序列化
  • 读取时需反序列化(JSON.parse),注意处理 null
  1. 存储空间有限
  • 超出容量会抛出 QuotaExceededError
  • 建议大容量数据使用 IndexedDB
  1. 同步阻塞主线程
  • 所有操作都是同步的,大量读写可能卡顿 UI
  • 高频操作建议节流或改用 IndexedDB

事件监听:storage事件

其他标签页修改了 storage 数据时,当前页面可监听变化:

js
window.addEventListener("storage", (e) => {
  console.log("键:", e.key);
  console.log("旧值:", e.oldValue);
  console.log("新值:", e.newValue);
  console.log("URL:", e.url); // 触发变更的页面 URL
});

// 注意:当前页面的 storage 操作不会触发自身 storage 事件!

cookie对比

特性Web StorageCookie
容量5–10 MB4 KB
HTTP 传输不发送每次请求自动携带
作用域仅 JS 可访问JS + 服务端均可访问
安全性HttpOnly 保护可设 HttpOnly 防 XSS
过期控制需手动实现原生支持 Expires/Max-Age

图形与动画

Canvas绘图【todo】

PWA技术

Service Worker【todo】

Released under the MIT License.