Existe uma solução somente CSS para dimensionar uma imagem em uma caixa delimitadora (mantendo a proporção de aspecto)? Isso funciona se a imagem for maior que o contêiner:
img {
max-width: 100%;
max-height: 100%;
}
Exemplo:
- Caso de uso 1 (funciona): http://jsfiddle.net/Jp5AQ/2/
- Caso de uso 2 (funciona): http://jsfiddle.net/Jp5AQ/3/
Mas eu quero aumentar a imagem até que uma dimensão seja 100% do contêiner.
- Caso de uso 3 (não funciona): http://jsfiddle.net/Jp5AQ/4/
Respostas:
Observação: embora esta seja a resposta aceita, a resposta abaixo é mais precisa e atualmente é compatível com todos os navegadores se você tiver a opção de usar uma imagem de fundo.
Não, não existe uma maneira CSS única de fazer isso nas duas direções. Você poderia adicionar
Para que um elemento sempre tenha 100% de largura e dimensione automaticamente a altura para a proporção, ou o inverso:
para sempre dimensionar para altura máxima e largura relativa. Para fazer ambos, você precisará determinar se a proporção é maior ou menor do que o contêiner, e CSS não pode fazer isso.
O motivo é que o CSS não sabe a aparência da página. Ele define regras de antemão, mas só depois disso é que os elementos são renderizados e você sabe exatamente com quais tamanhos e proporções está lidando. A única maneira de detectar isso é com JavaScript.
Embora você não esteja procurando uma solução JS, vou adicionar uma de qualquer maneira, se alguém precisar. A maneira mais fácil de lidar com isso com JavaScript é adicionar uma classe com base na diferença de proporção. Se a proporção largura-altura da caixa for maior do que a da imagem, adicione a classe "largura de preenchimento", caso contrário, adicione a classe "altura de preenchimento".
Exibir trecho de código
fonte
Graças ao CSS3 existe uma solução!
A solução é colocar a imagem como
background-image
e definirbackground-size
comocontain
.HTML
CSS
Teste aqui: http://www.w3schools.com/cssref/playit.asp?filename=playcss_background-size&preval=contain
Compatibilidade total com os navegadores mais recentes: http://caniuse.com/background-img-opts
Para alinhar o div no centro, você pode usar esta variação:
fonte
<div class=image style="background-image: url('/images/foo.jpg');"></div>
. Todos os outros estilos devem ser aplicados com CSS.Esta é uma solução hackeada que descobri:
Isso aumentará a imagem dez vezes, mas a restringirá a 10% de seu tamanho final - limitando-a ao contêiner.
Ao contrário da
background-image
solução, isso também funcionará com<video>
elementos.Exemplo interativo:
Exibir trecho de código
fonte
transform-origin: top left
para interromper o corte. / ZombieHoje, basta dizer objeto-ajuste: conter. O suporte é tudo menos o IE: http://caniuse.com/#feat=object-fit
fonte
object-fit
ainda está em desenvolvimento para isso.object-fit
: stackoverflow.com/a/46456673/474031html:
css:
fonte
Você pode fazer isso com CSS puro e suporte a navegador completo, tanto para imagens longas quanto horizontais ao mesmo tempo.
Aqui está um snippet que funciona no Chrome, Firefox e Safari (usando
object-fit: scale-down
e sem usar):fonte
Outra solução sem imagem de fundo e sem a necessidade de um contêiner (embora os tamanhos máximos da caixa delimitadora devam ser conhecidos):
Se o uso de um contêiner for necessário, a largura máxima e a altura máxima podem ser definidas para 100%:
Para isso, você teria algo como:
fonte
Este exemplo para esticar a imagem proporcionalmente para caber na janela inteira. Uma improvisação para o código correto acima é adicionar
$( window ).resize(function(){});
Existem duas condições if. O primeiro continua verificando se a altura da imagem é menor que a div e aplica a
.fillheight
classe, enquanto o próximo verifica a largura e aplica a.fillwidth
classe. Em ambos os casos, a outra classe é removida usando.removeClass()
Aqui está o CSS
Você pode substituir
100vh
por100%
se quiser esticar a imagem em um div. Este exemplo para esticar a imagem proporcionalmente para caber na janela inteira.fonte
Você está procurando uma escala para cima, mas não para baixo?
Isso, entretanto, não bloqueia a proporção de aspecto.
fonte
Usei a mesa para centralizar a imagem dentro da caixa. Ele mantém a relação de aspecto e dimensiona a imagem de uma forma totalmente dentro da caixa. Se a imagem for menor do que a caixa, ela é mostrada como está no centro. O código abaixo usa uma caixa de 40px de largura e 40px de altura. (Não tenho certeza se funciona bem porque removi de outro código mais complexo e simplifiquei um pouco)
CSS:
HTML:
fonte
A maneira mais limpa e simples de fazer isso:
Primeiro, algum CSS:
O HTML:
Isso deve funcionar!
fonte
Isso me ajudou:
Em seguida, no elemento (você pode usar javascript ou consultas de mídia para adicionar capacidade de resposta):
Espero que isto ajude!
fonte
Estou editando minha resposta para explicar melhor minha solução, pois tenho um voto negativo.
Com os estilos definidos como mostrado acima em css, agora o seguinte div html mostrará a imagem sempre ajustada na largura e ajustará a proporção de aspecto alta à largura. Assim, a imagem será dimensionada para caber em uma caixa delimitadora, conforme perguntado na pergunta.
fonte