Как сохранить пропорции элемента с помощью CSS без использования JavaScript

Проблема с поддержанием квадратных пропорций в flexbox

У меня есть контейнер с flexbox разметкой, где размещены несколько элементов управления. Обычные кнопки получают размеры автоматически на основе внутреннего содержимого и отступов, но кнопка с изображением растягивается на всю высоту родителя.

Сейчас я использую JavaScript для того чтобы сделать эту кнопку квадратной - устанавливаю ширину равной высоте. Но хотелось бы решить эту задачу средствами CSS.

Текущий код:

JavaScript:

createSquareButton(".picture-btn");
window.addEventListener("resize", () => {
  createSquareButton(".picture-btn");
});

function createSquareButton(target) {
  const elements = document.querySelectorAll(target);
  elements.forEach((element) => {
    element.style.width = `${element.offsetHeight}px`;
  });
}

CSS:

.container {
  display: flex;
  align-items: stretch;
}

.text-button button {
  padding: 15px 30px;
  background-color: #cccccc;
}

.picture-button button {
  height: 100%;
  background-image: url("example-image.jpg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}

HTML:

<div class="container">
  <div class="text-button">
    <button>Кнопка А</button>
  </div>
  
  <div class="picture-button">
    <button></button>
  </div>
  
  <div class="text-button">
    <button>Кнопка Б</button>
  </div>
</div>

Пробовал использовать CSS свойство aspect-ratio, но не смог заставить его работать с динамической высотой. Возможно ли вообще решить эту задачу только CSS?

Попробуй добавить aspect-ratio: 1/1 именно к кнопке с картинкой и убрать height: 100%. Вместо этого используй align-self: stretch на родительском div с классом .picture-button. У меня так работало в похожей ситуации - кнопка остается квадратной и подстраивается под высоту флекс-контейнера автоматически, без JS.

А ты пробовал через псевдоэлемент? Можно сделать .picture-button::before с content: '', display: block, padding-bottom: 100% - это создаст квадратную область. Потом кнопку позиционируешь абсолютно внутри. Старый трюк, но работает везде. Какие браузеры нужно поддерживать?