CSS высота равна ширине

Ширина и высота контейнера — независимые параметры, но иногда хотелось бы чтобы связь между ними была, к примеру, для сохранения пропорций контейнера при адаптивной верстке.

Прямой связи в CSS между width и height нет, и нет возможности задать aspect ratio контейнера вместо одного из параметров или использовать какую то функцию, потому часто прибегают к помощи js.

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

Если бы css функция attr поддерживалась свойствами width/height, то можно было бы попробовать читать ширину и высоту из одного и того же атрибута контейнера (как то так):

Но функция attr поддерживается только для css свойства content.

CSS хак, позволяющий установить зависимость между шириной и высотой контейнера

Нам повезло, что есть неожиданный эффект, который можно использовать для решения данной задачи.

Заключается он в том, что margin или padding вложенного контейнера, можно задать в %. Другой вопрос — в % от чего?

Рассмотрим пример HTML кода:

Контейнер получает ширину в 25% от родителя, а высота определяется высотой всевдо-контейнера (в данном случае зависит от padding-top). Но от чего считать 100% padding-top, если высота .container не задана?

Данный хак работает на всех браузерах, даже таких древних как IE8. Так без каких либо скриптов, мы получаем контейнер, где высота меняется вслед за шириной.

Практика применения

Пример выше не содержит контента, потому на практике такой блок довольно бесполезен, рассмотрим пример, содержащий что либо внутри.

Контент размещается внутри .content блока с абсолютным позиционированием. Для красоты я добавил центровку (для использования transform уже понадобится хотя бы IE9).

Можно растянуть .content блок по размеру .container, используя известный прием:

Остаётся лишь догадываться о том, как хак работает на самом деле, т.к. логика работы описанная в начале — это просто попытка хоть как то логически объяснить эффект.

Поддрежка aspect ratio с помощью CSS

В примерах я рассмотрел соотношение 1:1 — т.е. квадрат, но мы можем установить любое требуемое соотношение, меняя величину padding-top в .container:after.

Т.е. хак позволяет универсально задать нужный нам aspect-ratio — соотношение width/height.

Использование размеров viewport для связывания ширины и высоты в CSS

Есть более простой и понятный трюк с использованием в качестве единиц измерения размеров viewport (vw или vh).

Эффект тот же, ширина и высота в примере привязаны к одному и тому же параметру — ширине устройства. Но область применения значительно сокращается, т.к. размер контейнера зависит не от родителя, а от размеров документа (viewport-а).

Единицы vw/vh поддерживаются начиная с IE9.

Мало букафф? Читайте есчо !

Текст style CSS

Март 31, 2016 г.

Если вы решили разобраться как устроены документы в Интернет, тогда сразу после знакомства с гипертекстовой разметкой (HTML), вам нужно освоить каскадные ...

Читать

Как сделать чтобы scss mixin добавлял стили однократно

Март 29, 2025 г.

Иногда требуется, чтобы стили или часть стилей, формируемых миксином, добавлялись однократно. Например, ваш миксин добавляет анимацию и при этом объявляет блок @keyframes, который не зависит от параметров и для всех анимированных блоков одинаков. ...

Читать

Анимация свечения (мерцание)

Апрель 18, 2025 г.

Здесь мы разбираем CSS анимацию - мерцание. Это статья из цикла заметок по CSS анимации и эффектам. Эта анимация создаёт эффект мягкого свечения вокруг элемента, будто он излучает свет. Часто используется для привлечения внимания к кнопкам, ...

Читать

Кол-во знаков после запятой при генерации css препроцессором sass

Март 28, 2018 г.

В одном из проектов использовался SASS, но оказалось, что у другого разработчика другие настройки SASS. И конечные CSS генерировались с числами другой точности (другое кол-во знаков после запятой). Любое изменение в файле приводило к огромному ...

Читать
 

Комментарии к «CSS высота равна ширине»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: