【问题标题】:How to best fit image to a fixed ratio?如何将图像最好地拟合到固定比例?
【发布时间】:2021-10-18 22:39:46
【问题描述】:

我有一个照片目录,其中大部分的宽高比为 4:3。有一些奇怪的,要在不丢失图片的重要部分的情况下将它们裁剪为 4:3 是不可行的。

我想在每张照片大小相同的边界框中显示所有这些照片,包括少数几张尺寸奇特的照片。边界框由col-md-4 类的div 确定:

<div class="row">
  <div class="col-md-4">
    <!- the image here: -->
    <img class="img img-responsive" src=" ... " />
  </div>
  <div class="col-md-8">
    <!- other stuff -->
  </div>
</div>

对于那些已经是 4:3 的图像,它们都以完全相同的显示尺寸很好地显示,即使图像(文件)大小可能不同,例如,一个可以是 1024x768,另一个是 800x600。

对于“太宽”的图像,我希望它显示为(灰色条表示边界区域的背景):

对于“太高”的图像,我希望它显示为:

换句话说,每个奇数尺寸的图像都应该根据它是太高还是太胖来“选择”它的高度或宽度以适应边界框。这可以通过 bootstrap 和 css 实现吗?

值得注意的是,目前,边界div 具有由引导程序为每个图像设置的相同宽度。高度由图像的纵横比决定。当每张照片都是 4:3 时,那么高度也都是一样的。所以对于奇数尺寸的照片,高度必须锁定在显示宽度的3/4。

【问题讨论】:

  • 您是否调查过对象适合(或背景大小)包含?
  • 所以基本上你想要一个具有固定纵横比(例如 16:9)的容器,并以全高或全高显示图像(使用 AR 作为另一个维度)以 16 为中心:9 容器?
  • @FabianSchöner 是的,这是正确的。因为宽度是由bootstrap决定的,所以坚持AR的话高度也都是一样的。
  • @OldGeezer 在下面检查我的答案,应该可以。

标签: css twitter-bootstrap bootstrap-4 responsive-images


【解决方案1】:

您可以使用 padding-top 和绝对定位(以及一点魔法)来实现:

.imagewrapper {
  display: block;
  position: relative;
  background-color: blue;
  border: 1px solid red;
}

.imagewrapper:before {
  content: '';
  display: block;
  width: 100%;
  /* this is AR of 16:9 calculated 9:16*100 = 56.25 */
  padding-top: 56.25%;
}

.imagewrapper img {
  position: absolute;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<div class="imagewrapper">
  <img src="https://dummyimage.com/1000x200/000/fff" alt="600x400" />
</div>

<div class="imagewrapper">
  <img src="https://dummyimage.com/600x400/000/fff" alt="600x400" />
</div>

<div class="imagewrapper">
  <img src="https://dummyimage.com/400x600/000/fff" alt="600x400" />
</div>

如果您需要容器的其他纵横比,请更改 padding-top 的值 .imagewrapper:before。它可以通过height / width * 100 计算(例如9 / 16 * 100 = 56.25 用于16:6 或4 / 3 * 100 = 133 用于3:4)。

这是如何工作的?

before 元素获得其父元素的 100% 宽度和指定的基于百分比的padding-top 值(例如 56.25%),这使其将其宽度的 56.25% 作为高度,这基本上使其成为一个固定的 AR 框。

图像通过绝对位置、顶部、左侧和变换在此框内居中定位,而其大小由高度和宽度自动包含,但最大高度和最大宽度为 100%。

你可以把它放在任何改变外部元素宽度的东西里面,它应该可以工作。

使用aspect-ratio 可以实现类似的行为,但此解决方案适用于 MSIE 和其他(旧版)浏览器,基本上也适用于本世纪以来的所有内容。

【讨论】:

  • 让我有一些时间来吸收这个以了解魔法是如何运作的。
  • 我添加了一些解释。基本上,:before 元素根据框的宽度将其周围的框带到固定的 AR 高度,并且图像包含在其中。
  • 它工作得很好,但我仍然不明白:before 是如何应用于造型的。图像是否位于填充区域?
  • 没错。 :before 元素使用 padding-top 值将其父框推到某个高度。现在盒子有一个高度(使用:before 中的 padding-top 相对于它的宽度)。现在正在为图像添加绝对定位,以便它在基于填充的空间的“顶部”跳跃。通过将其居中并将宽度设置为显示的值,它会居中并包含在:before 元素填充顶部生成的空间中。您可以通过删除图像来实现之前元素对框的实际作用。您会看到带有红色边框的蓝色框保持不变。
  • 另一个问题:为什么必须将top/left设置为50%,然后再设置translate?如果translate 缺失,图片的尺寸是多少?
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多