如何在div内放置图像(img)并保持纵横比?


136

我有一个48x48的div,并且里面有一个img元素,我想将它放入div中而不丢失任何部分,同时保持比例,是否可以使用html和css实现?

Answers:


70

如果您在编写CSS时不知道图像的尺寸,则需要一些JavaScript来防止裁剪。

HTML和JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

的CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

如果您使用JavaScript库,则可能要利用它。


2
迈克尔的答案要简单得多,并且不使用Javascript。我不知道浏览器的兼容性。
weberc2 2012年

3
不,只要图像大于div,Michael的答案就起作用。如果您希望图像填充有关图像尺寸的div(并且,如果您事先不知道图像尺寸,则可以),这是一种方法。
雷米·戴维

2
您不能使用max-height:100%吗?最大宽度:100%; 最小宽度:100%; min-height:100%然后得到相同的结果?诚实的问题。
丹尼尔·卡塞利

否,这样做可以将宽度和高度强制为100%,因此您可以更改图像的宽高比。
gztomas

当图像在浏览器中缓存时,不会调用onload,因此仅在首次加载图像时才起作用。
Redtopia 2014年

314

使用max-height:100%; max-width:100%;了DIV内的图像。


4
@ZoveGames不支持JS的浏览器?雅虎2010年的统计数据显示平均为1.3%。我认为假设是安全的。今天可能更低,并且b。programmers.stackexchange.com/questions/26179/...
EasyCo

5
它对我不起作用...使图像的大小达到其自身大小的100%(例如:对于实际为300px宽的图像,其宽度为300px)。
托马什Zato -恢复莫妮卡

1
这是由Windows导致的一些可怕的Windows错误。与我拥有的某些smoothscroll插件潜在的不良互动。即使鼠标悬停在overflow:scroll具有大图像的div上,它最终还是试图滚动身体。好奇。更奇怪的是:Max的解决方案实际上可以解决它。确实,我对CSS非常厌倦。曾经很强大很酷。现在,实现会在越野车不一致之后产生越野车不一致。
史蒂文·卢

21
仅在缩小图像时有效。如果您想将较小的图像放入较大的容器中,则将无法使用
Yossi Shasho 2014年

2
它不会保留图像的原始宽高比。
Ĭsααc吨իεβöss

78

不幸的是max-width + max-height不能完全覆盖我的任务...所以我找到了另一个解决方案:

在缩放时保存图像比例,还可以使用object-fitCSS3属性。

有用的文章:使用CSS3控制图像长宽比

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

坏消息:不支持IE(我可以使用


6
必须将其标记为答案。“对象适合”效果很好。
Ĭsααc吨իεβöss

奇怪的是,它似乎是在iOS 8.1中而不是8.0中引入了对此功能的支持。
射线

2
object-fit: cover; 为我工作。此处:stackoverflow.com/questions/9071830/…–
Deke

1
如果你想要的形象在左侧,而不是集中在顶部,你还需要使用对象的位置0 0
克里斯·雷伊

这是唯一对我有用的答案,它可以创建填充屏幕并同时保持图像高宽比的响应式图像背景。
Ray Li

39

仅使用CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}

没有扩大规模
JFFIGK

17

的HTML

<div>
    <img src="something.jpg" alt="" />
</div>

的CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

这将使图像展开以填充其父级,其大小在divCSS中设置。


2
不要添加height: 100%,这会扭曲图像比例-OP希望保持该比例。
卡萨布兰卡2010年

我不确定OP的含义,但您会无法保持正确的比率?
Trufa 2010年

如何保持比例?如果删除高度:100%,图像将被裁剪。
陈彬2010年

7

我遇到了很多问题才能使它正常工作,我发现的每个解决方案似乎都不起作用。

我意识到我必须将div显示设置为flex,所以基本上这是我的CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}

Chrome 61版中的此解决方案使我的图像失真
Yevgeniy Afanasyev

也许您的div设置了max-height / height或width,这会导致图像失真。
Bartho Bernsmann '17

正是我的意思。图片失真了,因为您正在设置<div class =“ w”>的宽度和高度
Bartho Bernsmann

例如,我相信您正在图像CSS上寻找类似的东西:height:auto; 宽度:100%;
Bartho Bernsmann '17

任务是将图像适合div,这意味着div具有尺寸并且图像仅具有纵横比。我需要将高度设置为某个值,否则问题条件和我的图像都会失真。请看一下JS小提琴,然后更改您认为使之起作用所需的内容。谢谢。
Yevgeniy Afanasyev


3

对我而言,以下CSS可以工作(在Chrome,Firefox和Safari中测试)。

有很多东西一起工作:

  • max-height: 100%;max-width: 100%;height: auto;width: auto;将img比例缩放到最先达到100%的尺寸,同时保持宽高比
  • position: relative;在容器中,position: absolute;在子容器中,top: 50%;以及left: 50%;img在容器中的左上角并居中
  • transform: translate(-50%, -50%); 将img向左和顶部移动一半大小,从而将img在容器中居中

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

将照片设置为背景图像将使我们对大小和位置有更多的控制权,而img标签则可用于其他目的...

在下面,如果我们希望div与照片具有相同的长宽比,则placeholder.png是一个小的透明图像,其长宽比与photo.jpg相同。如果照片是正方形,则是1px x 1px的占位符,如果照片是视频缩略图,则是16x9的占位符,依此类推。

针对该问题,请使用1x1占位符来保持div的平方比,并使用背景图像background-size来保持照片的宽高比。

我使用过,background-position: center center;因此照片将在div中居中。(将照片与垂直中心或底部对齐会使img标签中的照片变得难看。)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

为避免额外的http请求,请将占位符图像转换为data:URL

<img src="data:image/png;base64,..."/>

0

您可以将类“ img-fluid”用于较新的版本,即Bootstrap v4

并可以对早期版本(例如Bootstrap v3)使用“ img-sensitive”类。

用法:-

img标签:

class = “ img-fluid”

src = “ ...”


0

这是一种全JavaScript方法。它将图像逐渐缩小,直到正确适合为止。您可以选择在每次失败时缩小多少。此示例在每次失败时将其缩小10%:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

随意直接复制和粘贴。


0

对我有用的是:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

需要使用inline-flex来防止图像超出div范围。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.