Como encaixo uma imagem (img) dentro de uma div e mantenho a proporção?

136

Eu tenho uma div de 48x48 e dentro dela existe um elemento img, eu quero encaixá-la na div sem perder nenhuma parte; nesse meio tempo a taxa é mantida, é possível usar html e css?

Bin Chen
fonte

Respostas:

70

Você precisará de algum JavaScript para impedir o corte, se não souber a dimensão da imagem no momento em que está escrevendo o css.

HTML e 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%;
}

Se você usa uma biblioteca JavaScript, pode tirar proveito dela.

Thomas
fonte
2
A resposta de Michael é muito mais simples e não usa Javascript. Eu não sei sobre a compatibilidade do navegador.
precisa saber é o seguinte
3
Não, a resposta de Michael funciona desde que a imagem seja maior que a div. Se você deseja que a imagem preencha a div em relação ao tamanho da imagem (e, se você não souber o tamanho da imagem com antecedência), esse é o caminho a seguir.
Rémy DAVID
2
Você não pode usar a altura máxima: 100%; largura máxima: 100%; largura mínima: 100%; min-height: 100% e obtém o mesmo resultado então? Pergunta honesta.
Daniel Casserly
Não, ao fazer isso, você força a largura e a altura a serem 100% e altera a proporção da imagem.
Gztomas
onload não será chamado quando a imagem for armazenada em cache no navegador; portanto, isso funcionará apenas quando a imagem for carregada pela primeira vez.
Redtopia
314

Use max-height:100%; max-width:100%;para a imagem dentro da div.

Michael
fonte
4
@ZoveGames Navegadores não JS habilitados? As estatísticas do Yahoo em 2010 mostram uma média de 1,3%. Eu acho que é seguro assumir que a. provavelmente está mais baixo hoje e b. programmers.stackexchange.com/questions/26179/…
EasyCo
5
Não funciona para mim ... Torna a imagem 100% do seu próprio tamanho (por exemplo: 300 px de largura para uma imagem que realmente tem 300 px de largura).
Tomáš Zato - Restabelecer Monica
1
Há algum bug específico terrível do Chrome no Windows que isso causa. Potencialmente, alguma interação ruim com certos plugins smoothscroll que tenho. Ele acaba tentando rolar o corpo, mesmo que o mouse esteja sobre uma overflow:scrolldiv com uma imagem grande. Curioso. Ainda mais estranho: a solução de Max realmente a corrige. Estou farto de CSS, na verdade. Costumava ser poderoso e legal. Agora, as implementações apenas produzem inconsistência de buggy após inconsistência de buggy.
Steven Lu
21
só funciona ao reduzir a imagem. se você quiser para caber uma pequena imagem em um recipiente maior, isso não vai funcionar
Yossi Shasho
2
Não preserva a proporção original da imagem.
Decsααc t ի εöβ
78

Infelizmente max-width + max-height não cobrem totalmente minha tarefa ... Por isso, encontrei outra solução:

Para salvar a proporção da imagem durante o dimensionamento, você também pode usar a propriedade object-fitCSS3.

Artigo útil: Controle as proporções da imagem com CSS3

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

Más notícias: IE não suportado ( Posso usar )

Andrii Verbytskyi
fonte
6
Isso deve ser marcado como a resposta. "Ajuste de objeto" funcionou perfeitamente.
Decsααc t ի εöβ
Estranhamente, parece que o suporte foi introduzido no iOS 8.1, não 8.0.
ray
2
object-fit: cover; trabalhou para mim. Aqui: stackoverflow.com/questions/9071830/…
Deke
1
Se você deseja que a imagem esteja no canto superior esquerdo, em vez de centralizada, também precisará usar a posição de objeto 0 0. #
Chris Rae #
Esta é a única resposta que funcionou para mim para criar um fundo de imagem responsivo que preencheu a tela, mantendo a proporção da imagem.
Raio Li
39

Usando apenas CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}
Máx.
fonte
não aumenta
JFFIGK
17

HTML

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

CSS

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

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

