Не работает justify-content: center, но работает margin: 0 auto

Почему в примере ниже не работает для выравнивания justify-content: center, а работает margin: 0 auto. Когда какой использовать?

.fed-form {
  display: flex;
  flex-direction: column;
  width: 300px;
  margin: 0 auto;
  margin-top: 30px;
  justify-content: center;
}
<div class="consultation">

  <div class="container">
    <h2 class="title title_left">
      Получите бесплатную консультацию <br>по подбору пульсометра
    </h2>
    <div class="consultation__descr">
      Просто заполните форму заявки<br> и мы вам перезвоним в течении 10 минут
    </div>
    <form class="fed-form" action="#">
      <input name=" name" required placeholder="Ваше имя" type="text">
      <input name=" phone" required placeholder="Ваш телефон" type="number">
      <input name=" E-mail" required placeholder="Ваш E-mail" type="email">
      <!-- <input type="submit" value="Заказать консультацию" > -->
      <button class="button button_submit">Заказать консультацию</button>

    </form>
  </div>
</div>


Ответы (1 шт):

Автор решения: De.Minov

justify-content как бы в своём название намекает, что свойство распространяется только на содержимое блока и выравнивает он по горизонтали, при условии, что flex-direction: row.
В связке с flex-direction: column; для выравнивания по горизонтали нужно использовать aligh-items, justify-content будет использоваться для выравнивания по вертикали.

В то время как margin это внешний отступ и если блоку установить жёсткий размер и margin: 0 auto (что означает margin-left: auto; margin-right: auto;), то блок будет с одинаковыми отступами слева и справа, относительно своего родителя (если размер самого блока и родителя не будет одинаковый, иначе отступ будет равен нулю).


Когда какой использовать?

Если выравнивать блоки нужно горизонтально по центру:

Используйте align-items: center:

.parent {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
  background: red;
}

.child {
  display: block;
  height: 30px;
  background: blue;
}

.child:not(:last-child) {
  margin-bottom: 10px;
}
<div class="parent">
  <div class="child" style="width: 100px"></div>
  <div class="child" style="width: 200px"></div>
  <div class="child" style="width: 150px"></div>
</div>

Или же через margin: 0 auto, но задать его нужно для дочерних блоков:

.parent {
  display: flex;
  flex-direction: column;
  width: 100%;
  background: red;
}

.child {
  display: block;
  height: 30px;
  background: blue;
  margin: 0 auto;
}

.child:not(:last-child) {
  margin-bottom: 10px;
}
<div class="parent">
  <div class="child" style="width: 100px"></div>
  <div class="child" style="width: 200px"></div>
  <div class="child" style="width: 150px"></div>
</div>

Если же сам блок выровнять, то нежно использовать ту же логику, что описал выше, только "выше уровнем вложения".

→ Ссылка