视频被fixed导航栏遮挡的根因是父容器未预留空间,应使用padding-top或scroll-margin-top解决,而非给video加margin;Flex/Grid中需防压缩和错位;iOS Safari全屏返回需JS补偿。

视频元素被固定定位导航栏遮挡
这是最常见的情况:页面顶部有 position: fixed 的导航栏,而 直接放在 顶部,结果视频第一行被盖住。
根本原因不是视频本身有问题,而是它的父容器没有预留出导航栏占用的空间。浏览器渲染时,fixed 元素脱离文档流,下方内容会“顶上去”。
- 不要给
加margin-top—— 这治标不治本,响应式下容易错位 - 推荐在
外层加一个包裹容器(如),并给该容器设置padding-top,值等于导航栏高度(例如64px)- 若导航栏高度响应式变化(如移动端变矮),用 CSS 自定义属性 +
calc()更稳妥:padding-top: calc(var(--nav-height, 64px))使用
scroll-margin-top实现锚点滚动精准停靠当点击导航链接跳转到视频区域(比如
#intro-video),浏览器默认滚动到元素顶部,结果又被 fixed 导航盖住 —— 这时scroll-margin-top是唯一干净解法。- 给视频或其容器添加:
scroll-margin-top: 64px(值需匹配导航栏高度) - 该属性只影响滚动锚点行为,不影响布局,也不需要 JS 干预
- 注意兼容性:Chrome 89+、Firefox 90+、Safari 15.4+ 支持;旧版 Safari 需回退为 JS 滚动偏移(
window.scrollBy(0, -64)) - 别和
scroll-padding-top混用 —— 后者是给scroll-padding容器用的,不是给目标元素设的
Flex/Grid 布局中视频溢出或错位
用
display: flex或grid布局整体页面时,视频可能被压缩变形、截断,或因未设align-self而贴顶被挡。立即学习“前端免费学习笔记(深入)”;
- 确保视频容器设了
flex-shrink: 0,防止 Flex 主轴压缩 - 如果视频在 Flex 容器中垂直居中但被导航遮挡,检查是否用了
align-items: center—— 这会让内容块整体居中,而非“避开导航”,应改用margin-top或容器padding-top - 对
显式设置width: 100%和height: auto,避免固有宽高干扰布局计算 - 禁用
object-fit: cover除非真需要裁剪 —— 它会让视频“视觉上”填满但实际渲染区域仍按原始比例占位,导致点击区域错位
移动端 Safari 视频全屏后返回位置丢失
iOS Safari 在退出原生全屏视频后,页面会错误地滚动回顶部,或卡在错误位置,尤其当导航栏是
fixed且页面有复杂滚动监听时。- 这不是 CSS 问题,是 Safari 的已知行为,必须用 JS 补偿
- 监听
webkitendfullscreen事件,在回调里调用setTimeout(() => window.scrollTo(0, savedScrollTop), 100),延迟执行以绕过 Safari 的滚动锁定 -
savedScrollTop需在进入全屏前记录:document.addEventListener('webkitbeginfullscreen', () => { savedScrollTop = window.scrollY }) - 别依赖
scrollRestoration: 'manual'—— 它对全屏退出无效
64px很快就会出问题,建议用getBoundingClientRect()动态读取,或用 CSSenv(safe-area-inset-top)配合 JS fallback。 - 若导航栏高度响应式变化(如移动端变矮),用 CSS 自定义属性 +