Isso fará com que a imagem se expanda para preencher seu pai, cujo tamanho é definido no divCSS.

alex
fonte
2
Não adicione height: 100%, isso distorcerá a proporção da imagem - o OP deseja manter a proporção.
Casablanca
Não sei ao certo o que significava o OP, mas você não estaria mantendo a proporção correta?
Trufa
o que posso fazer para manter a proporção? Se eu excluir a altura: 100%, a imagem será cortada.
Bin Chen
7

Eu estava tendo muitos problemas para fazer isso funcionar, todas as soluções que encontrei não pareciam funcionar.

Percebi que eu tinha que definir a exibição div para flex, então basicamente este é o meu CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}
Bartho Bernsmann
fonte
Minhas imagens estão distorcidas com esta solução no Chrome Versão 61
Yevgeniy Afanasyev
Talvez sua div tenha um conjunto de altura / altura ou largura máximas, o que está causando a distorção da imagem.
Bartho Bernsmann
Exatamente o meu ponto .. A imagem está distorcida porque você está definindo a largura ea altura do seu <div class = "w">
Bartho Bernsmann
Para o seu exemplo .. Eu acredito que você está procurando algo como na sua imagem CSS: height: auto; largura: 100%;
Bartho Bernsmann
a tarefa era encaixar a imagem em uma div, implica que div tem as dimensões e a imagem tem apenas proporção. Preciso definir a altura com algum valor, caso contrário, as condições da pergunta serão distorcidas, assim como a minha imagem. Dê uma olhada no JS fiddle e altere o que você acha necessário para fazê-lo funcionar. Obrigado.
Yevgeniy Afanasyev 14/11
6

Experimente o CSS:

img {
  object-fit: cover;
  height: 48px;
}
Faisal
fonte
3

Para mim, o seguinte CSS funcionou (testado no Chrome, Firefox e Safari).

Existem várias coisas trabalhando juntas:

  • max-height: 100%;, max-width: 100%;E height: auto;, width: auto;tornar a escala img para qualquer dimensão primeiros atinge 100%, mantendo a relação de aspecto
  • position: relative;no recipiente e position: absolute;na criança, junto com top: 50%;e left: 50%;centralize o canto superior esquerdo do img no recipiente
  • transform: translate(-50%, -50%); move o img de volta para a esquerda e o topo pela metade do seu tamanho, centralizando o img no contêiner

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%);
}
VSchlattinger
fonte
1

Definir a foto como imagem de fundo nos dará mais controle sobre tamanho e posicionamento, deixando a tag img para servir a uma finalidade diferente ...

Abaixo, se quisermos que a div tenha a mesma proporção que a foto, placeholder.png é uma pequena imagem transparente com a mesma proporção que photo.jpg. Se a foto é quadrada, é um espaço reservado 1px x 1px, se a foto é uma miniatura de vídeo, é um espaço reservado 16x9 etc.

Específico à pergunta, use um espaço reservado 1x1 para manter a proporção quadrada da div, com uma imagem de plano de fundo usando background-sizepara manter a proporção da foto.

Eu usei background-position: center center;para que a foto seja centralizada na div. (O alinhamento da foto no centro vertical ou na parte inferior ficaria feio com a foto na tag 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>

Para evitar uma solicitação http extra, converta a imagem do espaço reservado em um dado: URL .

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

você pode usar a classe "img-fluid" para uma versão mais recente, ou seja, o Bootstrap v4 .

e pode usar a classe "img-responsive" para versões mais antigas como o Bootstrap v3 .

Uso : -

img tag com: -

class = "img-fluid"

src = "..."

Saurabh Sheorain
fonte
0

Aqui está uma abordagem totalmente JavaScript. Escala uma imagem gradualmente para baixo até que ela se encaixe corretamente. Você escolhe quanto diminuir cada vez que falha. Este exemplo reduz 10% cada vez que falha:

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);
});

Sinta-se livre para copiar e colar diretamente.

Praia Jared
fonte
0

O que funcionou para mim foi:

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

O inline-flex foi necessário para impedir que as imagens saíssem da div.

Nomad77
fonte