ChatGPT解决这个技术问题 Extra ChatGPT

CSS强制图像调整大小并保持纵横比

我正在处理图像,但遇到了纵横比问题。

<img src="big_image.jpg" width="900" height="600" alt="" />

如您所见,heightwidth 已指定。我为图像添加了 CSS 规则:

img {
  max-width: 500px;
}

但对于 big_image.jpg,我收到 width=500height=600。如何设置要调整大小的图像,同时保持它们的纵横比。


F
Flimm

img {显示:块;最大宽度:230px;最大高度:95px;宽度:自动;高度:自动; }

此图像最初为 400x400 像素,但应通过 CSS 调整大小:

如果图像对于指定区域太大,这将使图像缩小(缺点,它不会放大图像)。


是否有一个版本可以放大图像以适应其容器?我已经尝试将最大宽度/最大高度作为自动宽度/高度的数字,但正如 setec 上面所说,它不会放大图像。我也尝试过使用最小宽度/最小高度。我只是无法正确组合。我只是希望无论我必须放入此容器中的任何图像,它都会以可能的最大尺寸显示而不改变纵横比,无论这是否涉及缩小或扩大图像来实现这一点。
似乎不再需要 display: block 。
请注意,问题是关于本身包含宽度和高度的 <img>,我认为这意味着您需要使用 !important 来规避标签宽度/高度信息。
@AlexisWilke CSS 规则覆盖 html 属性。 !important 不是必需的。
在 Chrome 上使用它,对我不起作用,即使使用 !important
m
matty

我一直在努力解决这个问题,最终得出了这个简单的解决方案:

object-fit: cover;
width: 100%;
height: 250px;

您可以根据需要调整宽度和高度,并且 object-fit 属性将为您进行裁剪。

有关 object-fit 属性的可能值和兼容性表的更多信息,请参见此处:https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

干杯。


object-fit 太棒了,很棒的提示!如果有人想知道 IE 的兼容性,有一些很好的 polyfill 库。
可爱,但请记住这个does not work for IE
您还可以使用 object-fit: contain 并指定宽度或高度!
到目前为止我能找到的 Best 解决方案。尝试了许多排列和组合。发现使用 style="object-fit: cover; max-width:100%; height:60px;" 时,当要求在表 <td> 中显示图像时,图像就像手套一样合适。 height 值仅用于演示。关键是,无论图像的原始尺寸如何,使用它我的行高都保持不变。
天哪,这是我十多年来一直面临的一个反复出现的问题,没有任何解决方案像 object-fit: contain 那样优雅。太感谢了!!!!!!!!!!!!!!!
A
Aternus

下面的解决方案将允许放大和缩小图像,具体取决于父框的宽度。

所有图像都有一个固定宽度的父容器,仅用于演示目的。在生产中,这将是父框的宽度。

最佳实践(2018 年):

此解决方案告诉浏览器以最大可用宽度呈现图像,并将高度调整为该宽度的百分比。

.parent { 宽度:100px; } img { 显示:块;宽度:100%;高度:自动; }

此图像最初为 400x400 像素,但应通过 CSS 调整大小:

更高级的解决方案:

使用更高级的解决方案,您将能够裁剪图像而不管其大小,并添加背景颜色以补偿裁剪。

.parent { 宽度:100px; } .container { 显示:块;宽度:100%;高度:自动;位置:相对;溢出:隐藏;填充:34.37% 0 0 0; /* 34.37% = 100 / (w / h) = 100 / (640 / 220) */ } .container img { display: block;最大宽度:100%;最大高度:100%;位置:绝对;顶部:0;底部:0;左:0;右:0; }

此图像最初为 640x220,但应通过 CSS 调整大小:

对于指定填充的行,需要计算图像的纵横比,例如:

640px (w) = 100%
220px (h) = ?

640/220 = 2.909
100/2.909 = 34.37%

因此,顶部填充 = 34.37%。


它可以工作,但在大多数用途中应该是 max-width:100% 而不是宽度。
我认为这里不需要 !important
父级设置为 100px。这将如何响应?
@Remi 用于演示目的。我在答案的顶部添加了一个说明。
@Flimm 它以前用于兼容性问题,在 2016 年不再需要。
H
Hoffmann

