Горизонтальное и вертикальное выравнивание внутри родительского блока со скролом

Не так давно я столкнулся с проблемой выравнивания контента по центру блока со скролом, пришлось потратить некоторое время на поиски решения этой проблемы.

Горизонтальное центрирование контента по центру блока.

Для примера реализуем блок с горизонтальным скролом. Внутри которого будет блок типа flexbox. А внутри него будет некоторое количество элементов.

<div class="scroll">
   <div class="flex-container">
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
   </div>
</div>
.scroll {
  width: 400px;
  height: 60px;
  overflow-x: scroll;
  border: 1px solid #d1d1d1;
}

.flex-container {
  display: flex;
  justify-content: center;
}

.flex-item {
  padding: 6px 10px;
  border: 1px solid #d1d1d1;
}

Если посмотреть на результат то на первый взгляд может показаться что все в порядке.

Горизонтальное выравнивание по центру блока 1

Но если проинспектировать код то можно заметить что ширина flex контейнера равна ширине родительского блока со скролом.

Горизонтальное выравнивание по центру блока 2

Теперь предположим что нам нужно отцентрировать элементы внутри flex контейнера.

Если элементов будет несколько то все будет нормально отображаться.

Горизонтальное выравнивание по центру блока 4

Но если элементов будет больше и появится горизонтальный скрол то можно заметить что отображение сломалось.

Горизонтальное выравнивание по центру блока 5

Положение скрола находится в начальном положении но первый элемент виден не полностью.

Эта проблема решается добавлением min-width: max-content; в .flex-container

О свойствах min-width можно почитать здесь. Стоит заметить что IE не поддерживает max-content.

.flex-container {
  display: flex;
  justify-content: center;
  min-width: max-content;
}

В примере ниже можно посмотреть проблему и ее решение.

Вертикальное выравнивание контента по центру блока.

Теперь давайте разберем пример с вертикальным выравниванием по центру блока со скролом.

Предположим у нас есть блок со скролом внутри которого нам нужно отцентрировать flexbox блок с элементами

<div class="scroll">
    <div class="flex-container">
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
      <div class="flex-item">Element</div>
    </div>
</div>
.scroll {
  display: flex;
  width: 400px;
  height: 100px;
  border: 1px solid #d1d1d1;
  overflow-y: scroll;
}

.flex-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
}

.flex-item {
  margin: 0 0 10px;
}

Результат такой же как и в предыдущем примере.

Вертикальное выравнивание по центру блока 1

Но в инспекторе Google Chrome можно увидеть что высота flexbox контейнера равна родительскому блоку.

Вертикальное выравнивание по центру блока 2

И если немного проскролить то можно увидеть что контент не обтекает содержимое. Но пока не включено вертикальное выравнивание контент отображается нормально.

Вертикальное выравнивание по центру блока 1

Теперь включим выравнивание контента по центру. Если элементов мало то все отображается нормально.

Вертикальное выравнивание по центру блока 5

А если при выравнивании flexbox контейнера в нем будет много элементов, которые занимают больше пространства и мы проинспектируем элемент то можно увидеть что первые элементы уходят за пределы видимости родительского контейнера.

Вертикальное выравнивание по центру блока 6

Теперь давайте добавим flexbox контейнеру margin: auto; и посмотрим на результат.

Вертикальное выравнивание по центру блока 7

Готово, теперь контейнер растянулся по содержимому.

В примере ниже можно наглядно посмотреть решение проблемы.

Про выравнивание margin’ами можно почитать здесь.

Спасибо за внимание, надеюсь эта статья была полезной.

Leave a Reply