Сохраняем пропорции высоты и ширины элемента при изменении ширины контента на чистом CSS

27.03.2018

Как пропорционально уменьшать ширину и высоту различных элементов при изменении ширины родительского контейнера?

Для изображений это делается очень просто, задаем свойству height значение auto, при этом максимальную ширину изображения ограничиваем шириной родительского контейнера max-width: 100%;

img{
  max-width: 100%;
  height: auto;
}

Проблема в том, что мы не можем задать height: auto; для блочных элементов, например для DIV. В данном случае 100% — это будет высота родителя.

Решение проблемы

HTML

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

<div class='box'> 
  <div class='content'>Aspect ratio of 1:1</div> 
</div>

CSS

.box{
  position: relative;
  width: 50%;		/* desired width */
}
.box:before{
  content: "";
  display: block;
  padding-top: 100%; 	/* initial ratio of 1:1*/
}

Итак, что это? Мы определяем псевдоэлемент для нашего ящика и задаем ему margin-top 100%. Поскольку это 100% значение относится к ширине элемента … вы получаете его (height: 0; padding-bottom: 100%; также будет работать, но тогда вы должны отрегулировать значение padding-bottom каждый раз, когда вы меняете ширину).

Таким образом, наш блок уже выше ширины. Если вы хотите отображать только несколько цветных блоков, тогда уже все готово. Но поскольку пользовательский интерфейс намного сложнее, и если вы также предоставляете некоторый контент, мы добавляем контент в наш блок .box.

Контент

И вот трюк: мы просто позиционируем блок контента как абсолютный со всеми четырьмя ориентациями, установленными в 0. Это просто покрывает родительский элемент полностью, независимо от того, какой размер он имеет.

.content{
  position:  absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}

Вот и все. Блестяще, не так ли? Даже padding не сломает его, и нет необходимости в box-sizing: border-box здесь.

Другие пропорции

Если вы хотите создать другие коэффициенты, просто измените значение padding-top псевдоэлемента:

/* Other ratios */
.ratio2_1:before{
  padding-top: 50%;
}
.ratio1_2:before{
  padding-top: 200%;
}
.ratio4_3:before{
  padding-top: 75%;
}
.ratio16_9:before{
  padding-top: 56.25%;
}

IE7 и ниже

Поскольку IE такой IE, и особенно IE7 — это все, но только не браузер, вы должны сами создать элемент вместо псевдоэлемента в своей разметке, если хотите поддержать IE. Или бросьте на него Javascript, пока он, надеюсь, не сломается. Навсегда.
Мой вольный перевод статьи http://www.mademyday.de/css-height-equals-width-with-pure-css.html.

Рабочий пример на CodePen:

See the Pen Height equals width with pure css by Denis (@deniscreative) on CodePen.0

Вариант №2 — Сохраняем пропорции высоты и ширины элемента при изменении ширины контента на чистом CSS без псевдоэлементов

Есть второй вариант без псевдоэлементов, но при его использовании блок всегда имеет ширину 100%, поэтому если нужно несколько таких блоков в ряд, то они должны быть помещены в какой-то родитель, у которого уже будет задана нужная ширина относительно остальных элементов на странице.

HTML

<div class="box"> 
  <div class="content">Some text</div>
</div>

CSS

.box {
  background-color: red;
  width: 100%;
  padding-top: 100%; /* 1:1 Aspect Ratio */
  position: relative;
}

/* If you want text inside of the container */
.content {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}

Другие пропорции

.ratio16_9{
  padding-top: 56.25%; /* 16:9 Aspect Ratio */
}
.ratio4_3{
  padding-top: 75%; /* 4:3 Aspect Ratio */
}
.ratio3_2{
  padding-top: 66.66%; /* 3:2 Aspect Ratio */
}
/* Other ratios */
.ratio8_5{
  padding-top: 62.5%; /* 8:5 Aspect Ratio */
}

Рабочий пример на CodePen:

See the Pen Height equals width with pure css without pseudoelement by Denis (@deniscreative) on CodePen.0

Полезная инфа:

Оставить комментарий