background-size 属性仅 ie>=9,但如果这对您来说没问题,您可以使用带有 background-image 的 div 并设置 background-size: contain

div.image{
    background-image: url("your/url/here");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
}

现在您可以将您的 div 大小设置为您想要的任何大小,并且图像不仅会保持其纵横比,而且还会在 div 中垂直和水平集中。只是不要忘记在 css 上设置大小,因为 div 在标签本身上没有宽度/高度属性。

这种方法与 setecs 答案不同,使用它,图像区域将是恒定的并由您定义(根据 div 大小和图像纵横比在水平或垂直方向留下空白),而 setecs 答案将为您提供一个完全符合缩放图像的大小(没有空格)。

编辑:根据 MDN background-size documentation,您可以使用专有过滤器声明模拟 IE8 中的 background-size 属性:

尽管 Internet Explorer 8 不支持 background-size 属性,但可以使用非标准的 -ms-filter 函数来模拟它的一些功能:

-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='path_relative_to_the_HTML_file', sizingMethod='scale')";

最后是一个 CSS 唯一的解决方案,可以在保持纵横比的同时最大化图像,谢谢。幸运的是,9 之前的 IE 越来越不重要。
很好的解决方案,谢谢!另请注意,如果您想完全填充 div 并裁剪不符合比例的额外像素,则可以将 'contain' 替换为 'cover'
这应该是正确的答案。我喜欢这个解决方案。它保持您的比例并且易于理解。
虽然这是以编程方式的正确答案,但如果图像以这种方式“重要”,则您没有 img 属性,因此您正在扼杀 SEO。
伟大的!这是这些解决方案中唯一适用于纵向和横向图像以及图像的纵向和横向容器(例如根据窗口大小而变化)在所有 4 种组合中以及另外在 IE11 中的解决方案,这似乎相当要求。谢谢!
M
Moisés

与此处的一些答案非常相似,但在我的情况下,我的图像有时更高,有时更大。

这种风格就像一种魅力,可以确保所有图像都使用所有可用空间,保持比例而不是削减:

.img {
   object-fit: contain;
   max-width: 100%;
   max-height: 100%;
   width: auto;
   height: auto;
}

object-fit 对我有用它是否适用于所有浏览器?
.img 是父类还是图像上的类?您可以为纵向和横向图像制作一个带有示例的 jsfiddle 吗?
e
el Dude

删除“高度”属性。

<img src="big_image.jpg" width="900" alt=""/>

通过指定两者,您正在更改图像的纵横比。只需设置一个即可调整大小但保留纵横比。

(可选)限制尺寸过大:

<img src="big_image.jpg" width="900" alt="" style="max-width:500px; height:auto; max-height:600px;"/>

我不能对所有图像都这样做 - 许多图像已经放在许多 html 文件中
好的。试试 img {max-width:500px;高度:自动;最大高度:600 像素;}
应将诸如该评论之类的有用信息添加到您的帖子中。这样我们就可以立即看到您的想法。
img 标记中省略 height 属性的缺点是浏览器在下载图像之前无法计算图像将占用多少空间。这会使页面渲染速度变慢,并可能导致更多“跳跃”。
M
Marat Tanalin

Firefox 71+ (2019-12-03) 和 Chrome 79+ (2019-12-10) 支持 width 的内部 mappingIMG 元素的 height HTML 属性到新的 aspect-ratio CSS财产(财产本身还不能直接使用)。

计算出的纵横比用于为图片预留空间,直到加载完毕,只要计算出的纵横比与图片的实际纵横比相等,就可以防止图片加载后页面“跳转”。

为此,必须通过 CSS 将两个图像尺寸之一覆盖为 auto 值:

IMG {max-width: 100%; height: auto; }
<img src="example.png" width="1280" height="720" alt="Example" />

在示例中,即使图像尚未加载且有效图像宽度小于 1280(作为 max-width: 100% 的结果),也会保持 16:9 (1280:720) 的纵横比。

另请参阅相关的 Firefox bug 392261


T
Thomas Carlton

这是一个解决方案:

img {
   width: 100%;
   height: auto;
   object-fit: cover;
}

这将确保图像始终覆盖整个父级(缩小和放大)并保持相同的纵横比。


M
Mark Bax

只需将其添加到您的 css 中,它会在保持原始比例的情况下自动收缩和扩展。

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

