注:これは承認された回答ですが、以下の回答はより正確であり、現在、背景画像を使用するオプションがある場合は、すべてのブラウザーでサポートされています。
いいえ、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>