У меня есть внешний контейнер, который является переменным по размеру и ширине. Предположим, что внутри этого контейнера у меня есть холст, который я хочу вырастить как можно больше, сохраняя пропорции и не обрезая. Для этого я обычно использовал бы object-fit: contain
.
Теперь предположим вместо просто холста, у меня есть холст с другим элементом, расположенным рядом с ним.
HTML:
<div class="outerContainer">
<canvas width="640" height="360"></canvas>
<div class="beside">
</div>
</div>
CSS
.outerContainer {
display: flex;
border: 0.5em solid #444;
margin-bottom: 2em;
object-fit: contain;
}
.outerContainer canvas {
flex-grow: 1;
background: #77a;
}
/* This element has a fixed width, and should be whatever height the <canvas> is */
.outerContainer .beside {
flex-basis: 3em;
flex-grow: 0;
flex-shrink: 0;
background: #7a7;
}
В этом случае я хочу масштабировать весь внешний размер контейнера, как и с холстом. Проблема в том, что object-fit
фактически не масштабирует элемент... он масштабирует его содержимое. Это, похоже, не относится к обычным элементам блока, что приводит к тому, что внутри холста потенциально перекошен, если имеется достаточная ширина.
Если я добавлю object-fit: contain
в элемент canvas
, он будет поддерживать пропорцию, но по-прежнему использует полную ширину, то есть элемент .beside
находится полностью вправо. Это визуализируется фиолетовым фоном на холсте.
Я бы хотел, чтобы outerContainer
масштабировался с содержимым холста, так что .beside
всегда имеет высоту содержимого холста. .outerContainer
должен быть центрирован в родительском элементе, занимая столько места, сколько может, не искажая холст. Подобным образом, в любом пропорциональном масштабе:
Это можно сделать с помощью современного CSS? Или я должен использовать скриптовое решение?
Скрипт с примерами: https://jsfiddle.net/nufx10zc/