Перейти к содержимому

Как сделать адаптивный квадрат на css

  • автор:

Адаптивные круглые и другие пропорциональные блоки на CSS

Блок считает свободную ширину родительского блока , то есть 25% — 30px(левый и правый внутренние отступы) и устанавливает верхний внутренний отступ padding-top в значение 100% от высчитаной свободной ширины родительского блока , то есть теперь высота блока равна его ширине.

Блоку также установлено свойство position: relative; , чтобы относительно этого блока позиционировался дочерний блок

Далее просто добавляем блок и задаем ему следующие стили, чтобы он занял всю область блока

.aspect-ratio__body

Если не задать эти стили, то блок будет просто располагаться под верхним внутренним отступом блока

Чтобы сделать из квадрата круг, блоку добавляем сделующие стили

.aspect-ratio__body < position: absolute; top: 0; left: 0; right: 0; bottom: 0; width: 100%; height: 100%; overflow: hidden; /* скрывает часть контента, которых выходит за пределы круга, в данном примере изображение */ border-radius: 50%; /* устанавливает со всех сторон радиус по половине стороны квадрата и получаем круг */ >

Таким же образом можно сделать адаптивный пропорциональный прямоугольник любого размера

При произвольных размерах прямоугольника очень просто воспользоваться формулой для установки значения padding-top — calc((высота / ширина)*100%) (calc() можно использовать для всех браузеров)

Например, в макете горизонтальный прямоугольник шириной 754px и высотой 312px и нам нужно его пропорционально адаптировать, то блоку устанавливаем

.aspect-ratio__item < padding-top: calc((312/754)*100%); position: relative; >

Если в макете вертикальный прямоугольник шириной 200px и высотой 350px то устанавливаем следующее

.aspect-ratio__item < padding-top: calc((350/200)*100%); position: relative; >

Адаптивный квадрат на CSS

Как вычисляется padding , если он указан в процентах? Очень просто:

При указании padding в процентах, значение считается от ширины родителя элемента.

Даже внутренний отступ сверху и снизу вычисляется именно исходя из ширины родителя. Поэтому реализовать адаптивный квадрат на CSS очень просто.

.square display: block; width: 50%;
>

.square:after content: '';
display: block;
padding-top: 100%;
>
  1. создаем блок, который хотим сделать квадратным
  2. помещаем внутрь элемент ( :after )
  3. делаем элемент блочным
  4. задаем элементу padding-top: 100%

Псевдоэлемент используется, чтобы не создавать лишний html элемент.

А как поместить контент?

Все сломается, если поместить в блок .square контент, например, текст. Наш квадрат превратится в прямоугольник. Эта проблема тоже решается очень просто.

.square position: relative; 
display: block;
>

.square:after content: '';
display: block;
padding-top: 100%;
>

.content position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
>
// html

Снова по порядку:

  1. Задаем position: relative; для нашего квадратного блока
  2. Весь контент оборачиваем в html-блок .content
  3. Позиционируем .content абсолютно
  4. Растягиваем .content на всю ширину и высоту блока .square

Так как .content спозиционирован абсолютно — контент, находящийся внутри не будет растягивать квадрат.

Как сделать Резиновый квадрат с контентом?

НО, так не нормально, потому что все работает так же как если бы я указывал раззмеры в vw/vh.

  • Вопрос задан более трёх лет назад
  • 5256 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 3

Amirez

В чем секрет кота Бориса?

будет уменьшаться относительно высоты.

Ответ написан более трёх лет назад
Нравится 2 1 комментарий

Amirez

Можно еще через padding-bottom, так как padding и margin берут значения ширины блока. VW и vh не подлерживаются safari. P.S. давно сюда не заходил

serg160485

Сергей Петроченко @serg160485

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

Ответ написан более трёх лет назад
Нравится 1 5 комментариев
Banny_Boom @Banny_Boom Автор вопроса
с js знаю решение, но не хотелось бы прибегать лишний раз к js)

serg160485

Сергей Петроченко @serg160485

На чистом css не уверен что получится пропорционально изменять блок! только если в него квадраного ребенка вставлять))) типо картинки

Banny_Boom @Banny_Boom Автор вопроса
Сергей Петроченко: тогда это выйдет статичный квадрат :c

serg160485

Сергей Петроченко @serg160485

Даже не знаю что сказать) думаю ничто не пострадает если вы все-таки jquery примените, к блоку нужному jQuery(«.square»).on(«resize»,function() <
ну а тут вычисляйте размеры типо что больше высота или ширина и в зависимости от этого , одно под другое подстраивается
>);

Как сделать квадратный блок, у которого ширина равна высоте?

Возможно ли сделать блок (div), у которого ШИРИНА всегда равна ВЫСОТЕ, только средствами html и css, без javascript?

Знаю, что можно сделать так, чтобы ВЫСОТА была равна ШИРИНЕ с помощью padding-top: 100%, но мне нужно сделать адаптив по высоте

ситуация:
у меня строится сетка по одномерному массиву с помощью grid, нужно, чтобы ячейки были квадратными, но если их делать квадратными по принципу высота ячейки равна ширине, то получается, что такая сетка может не поместиться по высоте

  • Вопрос задан более двух лет назад
  • 352 просмотра

5 комментариев

Простой 5 комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *