Lưu ý: Mặc dù đây là câu trả lời được chấp nhận, câu trả lời dưới đây chính xác hơn và hiện được hỗ trợ trong tất cả các trình duyệt nếu bạn có tùy chọn sử dụng hình nền.
Không, không có cách duy nhất CSS để làm điều này theo cả hai hướng. Bạn có thể thêm
.fillwidth {
min-width: 100%;
height: auto;
}
Để phần tử luôn có chiều rộng 100% và tự động chia tỷ lệ chiều cao theo tỷ lệ khung hình hoặc tỷ lệ nghịch:
.fillheight {
min-height: 100%;
width: auto;
}
để luôn luôn tỷ lệ đến chiều cao tối đa và chiều rộng tương đối. Để làm cả hai, bạn sẽ cần xác định xem tỷ lệ khung hình cao hơn hoặc thấp hơn so với vùng chứa của nó và CSS không thể làm điều này.
Lý do là CSS không biết trang trông như thế nào. Nó đặt ra các quy tắc trước, nhưng chỉ sau đó, các phần tử sẽ được hiển thị và bạn biết chính xác kích thước và tỷ lệ bạn đang xử lý. Cách duy nhất để phát hiện đó là với JavaScript.
Mặc dù bạn không tìm kiếm một giải pháp JS nào nhưng tôi sẽ thêm một giải pháp nếu có ai đó cần nó. Cách dễ nhất để xử lý việc này với JavaScript là thêm một lớp dựa trên sự khác biệt về tỷ lệ. Nếu tỷ lệ giữa chiều rộng và chiều cao của hộp lớn hơn tỷ lệ của hình ảnh, hãy thêm lớp "băng thông", nếu không thì thêm lớp "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>