Nota: aunque esta es la respuesta aceptada, la respuesta a continuación es más precisa y actualmente es compatible con todos los navegadores si tiene la opción de usar una imagen de fondo.
No, no existe una única forma de CSS para hacer esto en ambas direcciones. Podrías agregar
.fillwidth {
min-width: 100%;
height: auto;
}
Para que un elemento tenga siempre un ancho del 100% y escale automáticamente la altura a la relación de aspecto, o a la inversa:
.fillheight {
min-height: 100%;
width: auto;
}
para escalar siempre a la altura máxima y al ancho relativo. Para hacer ambas cosas, deberá determinar si la relación de aspecto es mayor o menor que su contenedor, y CSS no puede hacer esto.
La razón es que CSS no sabe cómo se ve la página. Establece reglas de antemano, pero solo después de eso, los elementos se renderizan y usted sabe exactamente con qué tamaños y proporciones está tratando. La única forma de detectarlo es con JavaScript.
Aunque no está buscando una solución JS, agregaré una de todos modos si alguien la necesita. La forma más fácil de manejar esto con JavaScript es agregar una clase basada en la diferencia de proporción. Si la relación ancho-alto del cuadro es mayor que la de la imagen, agregue la clase "fillwidth", de lo contrario agregue la clase "fillheight".
$('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>