这与 setec's answer 的答案相同,但使用 100% 而不是特定的像素值。
display: block; 是不必要的。
这是完美的,适用于任何大小和比例的图像
S
Steve

这是精神上的。使用 scale-down 属性 - 它可以自我解释。

内联样式:

<img src='/nic-cage.png' style={{ maxWidth: '50%', objectFit: 'scale-down' }} />

这将阻止 flex 拉伸它。在这种情况下,图像将变为其父容器宽度的 50%,并且高度将按比例缩小以匹配。

把事情简单化。


D
Daniel Barral

只需将 height 属性替换为 aspect-ratio 属性即可。

img { 最大宽度:500px;纵横比:900 / 600; }

aspect-ratio 属性不是必需的,但可以防止图像布局变化。


heightwidth 属性不仅用于显示目的,还用于性能:它们告诉浏览器原始图像的大小。出于这个原因,我投了反对票:删除其中一个属性不应该是一个合适的解决方案。
被 Chrome Lighthouse 完美接受
@bfontaine 如果删除高度属性,浏览器仍然能够通过将宽度除以纵横比来获取原始图像的大小。因此,我相信通过包含“纵横比”属性可以解决性能问题,如我的代码片段所示。
@DanielBarral 1-不能保证 CSS 中声明的纵横比与原始纵横比相同。 2- 浏览器在加载页面时很早就解析了高度/宽度属性,然后才获取图像 URL。 CSS 稍后加载/解析。
R
Remi

要保持响应式图像,同时仍强制图像具有一定的纵横比,您可以执行以下操作:

HTML:

<div class="ratio2-1">
   <img src="../image.png" alt="image">
</div>

和 SCSS:

.ratio2-1 {
  overflow: hidden;
  position: relative;

  &:before {
    content: '';
    display: block;
    padding-top: 50%; // ratio 2:1
  }

  img {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
  }
}

无论作者上传的图像大小如何,这都可用于强制执行特定的纵横比。

感谢 http://codepen.io/Kseso/pen/bfdhg 的 @Kseso。检查此 URL 以获取更多比率和工作示例。


我喜欢这个,因为它适用于圆/border-radius。但不幸的是,它会裁剪图像,并且在我尝试过的 div 中为图像制作边框时效果不佳。
A
Aleksandar Toplek

将图像容器标记的 CSS 类设置为 image-class

<div class="image-full"></div>

并将其添加到您的 CSS 样式表中。

.image-full {
    background: url(...some image...) no-repeat;
    background-size: cover;
    background-position: center center;
}

n
nodws

对于响应式方法,我建议最佳做法是使用 Viewport units 和 min/max 属性,如下所示:

img{
  display: block;
  width: 12vw;
  height:12vw;
  max-width:100%;
  min-width:100px;
  min-height:100px;
  object-fit:contain;
}

a
aislamfaisal

要强制适合精确尺寸的图像,您不需要编写太多代码。就是这么简单

img{ 宽度:200px;高度:自动;适合对象:包含; /* 使徽标适合图像大小 */ -o-object-fit: contains; /* 适合 Opera 浏览器的徽标 */ object-position: top; /* 设置标志位置 */ -o-object-position: top; /* Opera 浏览器的徽标位置 */ } Logo


C
Choco Li

https://jsfiddle.net/sot2qgj6/3/

如果您想放置具有固定宽度百分比但不具有固定宽度像素的图像,这就是答案。

这在处理不同尺寸的屏幕时很有用。

诀窍是

使用 padding-top 从宽度设置高度。使用 position: absolute 将图像放在填充空间中。使用 max-height 和 max-width 确保图像不会超过父元素。使用 display:block 和 margin: auto 使图像居中。

我还评论了小提琴中的大部分技巧。

我还找到了其他一些方法来实现这一点。 html 中不会有真实的图像,所以当我需要 html 中的“img”元素时,我个人更喜欢最佳答案。

使用背景的简单 css http://jsfiddle.net/4660s79h/2/

顶部有文字的背景图片 http://jsfiddle.net/4660s79h/1/

使用绝对位置的概念来自这里http://www.w3schools.com/howto/howto_css_aspect_ratio.asp


