<video> HTML 元素用于在文档中嵌入媒体播放器,用于支持文档内的视频播放。你也可以将 <video> 标签用于音频内容,但是 <audio> 元素可能在用户体验上更合适。
一、基础结构与基本使用
<video
src="movie.mp4"
controls
width="640"
height="360"
autoplay
muted
loop
preload="auto"
poster="preview.jpg"
oncontextmenu="return false"
>
您的浏览器不支持video标签
</video>
二、常用属性(Attributes)
| 属性名 |
说明 |
src |
视频资源路径(建议使用<source>标签代替) |
controls |
是否显示浏览器默认控件 |
autoplay |
页面加载后自动播放 |
muted |
视频静音播放 |
loop |
播放结束后循环播放 |
preload |
预加载行为:auto(全载) / metadata(仅元数据) / none |
poster |
视频加载时显示的图片 |
width/height |
视频区域尺寸 |
playsinline |
iOS设备上是否在网页中播放(不全屏) |
crossorigin |
用于CORS请求资源,如 anonymous、use-credentials |
disablepictureinpicture |
禁用画中画模式 |
controlslist |
控件选项:nodownload, nofullscreen, noremoteplayback |
oncontextmenu |
禁止右键菜单(常用于保护视频资源) |
三、<source> 标签
推荐写法(支持多格式兼容):
<video controls>
<source src="movie.mp4" type="video/mp4; codecs="avc1.42E01E, mp4a.40.2"">
<source src="movie.webm" type="video/webm; codecs="vp8, vorbis"">
您的浏览器不支持视频标签。
</video>
MIME类型与Codecs常用组合:
| 格式 |
MIME Type |
Codecs 示例 |
| MP4 |
video/mp4 |
avc1.42E01E, mp4a.40.2 |
| WebM |
video/webm |
vp8, vorbis |
| Ogg |
video/ogg |
theora, vorbis |
| MOV |
video/quicktime |
—— |
| HLS (.m3u8) |
application/x-mpegURL(需插件或自定义播放器) |
h.264 / AAC |
四、视频格式兼容性说明
| 浏览器 |
MP4 支持 |
WebM 支持 |
Ogg 支持 |
HEVC/H.265 支持(部分) |
AV1 支持 |
| Chrome |
✅ |
✅ |
✅ |
✅(部分支持) |
✅ |
| Firefox |
❌(受限) |
✅ |
✅ |
❌ |
✅ |
| Safari |
✅ |
✅(部分) |
❌ |
✅(Mac) |
❌(Safari 16+开始支持) |
| Edge |
✅ |
✅ |
✅ |
✅ |
✅ |
| Android |
✅ |
✅ |
✅ |
✅ |
✅ |
| iOS |
✅ |
❌ |
❌ |
✅ |
❌ |
👉 建议方案:
五、常用事件(Events)
const video = document.querySelector('video');
video.addEventListener('play', () => { ... });
| 事件名 |
说明 |
loadstart |
开始加载视频 |
progress |
视频加载过程 |
suspend |
浏览器停止下载 |
error |
加载或播放错误 |
emptied |
视频突然清空 |
stalled |
浏览器尝试获取数据但失败 |
loadedmetadata |
元数据加载完成 |
loadeddata |
第一帧视频数据已加载 |
canplay |
视频可以开始播放(缓冲足够) |
canplaythrough |
视频可以流畅播放(缓冲足够) |
play |
播放被用户或脚本触发 |
playing |
视频正在播放 |
pause |
暂停事件 |
ended |
播放结束 |
timeupdate |
播放进度更新(time属性变化) |
volumechange |
音量改变 |
ratechange |
播放速率改变 |
resize |
视频区域尺寸变化 |
seeking / seeked |
拖动时间轴事件 |
durationchange |
视频总时长改变 |
六、错误处理 error.code
| error.code |
含义 |
1 |
用户中止了播放 |
2 |
网络错误 |
3 |
解码错误 |
4 |
没有可支持的资源 |
video.addEventListener('error', function() {
let error = video.error;
switch(error.code) {
case 1: alert('播放中止'); break;
case 2: alert('网络错误'); break;
case 3: alert('播放器发生解码错误'); break;
case 4: alert('不支持的视频格式'); break;
}
});
七、JavaScript控制
| 操作 |
代码 |
| 播放 |
video.play() |
| 暂停 |
video.pause() |
| 视频当前时间 |
video.currentTime = 30; // 跳到30秒 |
| 视频音量 |
video.volume = 0.5; // 0~1 |
| 是否静音 |
video.muted = true; |
| 视频速度 |
video.playbackRate = 1.5; |
| 视频持续时间 |
video.duration; // 秒数 |
| 当前播放位置 |
video.currentTime |
| 全屏播放 |
video.requestFullscreen() / 需考虑兼容性 |
| 浏览器全屏模式 |
document.fullscreenElement |
| 加载视频 |
video.load() 或设置 src |
| 获取缓冲信息 |
video.buffered (时间范围对象) |
八、自定义控件(Advanced)
- 移除
controls属性,完全自定义UI
- 使用DOM+JS控制视频播放
- 示例:带自定义进度条
<video id="customVideo"></video>
<div class="controls">
<button id="play">Play</button>
<input type="range" id="progress" min="0" max="100" value="0">
</div>
const video = document.getElementById('customVideo');
const play = document.getElementById('play');
const progress = document.getElementById('progress');
play.onclick = function () {
if (video.paused) {
video.play();
play.textContent = 'Pause';
} else {
video.pause();
play.textContent = 'Play';
}
};
video.ontimeupdate = function () {
progress.value = (video.currentTime / video.duration) * 100 || 0;
};
progress.onchange = function () {
video.currentTime = (progress.value / 100) * video.duration;
};
九、性能优化建议
- 使用
preload="metadata"避免首次加载加载过大视频文件;
- 使用
playsinline防止iOS下自动全屏;
- 使用CDN、视频压缩、WebM + H.264格式优化;
- 视频使用响应式布局:
max-width: 100%; height: auto;;
- 检测播放错误并提示用户重试;
- 对移动端视频建议使用
muted和playsinline属性。
十、无障碍支持
- 使用
<track>标签实现字幕、章节提示;
- 示例:
<video ...>
<source src="video.mp4">
<track
src="captions_en.vtt"
kind="captions"
srclang="en"
label="English"
default
>
</video>
字幕格式 .vtt 示例:
WEBVTT
Hello World
00:00:00.000 --> 00:00:04.000
欢迎观看这段视频演示。
00:00:05.000 --> 00:00:08.000
感谢您的关注!
十一、视频播放策略与浏览器限制(很重要!)
- 自动播放限制:
- 必须静音 (
muted)
- 需要用户交互动作(如 click)
autoplay + muted是主流兼容写法
video
.play()
.then(() => console.log('视频播放成功'))
.catch(err => {
console.warn('自动播放被拦截,请交互后播放');
});
- 全屏播放需用户交互
- iOS限制更多,不支持自动播放非静音
- 安卓浏览器策略类似PC浏览器
十二、常见问题与解决方案
| 问题 |
解决方案 |
| 视频不播放 |
检查 MIME 类型、跨域、路径、格式 |
| 自动播放失败 |
必须加上 muted 属性并监听 canplay 后执行 play |
| iOS黑屏 |
添加 playsinline 属性 |
| 跨域无法播放 |
使用 crossorigin="anonymous" 并配置CORS头 |
| 视频模糊/拉伸 |
使用 CSS object-fit: cover |
| 全屏被阻止 |
检查是否是用户主动触发,或使用 allowfullscreen 属性 |
以上就是我对HTML5 <video> 标签的完整、详尽、专业级别的知识点整理,共 13 大项、300+知识点和建议,涵盖从基础语法到性能优化、常见问题与解决方案、推荐框架等,适用于从初学者到中高级前端工程师查阅。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)