Uwaga: mimo że jest to akceptowana odpowiedź, poniższa odpowiedź jest dokładniejsza i jest obecnie obsługiwana we wszystkich przeglądarkach, jeśli masz możliwość korzystania z obrazu tła.
Nie, nie ma jedynego sposobu CSS, aby to zrobić w obu kierunkach. Możesz dodać
.fillwidth {
min-width: 100%;
height: auto;
}
Aby element zawsze miał 100% szerokości i automatycznie skalował wysokość do współczynnika proporcji lub odwrotnie:
.fillheight {
min-height: 100%;
width: auto;
}
aby zawsze skalować do maksymalnej wysokości i względnej szerokości. Aby zrobić jedno i drugie, musisz określić, czy współczynnik proporcji jest wyższy, czy niższy niż jego kontener, a CSS nie może tego zrobić.
Powodem jest to, że CSS nie wie, jak wygląda strona. Z góry ustala zasady, ale dopiero potem renderuje się elementy i wiesz dokładnie, z jakimi rozmiarami i proporcjami masz do czynienia. Jedynym sposobem na wykrycie tego jest JavaScript.
Chociaż nie szukasz rozwiązania JS, i tak dodam, jeśli ktoś może go potrzebować. Najłatwiejszym sposobem radzenia sobie z tym za pomocą JavaScript jest dodanie klasy na podstawie różnicy w stosunku. Jeśli stosunek szerokości do wysokości pudełka jest większy niż obrazu, dodaj klasę „fillwidth”, w przeciwnym razie dodaj klasę „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>