Почему пространство вокруг позволяет гибким элементам переполняться с левой стороны?

Кажется, что Chrome не обрабатывает justify-content: space-around правильно, когда содержимое переполняет контейнер flex, а контейнер не настроен для переноса, но вместо этого горизонтальная прокрутка.

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

Вот пример:

#container {
  display: flex;
  width: 500px;
  justify-content: space-around;
  border: solid black;
  overflow: auto;
}
.item {
  min-width: 200px;
  margin: 10px;
  background-color: red;
  display: table;
  font-size: 48pt;
  text-align: center;
}
<div id="container">
  <div class="item">1</div><div class="item">2</div>
  <div class="item">3</div><div class="item">4</div>
  <div class="item">5</div><div class="item">6</div>
</div>

Ответы

Ответ 1

Так как контейнер ограничен по ширине, и вы хотите, чтобы переполняющие элементы гибкости были доступны через горизонтальную прокрутку, зачем использовать justify-content: space-around?

Попробуйте justify-content: flex-start:

Пересмотренный Codepen

Чтобы понять, почему переполненные элементы гибкости могут быть недоступны через прокрутку, см. этот ответ.

Если вы заинтересованы в обходном пути Javascript для исходного кода, см. это сообщение:

Ответ 2

Это потому, что, когда места недостаточно, space-around ведет себя как center:

Если оставшееся свободное пространство отрицательное или существует только один flex item в строке, это значение идентично center.

И center ведет себя так, как вы описываете:

Если оставшееся свободное пространство отрицательное, flex items будет переполняться одинаково в обоих направлениях.

Вместо этого вы можете использовать space-between:

Если оставшееся свободное пространство отрицательное или существует только один flex item в строке, это значение идентично flex-start.

Конечно, тогда у вас не будет полуразмерных пространств ни на одном конце гибкой линии. Однако вы можете вставить псевдоэлемент, чтобы иметь полноразмерные пробелы.

#container {
  display: flex;
  justify-content: space-between; /* Instead of space-around */
}
#container::before, #container::after {
  content: ''; /* Insert space before the first item and after the last one */
}

.container {
  display: flex;
  width: 500px;
  border: solid black;
  justify-content: space-between;
  overflow: auto;
  margin: 10px 0;
}
.container::before, .container::after {
  content: '';
}
.item {
  margin: 10px;
  background-color: red;
  display: table;
  font-size: 48pt;
  text-align: center;
}
.big > .item {
  min-width: 200px;
}
<div class="container big">
  <div class="item">1</div><div class="item">2</div>
  <div class="item">3</div><div class="item">4</div>
  <div class="item">5</div><div class="item">6</div>
</div>
<div class="container">
  <div class="item">1</div><div class="item">2</div>
  <div class="item">3</div><div class="item">4</div>
  <div class="item">5</div><div class="item">6</div>
</div>