Примечание. Несмотря на то, что это принятый ответ, приведенный ниже ответ более точен и в настоящее время поддерживается во всех браузерах, если у вас есть возможность использовать фоновое изображение.
Нет, нет единственного способа сделать это в обоих направлениях с помощью CSS. Вы могли бы добавить
.fillwidth {
min-width: 100%;
height: auto;
}
Чтобы элемент всегда имел 100% ширину и автоматически масштабировал высоту до соотношения сторон или наоборот:
.fillheight {
min-height: 100%;
width: auto;
}
чтобы всегда масштабироваться до максимальной высоты и относительной ширины. Чтобы сделать и то, и другое, вам нужно будет определить, выше или ниже соотношение сторон, чем у контейнера, а CSS этого сделать не может.
Причина в том, что CSS не знает, как выглядит страница. Он заранее устанавливает правила, но только после этого элементы визуализируются, и вы точно знаете, с какими размерами и соотношениями вы имеете дело. Единственный способ обнаружить это - с помощью JavaScript.
Хотя вы не ищете JS-решение, я все равно добавлю его, если оно кому-то понадобится. Самый простой способ справиться с этим с помощью JavaScript - добавить класс, основанный на разнице в соотношении. Если отношение ширины к высоте поля больше, чем у изображения, добавьте класс fillwidth, иначе добавьте класс 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>