You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Safari中object-fit: cover导致视频加载跳变的问题咨询

Safari中object-fit: cover在video元素上的初始渲染跳变问题

我正在开发一个示例,在指定宽高比的div容器包裹的video元素上使用CSS的object-fit: cover属性。相关代码如下:

HTML代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>CSS Test</title>
  </head>
  <body>
    <div id="container">
      <video
        autoplay
        playsinline
        muted
        loop
        src="https://media.istockphoto.com/videos/slow-motion-rock-on-the-midzor-peak-video-id1248422582"
      ></video>
    </div>
  </body>
</html>

CSS代码

* {
  box-sizing: border-box;
}
html,
body {
  margin: 0;
  padding: 1rem;
  width: 100%;
  height: 100%;
}
#container {
  width: 500px;
  overflow: hidden;
  aspect-ratio: 1/1;
  border: 1px solid red;
}
video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

在Safari中加载页面时,视频初始会以较小尺寸显示在div内,随后跳转到预期的缩放比例和位置(表现为视频先以原始比例缩小展示,再突然调整为铺满容器的状态)。该代码在Chrome和Firefox中表现正常,尝试添加object-position属性无效,请问Safari中此问题的原因是什么?


问题原因

这是Safari浏览器在处理视频元素与aspect-ratio容器组合时的渲染时序差异问题:

  • 初始布局阶段:Safari在页面加载初期,会优先基于视频的原始宽高比计算初始显示尺寸,此时容器的aspect-ratio约束还未完全参与到视频的布局计算中,导致视频以原始比例缩小后显示在容器内。
  • 后续重排阶段:当视频的元数据(宽高信息)加载完成,或浏览器完成后续的布局校验后,才会正确应用object-fit: cover规则,触发页面重排重绘,视频才会调整到铺满容器的状态,这就造成了视觉上的跳变。

Chrome和Firefox在初始布局时,就会同步结合容器的aspect-ratio和视频的object-fit规则进行渲染,因此不会出现这种跳变问题。而Safari对这两个属性的协同处理逻辑存在滞后,导致了该现象的发生。


内容的提问来源于stack exchange,提问作者Zampus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:16:02