【问题标题】:How to set an image's width and height without stretching it?如何在不拉伸图像的情况下设置图像的宽度和高度?
【发布时间】:2010-12-16 12:32:18
【问题描述】:

如果我有:

#logo {
    width: 400px;
    height: 200px;
}

然后

<img id="logo" src="logo.jpg"/>

将拉伸以填充该空间。我希望图像保持相同大小,但要占用 DOM 中的那么多空间。是否必须添加封装&lt;div&gt;&lt;span&gt;?我讨厌为样式添加标记。

【问题讨论】:

  • 如果您还在 Stack Overflow 上,是否要考虑更新答案?

标签: html css


【解决方案1】:

是的,你需要一个封装的 div:

<div id="logo"><img src="logo.jpg"></div>

类似:

#logo { height: 100px; width: 200px; overflow: hidden; }

其他解决方案(填充、边距)更繁琐(因为您需要根据图像的尺寸计算正确的值)但也不能有效地允许容器小于图像。

此外,上述内容可以更轻松地适应不同的布局。例如,如果你想要右下角的图像:

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }

【讨论】:

  • 您可以将
    标签替换为
    :添加语义,如有必要,您可以为其添加标题 (
    )。 developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
  • 另外,如果是用于品牌推广,在网站展示中,使用

    (如果是 index)或

    (如果其他),将 title 和 alt 属性应用于 ,因此您可以添加 SEO 友好的标记。它们也是块级元素,例如 div,可以作为裁剪功能的包装器。

  • 我不知道 Cletus 是一名网络开发人员。惊人的
【解决方案2】:

2017 年答案

CSS object fit 适用于所有当前浏览器。它允许img 元素更大而不拉伸图像。

您可以将object-fit: cover; 添加到您的 CSS。

【讨论】:

【解决方案3】:

加载图像作为 div 的背景。

代替:

<img id='logo' src='picture.jpg'>

<div id='logo' style='background:url(picture.jpg)'></div>

所有浏览器都会裁剪图片中不适合的部分。
与将其包装为隐藏溢出的元素相比,这有几个优点:

  1. 没有额外的标记。 div 只是替换了 img。
  2. 轻松居中或将图像设置为其他偏移。例如。 url(pic) center top;
  3. 在足够小的时候重复图像。 (好吧,我不知道,你为什么想要那个)
  4. 在同一语句中设置背景颜色,轻松将同一图像应用于多个元素,以及适用于背景图像的所有内容。

更新:这个答案来自 object-fit 之前;您现在应该使用 object-fit/object-position。

对于旧版浏览器、额外属性(例如 background-repeat)和边缘情况(例如,解决 Chrome 的 flexbox 和 object-position 错误以及 FF(以前?)grid + autoheight 问题)仍然有用+ object-fit. grid / flexbox 中的包装器 div 经常给出......不直观的结果。)

【讨论】:

  • 那些给-1的人为了其他用户的利益请解释一下。就个人而言,即使在 IE6 和 iOS 上的 Safari 上,也取得了出色的效果。
  • 只是想添加 - 这通常是一个好方法。人们甚至指定图像精灵表的背景位置坐标作为优化。然而,一个区别是它没有 具有的错误事件处理程序
  • 我还在 div 中添加了一个类,其中包含以下内容:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
  • 某些浏览器默认不会打印背景图片,因此如果您想让用户打印该页面,这可能不是一个好方法。
  • 这在语义上不正确。如果这很有用,为什么 HTML5 会放置更多与图像相关的标签,以优化语义,使用 figcaption、picture?使用设计的 img 标签,并停止用
    s. 替换所有内容
【解决方案4】:

CSS3 对象适配

我不确定 webkit、IE 和 firefox 实现了多远。但 Opera 就像魔法一样工作

object-fit 适用于 SVG 内容,但也可以通过在 SVG 本身中设置 preserveAspectRatio="" 属性来实现相同的效果。

img {
  height: 100px;
  width: 100px;
  -o-object-fit: contain;
}

Chris Mills 演示在这里 http://dev.opera.com/articles/view/css3-object-fit-object-position/

【讨论】:

  • 1+ 这真的很酷。太糟糕了 limited support.. 看起来 Chrome 32 是第一个在没有供应商前缀的情况下支持它的。
  • 这太棒了,就像一个魅力。只需添加一个属性即可解决所有问题。我只需要 Chrome 就可以了。是的,没有供应商前缀。谢谢。
【解决方案5】:
#logo {
    width: 400px;
    height: 200px;

    /*Scale down will take the necessary specified space that is 400px x 200px without stretching the image*/
    object-fit:scale-down;
}

【讨论】:

    【解决方案6】:

    制作一个 div 并给它一个类。然后在里面放一个img。

    <div class="mydiv">
    
    <img src="location/of/your/image" ></img>
    
    </div>
    

    设置 div 的大小并使其相对。

        .mydiv {
            position: relative;
            height:300px;
            width: 100%;
            overflow: hidden;
        }
    

    然后为您的图像设置样式

    img {
        width: 100%;
        height: auto;
        overflow: hidden;
    }
    

    希望有帮助

    【讨论】:

      【解决方案7】:

      你可以如下使用:

      .width100 {
        max-width: 100px;
        height: 100px;
        width: auto;
        border: solid red;
      }
      &lt;img src="https://www.gravatar.com/avatar/dc48e9b92e4210d7a3131b3ef46eb8b1?s=512&amp;d=identicon&amp;r=PG" class="width100" /&gt;

      【讨论】:

        【解决方案8】:

        我必须添加封装

        吗?

        我想你会的。唯一想到的是填充,但为此您必须事先知道图像的尺寸。

        【讨论】:

          【解决方案9】:

          您可以尝试设置填充而不是高度/宽度。

          【讨论】:

            【解决方案10】:

            我能想到的是拉伸宽度或高度,并让它按比例调整大小。两边会有一些空白。类似于宽屏如何显示 1024x768 的分辨率。

            【讨论】:

              【解决方案11】:

              如果使用 flexbox 对您来说是一个有效的选择(不需要支持旧浏览器),请查看我的另一个答案 here(可能与这个答案重复):

              基本上你需要将你的 img 标签包装在一个 div 中,你的 css 看起来像这样:

              .img__container {
                  display: flex;
                  padding: 15px 12px;
                  box-sizing: border-box;
                  width: 400px; height: 200px;
              
                  img {
                      margin: auto;
                      max-width: 100%;
                      max-height: 100%;
                  }
              }
              

              【讨论】:

                【解决方案12】:

                这是一个相当老的问题,但我遇到了完全相同的烦人问题,Chrome/Edge 一切正常(具有对象匹配属性),但相同的 css 属性在 IE11 中不起作用(因为它在 IE11 中不受支持),我最终使用了 HTML5“figure”元素,它解决了我所有的问题。

                我个人没有使用外部 DIV 标记,因为这对我的情况根本没有帮助,所以我避免使用外部 DIV 并简单地替换为 'figure' 元素。

                下面的代码强制图像很好地缩小/缩小(不改变原始纵横比)。

                <figure class="figure-class">
                  <img class="image-class" src="{{photoURL}}" />
                </figure>
                

                和 css 类:

                .image-class {
                    border: 6px solid #E8E8E8;
                    max-width: 189px;
                    max-height: 189px;
                }
                
                .figure-class {
                    width: 189px;
                    height: 189px;
                }
                

                【讨论】:

                  【解决方案13】:
                  <img style="object-fit: contain" src="...">
                  

                  非常适合我。

                  【讨论】:

                    猜你喜欢
                    相关资源
                    最近更新 更多
                    热门标签