缩放图像以适合边界框

Tho*_*ory 109 html css resize image autoresize

是否有一个仅限CSS的解决方案将图像缩放到边界框(保持纵横比)?如果图像大于容器,则此方法有效:

img {
  max-width: 100%;
  max-height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

例:

但我想扩大图像,直到尺寸为容器的100%.

Tho*_*ory 164

感谢CSS3有一个解决方案!

解决方案是将图像放入background-image,然后将其设置background-sizecontain.

HTML

<div class='bounding-box'>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

.bounding-box {
  background-image: url(...);
  background-repeat: no-repeat;
  background-size: contain;
}
Run Code Online (Sandbox Code Playgroud)

在这里测试一下:http://www.w3schools.com/cssref/playit.asp?filename = playcss_background-size&prevval/contain

与最新浏览器完全兼容:http://caniuse.com/background-img-opts

要将div对齐在中心,您可以使用以下变体:

.bounding-box {
  background-image: url(...);
  background-size: contain;
  position: absolute;
  background-position: center;
  background-repeat: no-repeat;
  height: 100%;
  width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

  • @animuson:它仍然帮助了我,因为我正在使用HTML/CSS打印报告,并且无法提供有关语义的庸医:) (14认同)
  • 我会说这是一种可怕的方法.通过将其更改为背景图像,您将删除HTML中图像的语义含义. (12认同)
  • 如果您不想要任何信箱,请将其设置为"cover":background-size:contain; (6认同)
  • 应该注意的是,您可以使用HTML注入图像URL:`<div class = image style ="background-image:url('/ images/foo.jpg');"> </ div>`.所有其他样式都应该使用CSS. (3认同)

Ste*_*ler 91

注意:尽管这是接受的答案,但下面的答案更准确,如果您可以选择使用背景图像,目前所有浏览器都支持此答案.

不,没有CSS只能在两个方向上执行此操作.你可以添加

.fillwidth {
    min-width: 100%;
    height: auto;
}
Run Code Online (Sandbox Code Playgroud)

对于一个元素,它始终具有100%宽度并自动将高度缩放到纵横比,或者反之:

.fillheight {
    min-height: 100%; 
    width: auto;
}
Run Code Online (Sandbox Code Playgroud)

始终缩放到最大高度和相对宽度.要做到这两点,您需要确定宽高比是高于还是低于它的容器,而CSS无法做到这一点.

原因是CSS不知道页面是什么样的.它预先设置规则,但只有在那之后,元素才会被渲染,并且您确切地知道您正在处理的大小和比率.检测它的唯一方法是使用JavaScript.


虽然您不是在寻找JS解决方案,但如果有人可能需要,我会添加一个.使用JavaScript处理此问题的最简单方法是根据比率差异添加一个类.如果框的宽高比大于图像的宽高比,则添加"fillwidth"类,否则添加"fillheight"类.

$('div').each(function() {
  var fillClass = ($(this).height() > $(this).width()) 
    ? 'fillheight'
    : 'fillwidth';
  $(this).find('img').addClass(fillClass);
});
Run Code Online (Sandbox Code Playgroud)
.fillwidth { 
  width: 100%; 
  height: auto; 
}
.fillheight { 
  height: 100%; 
  width: auto; 
}

div {
  border: 1px solid black;
  overflow: hidden;
}

.tower {
  width: 100px;
  height: 200px;
}

.trailer {
  width: 200px;
  height: 100px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="tower">
  <img src="http://placekitten.com/150/150" />
</div>
<div class="trailer">
  <img src="http://placekitten.com/150/150" />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 实际上有一个解决方案:设置要包含的CSS3 background-size.看我的回答. (7认同)
  • 我认为这是问题的正确答案,这就是img标签的CSS.这是相关的,因为在语义上img标签是内容,作为div的背景的图像不是.虽然有些情况会使这种情况变得不切实际(如果你不知道图像与容器的比例),对其他情况来说这是恰到好处的.谢谢. (4认同)

Vla*_*eev 35

这是我发现的一个hackish解决方案:

#image {
    max-width: 10%;
    max-height: 10%;
    transform: scale(10);
}
Run Code Online (Sandbox Code Playgroud)

这会将图像放大十倍,但将其限制在最终尺寸的10% - 从而将其限制在容器中.

background-image解决方案不同,这也适用于<video>元素.

  • 很好的答案!@Yashua你需要添加`transform-origin:top left`来停止裁剪./僵尸 (3认同)
  • 我很想看到一个小提琴。在我将 img 放入 400x400 容器的测试中,img 只是在角落被裁剪 (2认同)

Gle*_*ard 22

今天,只说对象适合:包含.支持就是IE:http://caniuse.com/#feat=object-fit

  • 除了拼写错误或链接断开之外,不要编辑其他人的答案来解决问题.在SO回答中,我不会说"像废话浏览器有一个填充"这样幼稚的东西,而且我不喜欢我的答案被编辑,使它看起来像我说的那样.如果你想用你的话,把它们放在你自己的答案中. (8认同)
  • 在撰写本文时(2016年12月9日上午10:56),IE仅占有约16%的市场份额并且继续减少,所以这对我来说是最好的答案:D (3认同)

Dek*_*eke 6

的HTML:

    <div class="container">
      <img class="flowerImg" src="flower.jpg">
    </div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.container{
  width: 100px;
  height: 100px;
}


.flowerImg{
  width: 100px;
  height: 100px;
  object-fit: cover;
  /*object-fit: contain;
  object-fit: scale-down;
  object-position: -10% 0;
  object-fit: none;
  object-fit: fill;*/
}
Run Code Online (Sandbox Code Playgroud)


gab*_*ldi 5

您可以使用纯 CSS 和完整的浏览器支持来实现这一点,同时支持纵向和横向长的图像。

这是一个适用于 Chrome、Firefox 和 Safari 的代码段(使用object-fit: scale-down和不使用它):

figure {
  margin: 0;
}

.container {
  display: table-cell;
  vertical-align: middle;
  width: 80px;
  height: 80px;
  border: 1px solid #aaa;
}

.container_image {
  display: block;
  max-width: 100%;
  max-height: 100%;
  margin-left: auto;
  margin-right: auto;
}

.container2_image2 {
  width: 80px;
  height: 80px;
  object-fit: scale-down;
  border: 1px solid #aaa;
}
Run Code Online (Sandbox Code Playgroud)
Without `object-fit: scale-down`:

<br>
<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>

<br> Using `object-fit: scale-down`:

<br>
<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>
Run Code Online (Sandbox Code Playgroud)