video标签需用aspect-ratio或padding-bottom保持宽高比,object-fit控制画面显示,autoplay必须muted且playsinline,多清晰度需js动态切换或hls。

video 标签默认不自适应,必须手动控制宽高比
浏览器对 <video></video> 的默认渲染是“按原始分辨率拉伸”,缩放后会变形或溢出容器。真正实现自适应,核心不是让视频填满父容器,而是保持宽高比(如 16:9)的同时响应式缩放。
常见错误是只设 width: 100%,结果在小屏上高度塌陷、 controls 被裁剪,或者横屏时黑边错位。
- 用
aspect-ratio: 16 / 9是最直接的方案(现代浏览器支持良好,Chrome 88+、Firefox 89+、Safari 15.4+) - 兼容老浏览器需用 padding-bottom 技巧:外层容器设
position: relative,内层<video></video>设position: absolute; top: 0; left: 0; width: 100%; height: 100%,再通过伪元素或子 div 控制 padding-bottom = (9/16)×100% ≈ 56.25% - 务必加
height: 0配合padding-bottom,否则高度由内容撑开,破坏比例
controls 和 poster 在响应式下容易错位或被截断
当 <video></video> 缩小到一定尺寸(比如手机竖屏),原生 controls 可能重叠、按钮过小不可点,poster 图片也可能因 object-fit 设置不当被拉伸或居中偏移。
- 给
<video></video>加object-fit: contain可保留完整画面+黑边;用object-fit: cover则裁剪但无黑边(推荐后者,更符合主流播放器体验) -
poster图片建议用和视频相同宽高比的图,并确保尺寸足够(至少 720p),否则高清屏下模糊 - 不要依赖
controlslist="nodownload nofullscreen"来“隐藏”功能——它只是提示,实际是否生效取决于浏览器,且不影响布局;真要精简 UI,得用自定义控件
移动端自动播放和静音是硬性限制,不处理会白屏
iOS Safari 和 Android Chrome 默认禁止带声音的自动播放。如果没设 muted 且没用户手势触发,play() 会直接 reject,<video></video> 停在首帧,看起来像“没加载成功”。
- 必须加
autoplay muted playsinline属性(playsinline防止 iOS 全屏跳转) - 若需有声播放,只能等用户点击后调用
video.play(),且不能跨事件循环延迟(比如 setTimeout 里调用大概率失败) - 检查是否报错:
Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.—— 这就是典型的静音缺失问题
srcset 和 media 属性对 video 没用,得换思路
<source></source> 支持 media 属性,但仅用于匹配媒体查询(如 media="(min-width: 768px)"),不会根据网络条件或设备像素比自动切换清晰度;srcset 在 <video></video> 上完全无效。
- 想实现多清晰度,得靠 JavaScript 检测
window.devicePixelRatio或screen.width,再动态设置video.src - 更稳妥的做法是服务端根据 UA 或客户端上报的 DPR 返回合适分辨率的 MP4/HLS 流
- HLS(.m3u8)本身支持自适应码率,但需后端切片 + 客户端用
hls.js(注意 iOS Safari 原生支持 HLS,但不支持低延迟 HLS)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











