Если вы хотите, чтобы ваши элементы имели определенную пропорцию по отношению друг к другу или ко всему (т. Е. 50%
), flexbox - даже не лучшее решение (хотя его можно выровнять, чтобы выполнить требование),
Подойдет простой display: inline-block; width: 50%; box-sizing: border-box
для детей.
Flexbox был спроектирован для распределения жидкости в положительном или отрицательном пространстве.
Например, после того, как браузер определит, сколько места нужно детям и сколько у них есть свободного места, сравнивая два, он имеет дело с двумя случаями:
- положительное пространство : когдародитель> сумма дочерних элементов, перераспределите пространство каждому дочернему элементу пропорционально их соответствующим значениям
flex-grow
(до заполнения пространства) или, если нет дочерних элементов с положительными значениями flex-grow
, распределите пространство между дочерними элементами - отрицательный пробел : если родитель <сумма детей, сократите каждого ребенка пропорционально их <code>flex-shrink значениям.
У вас есть случай положительного пробела, где детине имеют flex-grow
, поэтому пространство может быть перераспределено между ними.У вас есть три варианта:
justify-content: space-between
justify-content: space-around
justify-content: space-evenly
Обратите внимание, что пробелы одинаковыраспределяется в каждом конкретном случае.Вот почему он называется flexbox
, для этого он и предназначен, и, если хотите, это его сверхдержава.
Когда вы устанавливаете width: 50%
, вы как бы забираете все это:
.row {
display: flex;
width: 100%;
}
.row>* {
border: 1px solid #ccc;
text-align: center;
}
.one {
justify-content: space-between;
}
.two {
justify-content: space-around;
}
.three {
justify-content: space-evenly;
}
.grow>* {
flex-grow: 1;
margin: 1rem;
}
<code>justify-content: space-between</code>
<div class="row one">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<code>justify-content: space-between (unequal)</code>
<div class="row one">
<div>
<h2>A bigger element here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<code>justify-content: space-around;</code>
<div class="row two">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<code>justify-content: space-around; (unequal)</code>
<div class="row two">
<div>
<h2>A bigger element here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<code>justify-content: space-evenly;</code>
<div class="row three">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<code>justify-content: space-evenly; (unequal)</code>
<div class="row three">
<div>
<h2>A bigger element here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<code>> flex-grow: 1;</code>
<div class="row grow">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<code>> flex-grow: 1; (unequal elements)</code>
<div class="row grow">
<div>
<h2>A bigger element here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
Более подробное объяснение того, как работает flexbox
, можно найти здесь .
Официальная спецификация здесь .
Учитывая ваш вопрос, есть большой шанс justify-content: space-evenly
сделает то, что вы хотите, но я не уверен, так как ваш вопрос не очень ясен.
Важное примечание : Вы всегда можете использовать margin
и padding
на своих элементах, что соответственно подтолкнет их.Также обратите внимание, что margin: auto
на flexbox
дочерние элементы украдут положительное пространство из flexbox и перераспределят его равным между всеми margin:auto
s, присутствующими в родительском пространстве (и будут выглядеть так, как если бы flexbox неработать должным образом, на самом деле это работает, но перераспределять ничего не остается).
Если вы хотите иметь определенное расстояние между вашими элементами, и вся композиция должна быть центрирована в доступном пространстве, вы можетецентрируйте один предмет в доступном пространстве, и внутри этого предмета вы можете разместить предметы так, чтобы все это было отцентрировано независимо от того, что предметы неравны.
Пример:
.row {
display: flex;
justify-content: center;
}
.row > * {
margin: 0 auto;
display: flex;
}
.row>*>* {
border: 1px solid #ccc;
text-align: center;
margin: 1rem;
}
<div class="row">
<div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
</div>
<hr>
<div class="row">
<div>
<div>
<h2>Much more text here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
</div>
<hr>
<div class="row">
<div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Much more text here</h2>
<p>Text</p>
</div>
</div>
</div>
Но, опять же, это не то, для чего вам нужно flexbox
.
Точно такого же можно добиться, используя простую структуру parent > child
, гдеу родителей display: block; text-align: center;
, а у детей display: inline-block;
.row {
text-align: center;
}
.row>* {
border: 1px solid #ccc;
text-align: center;
margin: 1rem;
display: inline-block;
}
<div class="row">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<div class="row">
<div>
<h2>Much more text here</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
</div>
<hr>
<div class="row">
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Centered</h2>
<p>Text</p>
</div>
<div>
<h2>Much more text here</h2>
<p>Text</p>
</div>
</div>
Обратите внимание на отсутствие дополнительной обертки в разметке.