【问题标题】:SVG image not aligning to equivalent of 'object-fit' in 100vh viewportSVG 图像未与 100vh 视口中的“object-fit”等价物对齐
【发布时间】:2019-03-21 03:47:09
【问题描述】:

我试图让 SVG 图像在 100vh 全屏容器内等效于 object-fit。据我所知,我需要使用preserveAspectRatio="xMidYMid slice" 属性并设置width="100%" height="100%"

我似乎无法让它工作?当我使用它时,要么在容器底部显示一大块空白,要么当图像填满视口时,视口会变得比 100vh 大很多?

请注意,我不能使用 CSS background-image 属性,因为它是我正在构建的更广泛的 SVG/Javascript 动画的一部分。

Codepen:https://codepen.io/emilychews/pen/YJYrEa

有谁知道这里出了什么问题以及解决方案是什么?

提前感谢任何帮助/想法。

body {
  margin: 0;
  padding: 0;
  display: flex;
  width: 100%;
  height: 100vh;
  justify-content: center;
  align-items: center;
}

#section-1, .background-clipped {
  width: 100%;
  height: 100%;
}
<section id="section-1">
<div class="background-clipped background-clipped-1">
    <svg id="home-image-1" viewbox="0 0 100 100" preserveAspectRatio="xMidYMid slice">
    <image x="0" y="0" xlink:href="https://i.postimg.cc/9XdQKYF1/dimon-blr-309444-unsplash.jpg" width="100%" height="100%" />
    </svg>
</div>
</section>

【问题讨论】:

  • 在我看来,如果这不是方形图像,那么您的视图框是错误的。不过可能不相关。

标签: html css image svg aspect-ratio


【解决方案1】:

有多种尺寸调整机制在起作用;一个用于&lt;svg&gt; 元素,一个用于&lt;image&gt; 元素。

您为&lt;svg&gt; 元素设置的那个并没有真正的帮助。 viewBox 属性适合容器内 100 x 100 用户单位的坐标系。然后这个坐标系是用隐式preserveAspectRatio="xMidYMid meet" 调整&lt;image&gt; 的视口。如果您觉得这令人困惑:是的,这就是问题所在。

相反,只需调整 &lt;svg&gt; 元素的大小以填充容器。删除viewBox,将widthheight 设置为100%。如果没有viewBoxpreserveAspectRatio&lt;svg&gt; 元素也没有影响。

现在,只有图像的大小调整机制(如 preserveAspectRatio 所述,将 nimage 放入视口的 100% 宽度和高度)才会生效并按您希望的方式工作。

一般说明&lt;image&gt; 中使用的 JPG 具有固有的纵横比。因此preserveAspectRatio 将始终有效。 &lt;svg&gt; 元素没有。只有viewBox 有一个。并且是该属性的作用。

body {
  margin: 0;
  padding: 0;
  display: flex;
  width: 100%;
  height: 100vh;
  justify-content: center;
  align-items: center;
}

#section-1, .background-clipped {
  width: 100%;
  height: 100%;
}
<section id="section-1">
<div class="background-clipped background-clipped-1">
    <svg id="home-image-1" width="100%" height="100%">
        <image xlink:href="https://i.postimg.cc/9XdQKYF1/dimon-blr-309444-unsplash.jpg"
               x="0" y="0" width="100%" height="100%" preserveAspectRatio="xMidYMid slice"/>
    </svg>
</div>
</section>

【讨论】:

  • 这是一个很好的答案。正如您回答的那样,我意识到我的代码出错了,我错误地将 preserveAspectRatio 属性放在我的 &lt;image&gt; 元素上,而不是 &lt;svg&gt; 上。但这不应该有希望地影响事情。
  • 哦,天哪,它确实会影响事情。我已经将 preserveAspectRatio 放在两者上,但这似乎可以解决问题。再次感谢。
  • 我没有在&lt;svg&gt; 元素上设置preserveAspectRatio 是有原因的。见编辑。
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多