将图像按比例缩放以适应边界框
将图像按比例缩放以适应边界框
有没有一种只使用CSS的解决方案,可以将图像缩放到一个边界框中(保持宽高比)?如果图像比容器大,则可以使用以下方法:\n
img { max-width: 100%; max-height: 100%; }
\n示例:\n
- \n
- 用例1(有效):http://jsfiddle.net/Jp5AQ/2/
- 用例2(有效):http://jsfiddle.net/Jp5AQ/3/
\n
\n
\n但我想将图像缩放到一个维度达到容器的100%。\n
- \n
- 用例3(无效):http://jsfiddle.net/Jp5AQ/4/
\n
问题的出现原因:原始的图片大小可能超出了容器的大小,需要对图片进行缩放以适应容器的边界。
解决方法:通过CSS的样式属性对图片进行缩放和限制大小的设置,使其适应容器的边界。
代码示例:
#image { max-width: 10%; max-height: 10%; transform: scale(10); }
这段代码将图片放大十倍,但限制在最终大小的10%范围内,从而将其限制在容器内。
与背景图片的解决方案不同,这种方法也适用于视频元素。
此外,在代码中还提供了一个交互式示例,通过JavaScript实现了容器的动态变化。
这种解决方法不仅回答了问题,而且在所有现代浏览器中都能完美工作,而不需要使用JavaScript。
对于在400x400容器中放置图片的测试中,图片仅被裁剪在角落,需要添加`transform-origin: top left`以避免裁剪。
这种解决方法看起来很棒,唯一的担忧是在编码不良的浏览器中可能会导致图像质量损失,但理论上应该工作正常。
有趣的是,在Chrome中不起作用,导致图像被裁剪成一行。
如果要将图像居中在容器中,可以使用`margin: auto`进行水平居中,但对于垂直居中,只有在容器的宽度预设的情况下才有效,但这并不总是适用。
尝试了不使用缩放,只是设置`max-width: 90%; max-height: 90%`,也能正常工作。那么为什么要使用缩放呢?
这里补充了一个可运行的示例代码,缩放仅在需要放大图像时才需要(当图像小于容器的宽度或高度时)。
以上解决方法可以解决将图片缩放以适应边界框的问题,并且适用于大多数现代浏览器。
在CSS中,没有一种纯粹的方法可以同时调整图像的宽度和高度适应一个边界框。但是,可以通过添加适当的CSS类来实现这个效果。将以下代码添加到元素上,可以使元素始终具有100%的宽度,并自动按比例缩放高度:
.fillwidth { min-width: 100%; height: auto; }
相反,将以下代码添加到元素上,可以使元素始终按最大高度和相对宽度进行缩放:
.fillheight { min-height: 100%; width: auto; }
要同时实现这两个效果,需要确定元素的宽高比是高于还是低于其容器的宽高比。但是,CSS无法进行这种判断。唯一可以检测到这一点的方法是使用JavaScript。
在JavaScript中,可以通过以下代码来实现此效果。根据容器的宽高比和图像的宽高比之间的差异,添加相应的类名("fillwidth"或"fillheight"):
$('div').each(function() { var fillClass = ($(this).height() > $(this).width()) ? 'fillheight' : 'fillwidth'; $(this).find('img').addClass(fillClass); });
以上代码使用了jQuery库来简化操作,需要在页面中引入jQuery库。
另外,还可以使用CSS3的background-size属性将图像大小设置为"contain",来实现类似的效果。这种方法可以通过以下CSS样式来实现:
background-size: contain;
总结起来,要实现图像按比例缩放以适应边界框的需求,可以通过在元素上添加适当的CSS类来实现,或者使用JavaScript来动态添加类名。另外,也可以使用CSS3的background-size属性来实现类似的效果。
问题:如何将图像缩放以适应边界框?
原因:通过CSS3可以解决这个问题。将图像设置为background-image,然后将background-size设置为contain。
解决方法:
HTML:
CSS:
.bounding-box { background-image: url(...); background-repeat: no-repeat; background-size: contain; }
要将div居中对齐,可以使用以下变体:
.bounding-box { background-image: url(...); background-size: contain; position: absolute; background-position: center; background-repeat: no-repeat; height: 100%; width: 100%; }
注意事项:
- 如果不希望有任何边框,可以将background-size设置为"cover"。
- 可以使用HTML注入图像URL:
,其他样式应使用CSS应用。
- 将图像更改为background-image会删除HTML中图像的语义意义。
- 如果这样做,似乎无法在图像上添加边框。
- 如果需要使用JavaScript更改图像src,是否仍然可以使用image: url?
- 是否将图像标签放在容器内(并以某种方式隐藏),然后再使用这个技巧会更好?
- 对于IE8,可以使用一个polyfill。
实际例子:
- 语义的重要性在于,如果有人想要打印网页,至少Chrome默认似乎会忽略这样的背景图像,这在语义上是有意义的。在当今世界上,几乎没有不支持的浏览器,最好使用object-fit方法。