Выровненная слева и центрированная сетка с flexbox
Я хотел бы реализовать гибкий сетчатый макет с помощью flexbox (без медиа-запросов). В сетке может быть переменное количество элементов. Каждый элемент должен иметь фиксированную и равную ширину. Элементы должны быть выровнены влево. Вся группа должна иметь равные левый и правый поля.
Это должно выглядеть так:
![Ожидаемый результат]()
Вот как я пытался добиться этого:
.container {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
margin: auto;
}
.item {
height: 200px;
width: 200px;
background-color: purple;
padding: 10px;
margin: 10px;
}
<div class="container">
<div class="item">Flex item 1</div>
<div class="item">Flex item 2</div>
<div class="item">Flex item 3</div>
<div class="item">Flex item 4</div>
<div class="item">Flex item 5</div>
</div>
Ответы
Ответ 1
Одно довольно простое решение - просто добавить много невидимых предметов нулевой высоты в конце ваших обычных предметов:
<div class="parent">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="dummyItem"></div>
<div class="dummyItem"></div>
<div class="dummyItem"></div>
<div class="dummyItem"></div>
</div>
а также
.parent {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
.parent .item,
.parent .dummyItem{
width: 50px;
height: 50px;
background: white;
margin: 5px;
}
.parent .dummyItem {
height: 0;
}
Если в вашей самой длинной строке может быть n
видимых элементов, вам понадобится как минимум n-1
фиктивных элементов, чтобы это работало.
Единственное, что немного не так с этим, это то, что если есть только один ряд, то элементы не будут центрированы; вместо этого они будут выровнены (примерно) влево.
Ссылка на Codepen.
Ответ 2
Вы не можете достичь этого с помощью flexbox из коробки (по крайней мере, мне это не удалось). Вы можете попробовать с помощью justify-content: center;
, но это будет сосредоточено на всех мелочах, и вы получите что-то вроде:
![flexbox центрирование детей]()
Таким образом, единственным решением, которое мне удалось найти, является использование другого родительского элемента и перенос всего в него.
Пожалуйста, смотрите этот CodePen http://codepen.io/justd/pen/rOeMGZ
Я уверен, что вы найдете что-то для вас, просто попробуйте объединить различные методы CSS.
Ответ 3
Мне не удалось добиться такого поведения с помощью flexbox. Но это довольно просто с CSS Grid. Вам необходимо применить justify-content: center
к контейнеру.
Пример на CodePen
Ответ 4
Если вы установите явную ширину в контейнере, вы можете применить margin: 0 auto
к содержащему элементу, поскольку он больше не охватывает всю ширину окна.
Вот пример Codepen того, что вы ищете: http://codepen.io/alexverner/pen/MaExqb
Ответ 5
CSS Grid
Решение CSS Grid - единственное элегантное и гибкое решение CSS.
.container {
display: grid;
grid-template-columns: repeat(auto-fill, 200px);
grid-auto-rows: 200px;
grid-gap: 10px;
justify-content: center;
}
.item {
background-color: purple;
padding: 10px;
}
<div class="container">
<div class="item">Flex item 1</div>
<div class="item">Flex item 2</div>
<div class="item">Flex item 3</div>
<div class="item">Flex item 4</div>
<div class="item">Flex item 5</div>
</div>
Ответ 6
Вам нужно добавить flex: 0 1 auto
в селектор .item
.
Это означает, что
- 0: все элементы занимают одно и то же пространство
- 1: всем элементам разрешено сокращаться
- авто: автоматически вычисляет ширину, нет минимума.
Ответ 7
Думаю, вам просто нужно предоставить вашему контейнеру сетки какой-то max-width
, тогда ваши автопоставки тоже будут работать. Что происходит, ваш контейнер расширяется на 100% с обеих сторон, поэтому нет ничего для автоматической маржи, с которой можно работать.
Итак, если вы хотите, чтобы он расширялся до 3 элементов на строку max, просто установите для параметра max-width
значение 660 (ширина позиции + позиция поля):
.container {
max-width: 660px;
margin: 0 auto;
display: flex;
flex-flow: row-wrap;
}
.item {
width: 200px;
height: 200px;
margin: 10px;
}
Здесь a Codepen: http://codepen.io/kgrote/pen/qbpGWZ
Контейнер будет гибко расширяться до тех пор, пока не будет достигнута максимальная ширина, а затем центрируется, сохраняя свои дети в сетке с выравниванием по левому краю. Когда контейнер сжимается, дети будут складываться по мере необходимости.