仅使用CSS实现max-height和max-width功能

36

这是我在这里发布的第一篇文章。

我正在使用一个div来裁剪所有缩略图的比例,都为180宽x170高。但是当处理纵向和横向的图片时遇到了困难。如果我使用以下代码,那么对于纵向样式的图片来说是可以的:

.crop img {max-height:170px; width:auto} 

...并且适用于横向风格的图片:

.crop img {max-width:180px; height: auto;} is fine for landscape style images.  

我想要根据图片的横竖屏来裁剪其两侧或上下部分,就像优先使用最大高度和宽度一样。

我知道可以用PHP很容易地实现这一点,但我只熟悉CSS,所以我首选CSS。

我需要保持图片的长宽比。


创建一个 jsfiddle,看看是否可以在同一声明中使用 max-heightmax-width - alexvance
6个回答

92

在经历了许多其他“解决方案”之后,得出的解决方案。

max-width:100%;
max-height:100%;
height: auto;
width:auto;

7
这实际上很不错,应该是答案。在我的情况下非常有用,因为HTML不是来自我自己,而是外部来源(所以我无法切换到背景图像)。 - Luke Vo
1
是的 - 在折腾 jQuery 并试图弄清楚某些东西是横向还是纵向之后,我简直不敢相信它如此简单! - v3nt
1
多年来一直在折腾这个问题,没想到解决方案竟然如此简单。甚至在IE9中也能正常工作... - nils
这对我完全奏效了!即使将最大宽度和最大高度设置为像素值。我有点尴尬,我没有在几年前就想到这个。 - Evster
您,先生,刚刚为我节省了很多时间!谢谢 :) - Freezy
对我来说不起作用。无法裁剪和缩放(保持纵横比)图像以适应固定宽度,而这通常是您希望对许多图像进行的操作。 - David Spector

24

2019年更新:

如果你想保留<img>标签,请查看object-fit CSS属性,它在各种浏览器上的支持非常好。

如果你想在改变宽度时保持纵横比,请尝试使用padding-hack


我理解你有一个180x170像素的块,并且你想要完全用图像填充它。试着将图片移到背景中并使用background-size:cover

演示:http://jsfiddle.net/heuku/1/

<div style="background-image:url(http://placekitten.com/100/200)"></div>
<div style="background-image:url(http://placekitten.com/200/100)"></div>
<div style="background-image:url(http://placekitten.com/200/200)"></div>

div {
  width:180px;
  height:170px;
  background-repeat:no-repeat;
  background-size:cover;
}

请注意,此解决方案在IE8及以下版本中无效。


谢谢@antejan!我得回去编辑很多帖子,但这个方法确实管用。 - Andy Blanc
2
object-fit 的一个很好的技巧。 - Mabyn

3

编辑:我已经改进了解决方案,请参见此处:https://dev59.com/OnA75IYBdhLWcg3w7tx6#34774905


我正在使用这个解决方案,我在尝试将图片适配并居中到正方形(或其他)时找到它的。它与容器设置padding-bottom和height 0的组合非常出色- 这使其具有固定比例的响应性。

适用于IE9及更高版本。 对于IE8及以下版本,需要一些CSS技巧。

HTML

.container {
    height: 0;
    padding-bottom: 100%; /* Or 75% for 4:3 aspect ratio */
    position: relative;
    overflow: hidden;
}
.container img {
    display: inline-block;
    max-width: 90%; /* You can use different numbers for max-width and max-height! */
    max-height: 75%;
    width: auto;
    height: auto;

    position: absolute;
    left: 50%; /* This sets left top corner of the image to the center of the block... */
    top: 50%; /* This can be set also to bottom: 0; for aligning image to bottom line. Only translateX is used then. */
    -webkit-transform: translate(-50%,-50%); /* ...and this moves the image 50 % of its width and height back. */
    -ms-transform: translate(-50%,-50%);
    -o-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);
}

/* Fallback for IE8 */
@media all\0 { 
    .container img {
        margin: auto;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
    }
}

在这里尝试一下:http://jsfiddle.net/thiemeljiri/uhdm4fce/4/

注意:如果使用Bootstrap,请将类“ .container ”更改为其他名称。


2

您可以尝试

.crop img {max-height:170px; max-width:180px;}

由于max-heightmax-width是最大值,因此应该可以工作。浏览器将尽可能使图像变大,而不会超过您的尺寸。

请注意,这未经测试,但基于此W3Schools页面

希望这可以帮助!


5
我尝试过这样做,但如果两个尺寸都超过了最大高度/宽度,则图像会失去其长宽比,因为它会同时按比例缩放。(我应该在原帖中提到保持长宽比是首要任务。) - Andy Blanc

0

你已经拥有答案!

尝试:

.crop img {max-height: 170px; max-width: 180px;}

根据我之前的回答,如果两个维度都超过了设置的最大值,它会失去纵横比,这是我想要避免的。 - Andy Blanc
@AndyBlanc,我已经在问题中添加了这些信息,请告诉我们您正在使用哪个浏览器。 - Praveen Kumar Purushothaman
我正在使用Firefox 18进行开发,但已在Safari和Chrome上进行了测试并获得了相同的结果。如果两个维度都超过了最大值,它似乎会缩放并失去比例。如果一个维度被缩放而另一个仍然低于最大设置,则显示空白空间,这也是我试图避免的。 - Andy Blanc
明白了...让我们看看是否有解决方案。据我所知,目前还没有。 - Praveen Kumar Purushothaman

-1
这可能有点晚了,但我发现将所述图像包装在<figure>中可以保持其宽高比例缩放。

1
请添加一些描述。 - Mathews Sunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接