Eu encontrei este tópico - Como você estica uma imagem para preencher um <div> enquanto mantém a proporção da imagem? - isso não é exatamente o que eu quero.
Eu tenho um div com um determinado tamanho e uma imagem dentro dele. Eu quero sempre preencher o div com a imagem, independentemente se a imagem é paisagem ou retrato. E não importa se a imagem é cortada (o próprio div tem overflow oculto).
Então se a imagem é retrato eu quero width
que seja 100%
e height:auto
assim fica na proporção. Se a imagem for paisagem eu quero height
ser 100%
e ser width to be
auto`. Parece complicado, certo?
<div class="container">
<img src="some-image.jpg" alt="Could be portrait or landscape"/>
</div>
Como não sei como fazer, simplesmente criei uma imagem rápida do que quero dizer. Não consigo nem descrever corretamente.
Então, acho que não sou o primeiro a perguntar isso. No entanto, não consegui encontrar uma solução para isso. Talvez haja uma nova maneira CSS3 de fazer isso - estou pensando no flex-box. Qualquer ideia? Talvez seja ainda mais fácil do que eu esperava?
fonte
Respostas:
Se eu entendi corretamente o que você quer, você pode deixar os atributos de largura e altura fora da imagem para manter a proporção e usar o flexbox para fazer a centralização para você.
JSFiddle aqui
Eu testei isso com sucesso no IE9, Chrome 31 e Opera 18. Mas nenhum outro navegador foi testado. Como sempre, você deve considerar seus requisitos de suporte específicos.
fonte
.fill img { min-height:100%; min-width: 100%; object-fit: cover; }
É um pouco tarde, mas acabei de ter o mesmo problema e finalmente resolvi-o com a ajuda de outra postagem stackoverflow ( https://stackoverflow.com/a/29103071 ).
Espero que isso ainda ajude alguém.
Obs .: Também funciona junto com as propriedades css max-height , max-width , min-width e min-height . É especialmente útil com o uso de unidades de comprimento como 100% ou 100vh / 100vw para preencher o contêiner ou toda a janela do navegador.
fonte
object-position
regra a esta classe será útil aqui. Apenas uma nota lateral.Uma pergunta antiga, mas que merece uma atualização, pois agora existe um caminho.
A resposta correta baseada em CSS é usar
object-fit: cover
, que funciona assimbackground-size: cover
. O posicionamento seria cuidado peloobject-position
atributo, que é padronizado como centralização.Mas não há suporte para ele em nenhum navegador IE / Edge ou Android <4.4.4. Além disso,
object-position
não é compatível com Safari, iOS ou OSX. Polyfills existem, imagens de ajuste de objeto parecem oferecer o melhor suporte.Para obter mais detalhes sobre como a propriedade funciona, consulte o artigo de truques de CSS sobre
object-fit
para obter uma explicação e uma demonstração.fonte
Isso deve servir:
fonte
Todas as respostas abaixo têm largura e altura fixas, o que torna a solução "não responsiva".
Para alcançar o resultado, mas manter a imagem responsiva, usei o seguinte:
HTML:
fonte
Você pode conseguir isso usando as propriedades css flex. Por favor veja o código abaixo
fonte
Considere usar
background-size: cover
(IE9 +) em conjunto combackground-image
. Para o IE8-, existe um polyfill .fonte
background-size
faz sentido apenas com obackground-image
especificado também (atualizei minha resposta de acordo). Não se aplica aIMG
elementos.Experimente isto:
Espero que isto ajude
fonte
Você pode usar div para fazer isso. sem tag img :) espero que isso ajude.
fonte
A única maneira de alcançar o cenário de "melhor caso" descrito foi colocando a imagem como plano de fundo:
fonte
Aqui está uma resposta com suporte para uso do IE
object-fit
para que você não perca proporçãoUsando um snippet JS simples para detectar se o
object-fit
é compatível e, em seguida, substituir oimg
por umsvg
Observação: também existem alguns
object-fit
polyfills por aí queobject-fit
funcionam.Aqui estão alguns exemplos:
fonte
Aqui você tem meu exemplo de trabalho. Eu usei um truque que é definir a imagem como plano de fundo do contêiner div com background-size: cover e background-position: center center
Coloquei a imagem com largura: 100% e opacidade: 0 tornando-a invisível. Observe que estou exibindo minha imagem apenas porque tenho um interesse especial em chamar o evento de clique filho.
Observe que embora eu esteja usando angular, é completamente irrelevante.
O resultado é aquele que você define como ideal em todos os casos
fonte
O CSS
object-fit: cover
eobject-position: left center
os valores de propriedade agora tratam desse problema.fonte
fonte
Basta corrigir a altura da imagem e fornecer largura = auto
fonte