如何在保持图像宽高比的同时拉伸图像以填充<div>?

Gif*_*guy 190 html size image

我需要将此图像拉伸到可能的最大尺寸,而不会溢出<div>或倾斜图像.

我无法预测图像的宽高比,因此无法知道是否使用:

<img src="url" style="width: 100%;">
Run Code Online (Sandbox Code Playgroud)

要么

<img src="url" style="height: 100%;">
Run Code Online (Sandbox Code Playgroud)

我不能同时使用两者(即style ="width:100%; height:100%;")因为这将拉伸图像以适应<div>.

<div>具有的大小为屏幕,这也是不可预测的百分比来设置.

Mot*_*tie 180

2016年更新:

现代浏览器的表现要好得多.您需要做的就是将图像宽度设置为100%(演示)

.container img {
   width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

由于您不知道宽高比,因此您必须使用一些脚本.以下是我将如何使用jQuery(demo):

CSS

.container {
    width: 40%;
    height: 40%;
    background: #444;
    margin: 0 auto;
}
.container img.wide {
    max-width: 100%;
    max-height: 100%;
    height: auto;
}
.container img.tall {
    max-height: 100%;
    max-width: 100%;
    width: auto;
}?
Run Code Online (Sandbox Code Playgroud)

HTML

<div class="container">
 <img src="http://i48.tinypic.com/wrltuc.jpg" />
</div>
<br />
<br />
<div class="container">
 <img src="http://i47.tinypic.com/i1bek8.jpg" />
</div>
Run Code Online (Sandbox Code Playgroud)

脚本

$(window).load(function(){
 $('.container').find('img').each(function(){
  var imgClass = (this.width/this.height > 1) ? 'wide' : 'tall';
  $(this).addClass(imgClass);
 })
})
Run Code Online (Sandbox Code Playgroud)

  • 为什么这是公认的答案.问题是图像对于容器来说太小了.即如何放大图像以填充其容器的宽度或高度,而不会捏造图像的纵横比.此外,在您的演示中,删除`width:auto`或`height:auto`属性不会影响图像的显示.事实上,在你应用于图像的所有属性中,只有"max-width:100%"具有任何效果,它只会影响风景图像.但最重要的是,您的答案无法拉伸小图像以填充更大的容器. (13认同)

小智 74

只使用CSS和更简单的方法HTML:

HTML:

<div class="fill"></div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.fill {
    overflow: hidden;
    background-size: cover;
    background-position: center;
    background-image: url('path/to/image.jpg');
}
Run Code Online (Sandbox Code Playgroud)

这会将您的图像作为背景,并将其拉伸以适应div大小而不会失真.

  • @Alex_Zhong,你误解了宽高比。长宽比意味着图像不会在任何方向上拉伸(因此完美的圆形在宽度或高度上都不会变成椭圆形)。裁剪可能是保持纵横比的必要部分(就像在OP的用例中一样)。 (3认同)
  • 可能值得在 HTML 中包含图像 url,以便将样式和内容分开,即 `&lt;div style="background-image: url('path/to/image.jpg');" class="fill"&gt;&lt;/div&gt;` (2认同)

小智 70

不是一个完美的解决方案,但这个CSS可能有所帮助 缩放是使这个代码工作的原因,理论上理论上这个因素对于小图像来说理想上是理想的 - 但在大多数情况下,2,4或8可以正常工作.

#myImage {
    zoom: 2;  //increase if you have very small images

    display: block;
    margin: auto;

    height: auto;
    max-height: 100%;

    width: auto;
    max-width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

  • Firefox 仍然没有实现“zoom”,但这里是错误链接以供将来参考:https://bugzilla.mozilla.org/show_bug.cgi?id=390936 (2认同)

dan*_*els 30

如果可以,请使用背景图像并进行设置background-size: cover.这将使背景覆盖整个元素.

CSS

div {
  background-image: url(path/to/your/image.png);
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: cover;
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用内嵌图像,有几个选项.首先,有

对象的合

此属性作用于图像,视频和其他类似的对象background-size: cover.

CSS

img {
  object-fit: cover;
}
Run Code Online (Sandbox Code Playgroud)

可悲的是,浏览器支持并不是那么好用IE到版本11根本不支持它.下一个选项使用jQuery

CSS + jQuery

HTML

<div>
  <img src="image.png" class="cover-image">
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

div {
  height: 8em;
  width: 15em;
}
Run Code Online (Sandbox Code Playgroud)

自定义jQuery插件

(function ($) {
  $.fn.coverImage = function(contain) {
    this.each(function() {
      var $this = $(this),
        src = $this.get(0).src,
        $wrapper = $this.parent();

      if (contain) {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/contain no-repeat'
        });
      } else {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/cover no-repeat'
        });
      }

      $this.remove();
    });

    return this;
  };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

像这样使用插件

jQuery('.cover-image').coverImage();
Run Code Online (Sandbox Code Playgroud)

它将拍摄图像,将其设置为图像的包装元素上的背景图像,并img从文档中删除标记.最后你可以使用

纯CSS

您可以将其用作后备.图像将向上扩展以覆盖其容器,但不会缩小.

CSS

div {
  height: 8em;
  width: 15em;
  overflow: hidden;
}

div img {
  min-height: 100%;
  min-width: 100%;
  width: auto;
  height: auto;
  max-width: none;
  max-height: none;
  display: block;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
Run Code Online (Sandbox Code Playgroud)

希望这可能对某人有帮助,编码愉快!


Tat*_*nen 6

仅使用HTML和CSS,这是不可能的,或者至少是异国情调和复杂的.如果你愿意抛出一些javascript,这里有一个使用jQuery的解决方案:

$(function() {
    $(window).resize(function() {
        var $i = $('img#image_to_resize');
        var $c = $img.parent();
        var i_ar = $i.width() / $i.height(), c_ar = $c.width() / $c.height();            
        $i.width(i_ar > c_ar ? $c.width() : $c.height() * (i_ar));
    });
    $(window).resize();
});
Run Code Online (Sandbox Code Playgroud)

这将调整图像的大小,使其始终适合父元素,无论它的大小.当它与$(window).resize()事件结合时,当用户调整窗口大小时,图像将会调整.

这并不是试图将图像置于容器中心,这是可能的,但我想这不是你所追求的.

  • 我假设$ img.parent(); 应该是$ i.parent(); (4认同)

小智 6

您可以object-fit: cover;在父 div 上使用。

https://css-tricks.com/almanac/properties/o/object-fit/


小智 6

更新2019。

现在,您可以使用object-fit接受以下值的css属性:fill | contain | cover | none | scale-down

https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit

例如,您可能有一个保存图像的容器。

<div class="container">
    <img src="" class="container_img" />
</div>

.container {
    height: 50px;
    width: 50%;

.container_img {
    height: 100%;
    width: 100%;
    object-fit: cover;
Run Code Online (Sandbox Code Playgroud)


Chi*_*att 5

设置外部containerdiv的宽度和高度.然后在img上使用以下样式:

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

这将帮助您保持img的宽高比

  • 它不会填补div. (5认同)

Boh*_* LI 5

如果要在保持图像宽高比的同时设置最大宽度或高度(以便不会太大),则可以执行以下操作:

img{
   object-fit: contain;
   max-height: 70px;
}
Run Code Online (Sandbox Code Playgroud)