【问题标题】:How can I fill a div with an image while keeping it proportional?如何在保持图像比例的同时用图像填充 div?
【发布时间】:2012-12-18 00:28:56
【问题描述】:

我发现这个帖子——How do you stretch an image to fill a <div> while keeping the image's aspect-ratio?——这并不完全是我想要的。

我有一个特定大小的 div 和其中的图像。无论图像是横向还是纵向,我都希望始终用图像填充 div。并且图像是否被截断也没关系(div本身已经隐藏了溢出)。

因此,如果图像是纵向的,我希望 width100%height:auto,以便保持成比例。如果图像是横向的,我希望 height100%width to beauto`。听起来很复杂吧?

<div class="container">
   <img src="some-image.jpg" alt="Could be portrait or landscape"/>
</div>

由于我不知道该怎么做,我只是简单地创建了一个快速图像来表达我的意思。我什至无法恰当地描述它。

所以,我想我不是第一个提出这个问题的人。但是我真的找不到解决方案。也许有一些新的 CSS3 方法可以做到这一点 - 我正在考虑 flex-box。任何想法?也许它比我预期的更容易?

【问题讨论】:

  • 当您仍然可以轻松使用 javascript 时,为什么还要使用 css3?和 js 伙伴一起去吧..
  • 未经测试,但您可以尝试将最小高度和最小宽度设置为 100%?那至少应该填满盒子并保持比例

标签: css image positioning


【解决方案1】:

我想出的一个简单方法是在容器内的 img 上使用 object-fit: cover

<div class="container"> 
  <img class="image" src="https://mymodernmet.com/wp/wp-content/uploads/2020/11/International-Landscape-Photographer-Year-PhotographER-1st-KelvinYuen-2.jpg">
</div>
.image { 
  height: 100%;
  width: 100%;
  object-fit: cover
}

.container {
  height: 100px; /*Set any dimensions you like*/
  width: 50px;
}

据我测试,无论要使用的图像尺寸如何,这都有效,并且满足您在问题中所述的“最佳情况”,因为结果是垂直和水平居中的。

【讨论】:

    【解决方案2】:

    有点晚了,但我也遇到了同样的问题,最后在另一个 stackoverflow 帖子 (https://stackoverflow.com/a/29103071) 的帮助下解决了。

    img {
       object-fit: cover;
       width: 50px;
       height: 100px;
    }
    

    希望这仍然对某人有所帮助。

    Ps: 也可以和 max-heightmax-widthmin-widthmin-height em> css 属性。使用 100%100vh/100vw 等长度单位来填充容器或整个浏览器窗口非常方便。

    【讨论】:

    【解决方案3】:

    这是一个使用object-fit支持IE的答案,所以你不会失去比率

    使用简单的 JS sn-p 检测是否支持object-fit,然后将img 替换为svg

    //ES6 version
    if ('objectFit' in document.documentElement.style === false) {
      document.addEventListener('DOMContentLoaded', () => {
        document.querySelectorAll('img[data-object-fit]').forEach(image => {
          (image.runtimeStyle || image.style).background = `url("${image.src}") no-repeat 50%/${image.currentStyle ? image.currentStyle['object-fit'] : image.getAttribute('data-object-fit')}`
          image.src = `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='${image.width}' height='${image.height}'%3E%3C/svg%3E`
        })
      })
    }
    
    //ES5 version
    if ('objectFit' in document.documentElement.style === false) {
      document.addEventListener('DOMContentLoaded', function() {
        Array.prototype.forEach.call(document.querySelectorAll('img[data-object-fit]').forEach(function(image) {
          (image.runtimeStyle || image.style).background = "url(\"".concat(image.src, "\") no-repeat 50%/").concat(image.currentStyle ? image.currentStyle['object-fit'] : image.getAttribute('data-object-fit'));
          image.src = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='".concat(image.width, "' height='").concat(image.height, "'%3E%3C/svg%3E");
        }));
      });
    }
    img {
      display: inline-flex;
      width: 175px;
      height: 175px;
      margin-right: 10px;
      border: 1px solid red
    }
    
    
    /*for browsers which support object fit */
    
    [data-object-fit='cover'] {
      object-fit: cover
    }
    
    [data-object-fit='contain'] {
      object-fit: contain
    }
    <img data-object-fit='cover' src='//picsum.photos/1200/600' />
    <img data-object-fit='contain' src='//picsum.photos/1200/600' />
    <img src='//picsum.photos/1200/600' />

    注意:还有一些object-fit polyfill 可以让object-fit 工作。

    这里有几个例子:

    【讨论】:

    • 请原谅,我忘记了。我现在知道了。谢谢!
    【解决方案4】:

    如果我正确理解你想要什么,你可以离开图像的宽度和高度属性以保持纵横比并使用 flexbox 为你做居中。

    .fill {
        display: flex;
        justify-content: center;
        align-items: center;
        overflow: hidden
    }
    .fill img {
        flex-shrink: 0;
        min-width: 100%;
        min-height: 100%
    }
    <div class="fill">
        <img src="https://picsum.photos/id/237/320/240" alt="" />
    </div>

    JSFiddle here

    我在 IE9、Chrome 31 和 Opera 18 中测试成功。但没有测试其他浏览器。与往常一样,您必须考虑您的特定支持要求。

    【讨论】:

    • 在 IE9 中,使用此方法图像不垂直或水平居中,它与顶部和左侧对齐。 i59.tinypic.com/ouo77s.png
    • 这在 iPad 上有一个问题,看起来 safari 会将图像拉伸到其高度的 100%,但不保留 min-width 属性。
    • 这似乎将小图像放大以填充,但不能缩小以适应。至少当我使用大图时,它只显示了一小部分。
    • 为了缩小大图以适应,我在图像上使用了以下内容:.fill img { min-height:100%; min-width: 100%; object-fit: cover; }
    • 超级英雄! :D
    【解决方案5】:

    您可以使用 css flex 属性来实现这一点。请看下面的代码

    .img-container {
      border: 2px solid red;
      justify-content: center;
      display: flex;
      flex-direction: row;
      overflow: hidden;
      
    }
    .img-container .img-to-fit {
      flex: 1;
      height: 100%;
    }
    <div class="img-container">
      <img class="img-to-fit" src="https://images.pexels.com/photos/8633/nature-tree-green-pine.jpg" />
    </div>

    【讨论】:

    • 这仅在您删除其他一些答案中提到的宽度和高度属性时才有效。
    【解决方案6】:

    只需固定图像的高度并提供 width = auto

    img{
        height: 95vh;
        width: auto;
    }
    

    【讨论】:

      【解决方案7】:

      .image-wrapper{
          width: 100px;
          height: 100px;
          border: 1px solid #ddd;
      }
      .image-wrapper img {
          object-fit: contain;
          min-width: 100%;
          min-height: 100%;
          width: auto;
          height: auto;
          max-width: 100%;
          max-height: 100%;
      }
      <div class="image-wrapper">
        <img src="">
      </div>

      【讨论】:

      • 在基于 Chromium 的浏览器中似乎不需要 width: auto; height: auto。这是唯一适用于两个维度以及object-fit: containobject-fit: cover 的答案。
      【解决方案8】:

      以下所有答案都有固定的宽度和高度,这使得解决方案“没有响应”。

      为了实现结果但保持图像响应,我使用了以下内容:

      1. 在容器内放置所需比例的透明 gif 图像
      2. 为图片标签提供内联 CSS 背景,其中包含您要调整大小和裁剪的图片

      HTML:

      <div class="container">
          <img style="background-image: url("https://i.imgur.com/XOmNCwY.jpg");" src="img/blank.gif">
      </div> 
      
      
      .container img{
         width: 100%;
         height: auto;
         background-size: cover;
         background-repeat: no-repeat;
         background-position: center;
      }​
      

      【讨论】:

      • 我为我的整个设计组合公司网站使用了 background-image,这样我就可以拥有 background-size: 封面。现在我的图片搜索引擎优化都搞砸了,因为谷歌无法识别背景图片。我希望我用另一种方式编码。
      • 对于我的将其放入网格布局中的单元格的情况,最好的答案。它会因水平拉伸而不是垂直拉伸而变形,因为它会放置空白空间以避免垂直拉伸(对高度进行了更改max-height: 100%;),包括max-width:100% 保持原来在图像中的比例,但如果窗口更改它没有填充
      【解决方案9】:

      我实现所描述的“最佳情况”场景的唯一方法是将图像作为背景:

      <div class="container"></div>​
      
      .container {
          width: 150px;
          height: 100px;
          background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
          background-size: cover;
          background-repeat: no-repeat;
          background-position: 50% 50%;
      }​
      

      【讨论】:

        【解决方案10】:

        CSS object-fit: coverobject-position: left center 属性值现在解决了这个问题。

        【讨论】:

          【解决方案11】:

          您可以使用 div 来实现这一点。没有 img 标签 :) 希望这会有所帮助。

          .img{
          	width:100px;
          	height:100px;
          	background-image:url('http://www.mandalas.com/mandala/htdocs/images/Lrg_image_Pages/Flowers/Large_Orange_Lotus_8.jpg');
          	background-repeat:no-repeat;
          	background-position:center center;
          	border:1px solid red;
          	background-size:cover;
          }
          .img1{
          	width:100px;
          	height:100px;
          	background-image:url('https://images.freeimages.com/images/large-previews/9a4/large-pumpkin-1387927.jpg');
          	background-repeat:no-repeat;
          	background-position:center center;
          	border:1px solid red;
          	background-size:cover;
          }
          <div class="img">	
          </div>
          <div class="img1">	
          </div>

          【讨论】:

            【解决方案12】:

            试试这个:

            img {
              position: relative;
              left: 50%;
              min-width: 100%;
              min-height: 100%;
              transform: translateX(-50%);
            }
            

            希望对你有帮助

            【讨论】:

              【解决方案13】:

              应该这样做:

              img {    
              min-width: 100%;
              min-height: 100%;
              width: auto;
              height: auto;
              }
              

              【讨论】:

              • 对我来说效果很好,在我的情况下,我只需要添加 position:absolute 和 top:0 以及一些 z-index
              • 非常简单和干净的解决方案,无需使用固定 px 作为高度或宽度。
              【解决方案14】:

              一个老问题,但值得更新,因为现在有办法。

              正确的基于 CSS 的答案是使用 object-fit: cover,其工作方式类似于 background-size: cover。定位将由object-position 属性处理,默认为居中。

              但是在任何 IE / Edge 浏览器或 Android object-position。 Polyfill 确实存在,object-fit-images 似乎提供了最好的支持。

              有关该属性如何工作的更多详细信息,请参阅CSS Tricks article on object-fit 以获取说明和演示。

              【讨论】:

                【解决方案15】:

                这里有我的工作示例。我使用了一个技巧,即使用 background-size:cover 和 background-position:center center 将图像设置为 div 容器的背景

                我已经放置了宽度:100% 和不透明度:0 的图像,使其不可见。请注意,我展示我的图片只是因为我对调用子点击事件特别感兴趣。

                请注意,尽管我使用的是角度,但它完全无关紧要。

                <div class="foto-item" ng-style="{'background-image':'url('+foto.path+')'}">
                    <img class="materialboxed" ng-class="foto.picid" ng-src="{{foto.path}}" style="opacity: 0;filter: alpha(opacity=0);" width="100%" onclick="$('.materialboxed')/>
                 </div>
                <style>
                .foto-item {
                height: 75% !important;
                width: 100%;
                position: absolute;
                top: 0;
                left: 0;
                overflow:hidden;
                background-size: cover;
                background-position: center center;
                }
                </style>
                

                结果是您在所有情况下定义为最佳的结果

                【讨论】:

                  【解决方案16】:

                  考虑将background-size: cover (IE9+) 与background-image 结合使用。对于 IE8-,有一个polyfill

                  【讨论】:

                  • 这不需要背景网址吗?你能详细说明一下吗?这可以与问题中所述的 一起使用吗?
                  • @harsimranb 当然,background-size 仅在指定 background-image 时才有意义(我已经相应地更新了我的答案)。它不适用于IMG 元素。
                  • 这是最好的答案。它很简单并且有很好的浏览器支持。所有其他解决方案要么非常复杂,要么在 IE(9) 中不起作用。
                  猜你喜欢
                  • 2010-12-25
                  • 2016-12-31
                  • 2015-11-03
                  • 1970-01-01
                  • 2016-08-20
                  • 2021-11-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多