用 padding-top 实现 16:9 容器最稳定,因 padding-top 百分比基于父宽计算,配合 position: relative 和绝对定位 iframe 可避免高度坍缩;现代项目可用 aspect-ratio: 16 / 9,但需 fallback 至 padding-top 兼容旧 safari。

直接给 <iframe></iframe> 或 <video></video> 写 width="100%" height="100%" 无法保持 16:9,因为浏览器根本算不出高度——父容器没高度,子元素的 height: 100% 就是 0。
为什么 iframe 的 height="100%" 总是失效
浏览器要求 height: 100% 的元素必须有可计算高度的父级,但响应式容器(比如只设了 width: 100% 的 <div>)自身高度为 0。此时 <code><iframe></iframe> 高度坍缩,整个区域可能完全不可见。
- 写
width="100%" height="360"→ 小屏横向溢出 - 写
width="100%" height="100%"→ 父容器无明确高度,<iframe></iframe>高度为 0 - 保留
width="640" height="360"再加 CSSwidth: 100%; height: 100%→ 原始属性被覆盖,比例丢失
用 padding-top 实现兼容性最好的 16:9 容器
这是目前最稳定、不依赖 JS、无需现代 CSS 特性的方案。核心是利用 padding-top 百分比值基于父容器宽度计算的特性,构造一个“无高度依赖”的占位区。
-
16:9对应padding-top: 56.25%(即9 ÷ 16 × 100) -
4:3对应padding-top: 75%(3 ÷ 4 × 100) - 容器必须设
position: relative,否则position: absolute的<iframe></iframe>会脱离文档流 -
<iframe></iframe>必须移除所有width和height属性(包括 HTML 属性),否则干扰 CSS 定位
.video-container {
position: relative;
width: 100%;
height: 0;
padding-top: 56.25%;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: block;
}
用 aspect-ratio 替代 padding-top(现代项目首选)
aspect-ratio: 16 / 9 更直观简洁,但它**只能写在包裹容器上**,不能直接写在 <iframe></iframe> 或 <video></video> 上——老 Safari(≤15.3)会忽略该声明,导致容器高度为 0,视频完全不可见。
- 必须搭配
width: 100%使用,否则比例无意义 -
<iframe></iframe>仍需设width: 100%; height: 100%才能填满容器 - 若需支持 iOS 15.3 及更早版本,必须降级 fallback 到
padding-top方案 - Bootstrap 5 的
.ratio类底层就是aspect-ratio,但内部仍保留了padding-bottom兜底逻辑
嵌入 YouTube/Vimeo 时容易漏掉的关键点
光控制宽高比不够,移动端播放体验还取决于几个隐藏参数和属性:
- 必须加
playsinline和webkit-playsinline,否则 iOS Safari 点击 controls 直接跳全屏 - 若要自动播放,
autoplay=1&muted=1是硬性条件,缺一不可 - 避免在 modal 或 fixed 定位区域里嵌套,全屏退出后容易定位错乱;建议全屏前用 JS 临时
appendTo(document.body) - 别在
<iframe></iframe>上写width/height属性,它们会覆盖 CSS 的响应式行为
真正难的不是写对一次,而是所有嵌套层级都保持这个计算链不中断——比如容器里再套一层 flex 容器,忘了加 min-width: 0,width: 100% 就会失效,整个比例就崩了。











