Перенос элемента Flexbox в новую строку [дубликат]

этот вопрос уже есть ответ здесь:

  • разрыв линии в многострочном flexbox 7 ответов

существует сетка flexbox.

css lang-css prettyprint-override">.flex {
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;
}

.item {
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
}
html lang-html prettyprint-override"><div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
</div>

Как перевести .new-строка в новую строку вместе с элементами, которые следуют за ней?

4 ответов


если вы посмотрите на это замечательный ответ вы заметите, что единственный кросс-браузерный способ (без ограничения разрыва строки 2) - вставка 100%-ширина пустых блоков ("разрывы линий"). Так что для подобной разметки это будет выглядеть как

.flex {
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;
}

.item {
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
}

.line-break {
  width: 100%;
}
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

если вы хотите сохранить свой стиль разметки, вам придется вставить это line-break блоки через JavaScript:

var items = document.querySelectorAll(".flex > .item.new-string");

for (var i = 0; i < items.length; i++) {
  var lineBreak = document.createElement('div');
  lineBreak.className = "line-break";

  items[i].parentNode.insertBefore(lineBreak, items[i]);
}
.flex {
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;
}

.item {
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
}

.line-break {
  width: 100%;
}
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
  <div class="item new-string"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

в качестве альтернативы вы можете просто сделать это

HTML-код

<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item line-break"></div>
  <div class="item new-string"></div>
</div>

в CSS

.line-break {
    width: 100%;
}

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


это, кажется, можно сделать с помощью Grid-layout. Сначала для размещения элементов inline вы можете использовать

grid-template-columns: repeat(auto-fill, 50px);

так что каждый элемент занимает 50px, и он будет размещать элементы в одной строке, пока больше элементов не может поместиться в одной строке. И тогда вы можете использовать grid-column-start: 1; по конкретному пункту, чтобы он переходил в новую строку.

* {
  box-sizing: border-box;
}
.flex {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 50px);
  border: 2px solid red;
}

.item {
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
}

.new-string {
  grid-column-start: 1;
  background: red;
}
<div class="flex"><div class="item"></div><div class="item"></div><div class="item"></div><div class="item new-string"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item"></div><div class="item new-string"></div><div class="item"></div><div class="item"></div><div class="item new-string"></div><div class="item"></div></div>

все элементы flex по умолчанию установлены в order: 0. Это означает, что они будут выложены в том порядке, в котором они появляются в исходном коде.

если вы даете последний пункт order: 1, это заставляет его быть последним, когда добавляются дополнительные элементы.

на ::before и ::after псевдо-элементы в контейнере flex создают новые элементы flex.

поэтому, если мы добавим один псевдо-элемент с достаточно большой шириной, он заставит ваш последний элемент (задается order) в следующий ряд.

.flex {
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;
}

.item {
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
}

.new-string {
  order: 1;
}

.flex::after {
  content: "";
  flex: 0 0 100%;
  height: 0;
}
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
</div>