Flex и auto margins
В flex-контейнере
margin: autoпоглощает всё доступное свободное пространство по оси, позволяя отталкивать элементы к краям без дополнительной разметки.
Зачем нужно
margin: auto во Flexbox — один из самых элегантных трюков CSS. Он заменяет необходимость в распорочных <div> или flex: 1 на пустышках. Позволяет прижать отдельный элемент к правому краю навбара, разделить группу кнопок, создать sticky-footer без лишнего кода.
Где используется
- Прижать элемент к правому краю в navbar
- Разделить кнопки в footer карточки
- Центрирование одного элемента при нескольких соседях
- Sticky-footer паттерн
Основной контент
Базовый принцип
/* В flex-контейнере margin: auto поглощает свободное место */
.nav {
display: flex;
align-items: center;
gap: 16px;
}
.nav .logo { /* Слева */ }
.nav .spacer {
margin-left: auto; /* Всё свободное место уходит сюда */
}
.nav .actions { /* Прижаты к правому краю */ }
<nav class="nav">
<div class="logo">Logo</div>
<!-- Нет .spacer — используем margin-left: auto напрямую -->
<a class="actions" style="margin-left: auto">Login</a>
</nav>
Паттерны с auto margins
/* 1. Прижать последний элемент вправо */
.toolbar {
display: flex;
gap: 8px;
}
.toolbar .close()-btn {
margin-left: auto; /* Кнопка закрытия — справа */
}
/* 2. Разделить на две группы */
.footer {
display: flex;
align-items: center;
}
.footer .secondary {
margin-left: auto; /* Всё после этого — справа */
}
/* 3. Центрировать один элемент при flex-direction: column */
.card {
display: flex;
flex-direction: column;
}
.card .cta {
margin-top: auto; /* Кнопка прижата к низу */
}
auto margin vs justify-content
/* justify-content распределяет ВСЕХ потомков */
.container {
display: flex;
justify-content: space-between; /* все элементы равномерно */
}
/* auto margin даёт точечное управление */
.container {
display: flex;
}
.container .item-3 {
margin-left: auto; /* только этот элемент отодвинут */
}
auto margin в обеих осях
/* Центрирование flex-элемента */
.wrapper {
display: flex;
height: 300px;
}
.centered {
margin: auto; /* margin: auto по обеим осям = идеальное центрирование */
}
Sticky footer с auto margin
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1; /* или margin-bottom: auto на main */
}
footer {
/* Прижат к низу */
}
Частые ошибки
margin: autoпоглощаетgap— если у контейнера естьgapиmargin-left: auto, gap тоже присутствует между этим элементом и предыдущимautoне работает без свободного места — если контейнер переполнен илиjustify-contentуже распределил пространство,margin: autoне имеет эффекта- Смешение
justify-contentиmargin: auto— приjustify-content: centerсвободного пространства нет иmargin: autoне даёт эффекта margin: autoпо поперечной оси —align-self: auto≠margin: auto; второе поглощает место, первое выравнивает