Catatan: Meskipun ini adalah jawaban yang diterima, jawaban di bawah ini lebih akurat dan saat ini didukung di semua browser jika Anda memiliki opsi untuk menggunakan gambar latar belakang.
Tidak, tidak ada satu-satunya cara CSS untuk melakukan ini di kedua arah. Anda bisa menambahkan
.fillwidth {
min-width: 100%;
height: auto;
}
Untuk elemen agar selalu memiliki lebar 100% dan secara otomatis menskalakan tinggi ke rasio aspek, atau kebalikannya:
.fillheight {
min-height: 100%;
width: auto;
}
untuk selalu menskalakan ke tinggi maksimum dan lebar relatif. Untuk melakukan keduanya, Anda perlu menentukan apakah rasio aspek lebih tinggi atau lebih rendah dari penampungnya, dan CSS tidak dapat melakukan ini.
Alasannya adalah CSS tidak tahu seperti apa halaman tersebut. Ini menetapkan aturan sebelumnya, tetapi hanya setelah itu elemen-elemen itu dirender dan Anda tahu persis ukuran dan rasio apa yang Anda hadapi. Satu-satunya cara untuk mendeteksinya adalah dengan JavaScript.
Meskipun Anda tidak mencari solusi JS, saya akan tetap menambahkannya jika seseorang mungkin membutuhkannya. Cara termudah untuk menangani ini dengan JavaScript adalah menambahkan kelas berdasarkan perbedaan rasio. Jika rasio lebar-tinggi kotak lebih besar dari gambar, tambahkan kelas "fillwidth", jika tidak tambahkan kelas "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>