如何设置 img 的最小和最大尺寸并保持纵横比? [复制]

Posted

技术标签:

【中文标题】如何设置 img 的最小和最大尺寸并保持纵横比? [复制]【英文标题】:How do I set min and max size for img and keep aspect ratio? [duplicate] 【发布时间】:2018-09-07 06:29:42 【问题描述】:

所以我有一个img 框,用户可以在上面放一张图片。 CSS 目前确保无论图片的原始尺寸是多少,都将使用此 CSS 显示为 300x300 的图片

因此,将增加 200x200 的图像以完全适合,而将减少 400x400 的图像以完全适合 300x300 的 img 元素。

.largeartwork img 
    max-width:300px;
    max-height:300px;
    min-width:300px;
    min-height:300px;
    border: 3px solid black;

这可以正常工作,但我想要为非方形图像做的是尽可能填充空间但保持纵横比

例如,300x200(300 像素宽,200 像素高)的图像应该只填充宽度而不是高度,与 600x400 等的图像相同。

可能重复的注意事项 链接帖子上的答案已过时,效果不佳

【问题讨论】:

使用object-fit:css-tricks.com/almanac/properties/o/object-fit。最小/最大宽度无助于保持纵横比的原因是它本身就是一个悖论:非方形图像应该优先考虑哪个维度? @PeterB 该答案似乎没有适合对象的答案,在我看来这是最好的答案。 重复不是关于可能的答案,而是关于问题:-) @PeterB link 说,这个问题在这里可能已经有了答案,但主要答案已经过时了,所以用更好的答案结束这个问题会有什么好处。 然后在目标问题上开一个赏金,要求新的答案 【参考方案1】:

根据我的评论,使用最小/最大宽度和高度并不能保证保留图像的纵横比,因为在调整图像大小时,浏览器需要决定优先考虑哪个维度(水平或垂直)。由于在这种情况下它无法决定,因此任何非方形图像都将被压缩或拉伸,因为它们的纵横比与您指定的不匹配。

您的难题有两种解决方案:一种是使用object-fit,即rather widely supported but unfortunately not in Internet Explorer。示例标记如下所示:

<div class="largeartwork">
  <img src="/path/to/image" />
</div>

您的 CSS 将是:

.largeartwork img 
    width: 300px;
    height: 300px;
    border: 3px solid black;
    object-fit: contain;

请参阅下面的概念验证代码 sn-p:

.largeartwork img 
    width: 300px;
    height: 300px;
    border: 3px solid black;
    object-fit: contain;
<!-- Landscape -->
<div class="largeartwork">
  <img src="https://via.placeholder.com/350x150" />
</div>

<!-- Portrait -->
<div class="largeartwork">
  <img src="https://via.placeholder.com/150x350" />
</div>

<!-- Small square image -->
<div class="largeartwork">
  <img src="https://via.placeholder.com/100x100" />
</div>

<!-- Large square image -->
<div class="largeartwork">
  <img src="https://via.placeholder.com/400x400" />
</div>

另一种解决方案是改用background-image。您将不得不依赖 JS 将图像源作为元素的背景注入。优点是background-size: contain is very widely supported,即使在 Internet Explorer 9 中。示例代码:

<div class="largeartwork" style="background-image: url(/path/to/image);"></div>

还有你的 CSS:

.largeartwork 
    width: 300px;
    height: 300px;
    border: 3px solid black;
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center center;

请参阅下面的概念验证代码:

.largeartwork 
  width: 300px;
  height: 300px;
  border: 3px solid black;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center center;
<div class="largeartwork" style="background-image: url('https://via.placeholder.com/350x150')"></div>

<div class="largeartwork" style="background-image: url('https://via.placeholder.com/150x350')"></div>

<div class="largeartwork" style="background-image: url('https://via.placeholder.com/100x100')"></div>

<div class="largeartwork" style="background-image: url('https://via.placeholder.com/400x400')"></div>

【讨论】:

我从这个问题和你的回答中学到了一些新东西。好东西。让我看到这篇关于 IE/Edge 的 polyfill 的关于对象匹配的文章:medium.com/@primozcigler/… @Terry ,感谢 object-fit 完美运行并且操作简单,这对我来说已经足够了,IE 支持并不关心我。【参考方案2】:

当宽度或高度的最大值和最小值相同时,表示固定值如下:

.largeartwork img 
    width:300px;
    height:300px;

在你的情况下,你可以用这个方法解决你的问题:

当用户删除图像文件时,您可以检查图像的哪一侧更大,并且可以将正确的类添加到图像标记中。例如:

像这样创建 CSS 类:

.largeartwork img.biggerwidth 
    width: 300px;
    height: auto;

.largeartwork img.biggerheight 
    width: auto;
    height:300px;

当用户丢弃 200x500 像素的图像时,您可以像这样创建图像:

<img src="..." class="biggerheight">

为什么这比 background-image 和 object-fit 更好?

在这些方法中,如果图像大小没有覆盖所有元素区域,您将在元素上获得空白。由于您在元素上使用边框,因此这些方法始终会在您指定的最大尺寸周围创建边框。

【讨论】:

谢谢你的好解决方案,我理解你对对象匹配的担忧,但是空白边框对我来说不是问题,使用对象匹配比我计算图像大小要简单得多javascript 和更改 CSS。因此,为了让我的代码简洁,我将坚持使用 object-fit

以上是关于如何设置 img 的最小和最大尺寸并保持纵横比? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

保持最小/最大高度/宽度的纵横比?

如何使用 HTML IMG 标签保持纵横比

根据宽度和高度保持纵横比

根据宽度和高度保持纵横比

容器中显示的图像 - 如何按比例缩小并保持纵横比

调整图像大小以保持纵横比并使纵向和横向图像尺寸完全相同?