如果原始问题提到的“已经指定了高度和宽度”,这将不起作用。有时您想强制宽度和高度,然后根据纵横比放大/缩小图像。
R
Rakete1111

你可以使用这个:

img { 
    width: 500px; 
    height: 600px; 
    object-fit: contain; 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
}

C
Chun Yang

您可以像这样创建一个 div:

<div class="image" style="background-image:url('/to/your/image')"></div>

并使用这个 css 来设置它的样式:

height: 100%;
width: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain; // this can also be cover

这会将 div 拉伸到其父级的 100% 宽度,但不会保持图像的纵横比。
你试过了吗?我得到了它的工作jsfiddle.net/zuysj22w。你能展示你的情况吗? @大卫球
这是与 Hoffmann's answer 类似的解决方案。
如果您不想让您的图像被抓取,那也没关系。否则,您将需要 进行清晰标记
S
SRCP

您可以将容器设置为 display: flexalign-items: center(其他 align-items 值也可以)。除了 align-items,您还可以在图像本身上设置 align-self


x
xec

如果图像对于指定区域太大,这将使图像缩小(缺点,它不会放大图像)。

setec 的解决方案适用于自动模式下的“Shrink to Fit”。但是,为了优化 EXPAND 以适应“自动”模式,您需要首先将接收到的图像放入临时 id,检查它是否可以在高度或宽度上扩展(取决于其纵横比与纵横比你的显示块),

$(".temp_image").attr("src","str.jpg" ).load(function() { 
    // callback to get actual size of received image 

    // define to expand image in Height 
    if(($(".temp_image").height() / $(".temp_image").width()) > display_aspect_ratio ) {
        $(".image").css('height', max_height_of_box);
        $(".image").css('width',' auto');
    } else { 
        // define to expand image in Width
        $(".image").css('width' ,max_width_of_box);
        $(".image").css('height','auto');
    }
    //Finally put the image to Completely Fill the display area while maintaining aspect ratio.
    $(".image").attr("src","str.jpg");
});

当接收到的图像小于显示框时,这种方法很有用。您必须将它们以原始小尺寸而不是它们的扩展版本保存在您的服务器上,以填充您的更大显示框以节省大小和带宽。


尽管问题帖子没有说明,但我认为 OP 强烈暗示他/她正在寻找仅 CSS 的解决方案。
E
Etienne Kaiser

您可以使用:-

transform: scaleX(1.2);

改变宽度而不改变高度。

transform: scaleY(1.2);

改变高度而不改变宽度

您可以在 html 和 css 中的图像和视频标签上使用它。这也不会改变纵横比。


F
Flimm

img { 最大宽度:80px; /* 也适用于百分比值,例如 100% */ height: auto; }

此图像最初为 400x400 像素,但应通过 CSS 调整大小:

假设HTML的作者故意希望高度为宽度的一半,这个CSS会忽略HTML作者的意愿,这可能是也可能不是你想要的:


P
Paul Bormans

使用伪元素进行垂直对齐怎么样?这个更少的代码适用于轮播,但我想它适用于每个固定大小的容器。它将保持纵横比并在顶部/底部或左侧/写入上插入@gray-dark 条以获得最短尺寸。同时,图像由 text-align 水平居中,由伪元素垂直居中。

    > li {
      float: left;
      overflow: hidden;
      background-color: @gray-dark;
      text-align: center;

      > a img,
      > img {
        display: inline-block;
        max-height: 100%;
        max-width: 100%;
        width: auto;
        height: auto;
        margin: auto;
        text-align: center;
      }

      // Add pseudo element for vertical alignment of inline (img)
      &:before {
        content: "";
        height: 100%;
        display: inline-block;
        vertical-align: middle;
      }
    }

J
John

全屏演示:

img[data-attribute] {height: 100vh;}

请记住,如果视口高度大于图像,则图像会相对于差异自然降级。


D
Dharmender Tongar

如果应用程序可以具有任何宽高比或分辨率的图像,那么您可以管理此链接中的高度和宽度。

这使用 Javascript 和 HTML

https://stackoverflow.com/a/65090175/13338731


H
Hossein

您可以使用 aspect-ratio 属性 css

.my-image {
 aspect-ratio: 1/1; // square
 aspect-ration: 16/9; 
 aspect-ration: 4/3;
 aspect-ration: 2/3;
}