Как создать "резиновый" квадрат в css
Требуется создать CSS-квадрат, отвечающий следующим требованиям:
Сохранение пропорций:
Квадрат должен оставаться квадратом при любых
размерах окна браузера;
Центрирование:
Квадрат должен быть расположен строго по центру
окна как по горизонтали, так и по вертикали;
Ограничение размеров:
Квадрат не должен выходить за границы окна и не
должен вызывать появление полос прокрутки;
Внешние отступы:
Между краями квадрата и краями окна должны быть
внешние отступы;
Относительные единицы:
Для задания размеров и отступов необходимо
использовать только относительные единицы (%, vw, vh и т.д.)
Если реализовать такую задачу исключительно с помощью HTML и CSS невозможно, прошу предложить альтернативные решения.
Спасибо за помощь!
Ответы (3 шт):
Автор решения: DiD
→ Ссылка
:root {
--offset-x: 10vw; /* отступ по горизонтали */
--offset-y: 10vh; /* отступ по вертикали */
}
html,body{
height: 100%; /* оба (html, body) делаем в 100% высоты */
margin: 0; /* это для того, чтобы body не создавал
прокрутку при height: 100% */
display: grid; /* для body, чтобы заработал place-content */
place-content: center; /* Отображать содержимое по центру */
}
.rect {
border: 1em solid yellow;
background: red;
aspect-ratio: 1 / 1;
/* Старый приём, работает во всех браузерах:
ставим нужные width и height */
width: calc(100vw - 2 * var(--offset-x));
height: calc(100vh - 2 * var(--offset-y));
/* А потом прописываем те же max-width и max-height,
только меняем их местами */
max-width: calc(100vh - 2 * var(--offset-y));
max-height: calc(100vw - 2 * var(--offset-x));
}
<div class="rect"></div>
Автор решения: Qwertiy
→ Ссылка
html, body {
height: 100%;
margin: 0;
}
body {
display: flex;
}
div {
width: calc(100vmin - min(10%, 10em));
aspect-ratio: 1;
margin: auto;
background: silver;
}
<div></div>
Автор решения: Andrei Fedorov
→ Ссылка
body {
margin: 0;
display: flex;
min-height: 100dvh;
}
.square {
margin: auto;
width: 50vmin;
aspect-ratio: 1;
background-color: darkblue;
}
<div class="square"></div>