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
.fillwidth {
min-width: 100%;
height: auto;
}
Para que um elemento sempre tenha 100% de largura e dimensione automaticamente a altura para a proporção, ou o inverso:
.fillheight {
min-height: 100%;
width: auto;
}
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".
$('div').each(function() {
var fillClass = ($(this).height() > $(this).width())
? 'fillheight'
: 'fillwidth';
$(this).find('img').addClass(fillClass);
});
.fillwidth {
width: 100%;
height: auto;
}
.fillheight {
height: 100%;
width: auto;
}
div {
border: 1px solid black;
overflow: hidden;
}
.tower {
width: 100px;
height: 200px;
}
.trailer {
width: 200px;
height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="tower">
<img src="http://placekitten.com/150/150" />
</div>
<div class="trailer">
<img src="http://placekitten.com/150/150" />
</div>