Есть ли способ сделать разрыв строки в многострочном flexbox?
Например, разбить после каждого 3-го элемента в этом CodePen .
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
height: 100px;
background: gold;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) {
background: silver;
}
<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 class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
подобно
.item:nth-child(3n){
/* line-break: after; */
}
Ответы:
Самое простое и надежное решение - вставлять гибкие элементы в нужных местах. Если они достаточно широкие (
width: 100%
), они вызовут разрыв строки.Показать фрагмент кода
Но это некрасиво и не семантически. Вместо этого мы могли бы генерировать псевдоэлементы внутри flex-контейнера и использовать их
order
для перемещения в нужные места.Показать фрагмент кода
Но есть ограничение: гибкий контейнер может иметь только псевдоэлемент
::before
и::after
. Это означает, что вы можете форсировать только 2 перевода строки.Чтобы решить эту проблему, вы можете сгенерировать псевдоэлементы внутри элементов flex, а не в контейнере flex. Таким образом, вы не будете ограничены 2. Но эти псевдоэлементы не будут гибкими элементами, поэтому они не смогут вызвать разрывы строк.
Но, к счастью, CSS Display L3 представил
display: contents
(в настоящее время поддерживается только Firefox 37):Таким образом, вы можете обратиться
display: contents
к дочерним элементам гибкого контейнера и обернуть содержимое каждого из них в дополнительную обертку. Тогда гибкими элементами будут те дополнительные обертки и псевдоэлементы дочерних элементов.Показать фрагмент кода
Кроме того , в соответствии с фрагментирующей Flex Layout и CSS фрагментация , Flexbox позволяет вынуждены перерывы с помощью
break-before
,break-after
или их псевдонимами CSS 2.1:Показать фрагмент кода
Принудительные разрывы строк во flexbox пока широко не поддерживаются, но это работает в Firefox.
источник
break-after
решением, которое потребует только изменения селектора в таблице стилей.display: block;
к.container
::before
и::after
псевдо классам , чтобы сделать номер два решения работы в IE. YMMV!С моей точки зрения более семантически использовать
<hr>
элементы как разрывы строк между элементами flex.Протестировано в Chrome 66, Firefox 60 и Safari 11.
источник
gap: 10px;
расстояние между рядами на самом деле20px
. Для адреса, указать разрыв строки половины этого размера:gap: 5px 10px;
.border
должен быть установленnone
вместо0
border:0;
так же, как иborder:none;
. См .: stackoverflow.com/questions/2922909/…У @Oriol отличный ответ, к сожалению, по состоянию на октябрь 2017 года, ни тот
display:contents
, ни другойpage-break-after
широко не поддерживаются, лучше сказать, что это Firefox, который поддерживает это, но не других игроков, я придумал следующий «взлом», который я считаю лучше, чем сложный кодирование в перерыве после каждого третьего элемента, потому что это сделает очень трудным сделать страницу удобной для мобильного.Как уже говорилось, это взлом, и недостатком является то, что вам нужно добавить довольно много дополнительных элементов, но это работает и работает в разных браузерах даже на устаревшем IE11.
«Хаком» является простое добавление дополнительного элемента после каждого элемента div, который устанавливается
display:none
и затем использует css,nth-child
чтобы решить, какой из этих элементов должен быть на самом деле сделан видимым, вызывая торможение линии следующим образом:источник
.container>p
. Тогда всем этим<p></p>
тегам не понадобитсяclass
атрибут. Не важно конечно. Просто мой ленивый мозг нашел крошечный, экономящий место твой хитрый способ решения. Конечно, он также полагается на то, что пользователь не имеет других<p>
тегов как прямых потомков.container
div. Технически вы могли бы сделать то же самое со всеми другими<div>
детьми, но вы гораздо более вероятно, есть и другие<div>
ю.ш. в.container
чем вас<p>
с, так что, вероятно , не умный ход там.Вы хотите семантический перенос строки?
Тогда подумайте об использовании
<br>
. W3Schools может предложить вамBR
написать стихи (мой скоро будет), но вы можете изменить стиль, чтобы он действовал как блочный элемент шириной 100%, который переместит ваш контент на следующую строку. Если 'br' предлагает перерыв, то это кажется мне более подходящим, чем использованиеhr
или 100%,div
и делает HTML более читабельным.Вставьте
<br>
туда, где вам нужно разрывы строк и стилизуйте это так.Вы можете отключить
<br>
с запросами средств массовой информации , путем установкиdisplay:
наblock
илиnone
в зависимости от обстоятельств (я включил пример этого , но оставил его закомментирован).Вы можете использовать,
order:
чтобы установить порядок, если это необходимо.И вы можете поставить столько, сколько хотите, с разными классами или именами :-)
Не нужно ограничиваться тем, что говорит W3Schools:
источник
<br class="2col">
после каждого второго предмета,<br class="3col">
после каждого третьего. Затем примените классcols-2
к контейнеру и создайте CSS, чтобы включить только соответствующие разрывы строк для этого числа столбцов. например.br { display: none; } .cols-2 br.2col { display: block; }
br
не для элементов разрыва строки , это для текста : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/…break-*
показано в принятом ответе), хотя, к сожалению, оно еще не достигло кросс-браузеров Таким образом, второй лучший вариант - это использовать элемент, который изначально заполняет ширину родительского элемента и помещает всех последующих братьев и сестер в ряд самих себя, что снова дается в принятом ответе. Таким образом, использование любого другого элемента, кроме блока, подобного одному, будет семантически хуже, напримерbr
.Я думаю, что традиционный способ является гибким и довольно простым для понимания:
наценка
Создайте файл grid.css :
Я создал пример (jsfiddle)
Попробуйте изменить размер окна до 400px, это отзывчиво !!
источник
Другое возможное решение, которое не требует добавления дополнительной разметки, - это добавление динамического поля для разделения элементов.
В случае примера это можно сделать с помощью
calc()
простого добавленияmargin-left
иmargin-right
к элементу 3n + 2 (2, 5, 8)Пример сниппета
источник
calc
как указано в этом ответе.margin-right: 1px
элемент, и следующий элемент будет начинаться с новой строки.Для будущих вопросов, это также возможно сделать, используя
float
свойство и очистив его в каждом из 3 элементов.Вот пример, который я сделал.
источник
display: flex;
нетdisplay: inline-block;
.cell:nth-child(3n + 1)
вместоЯ попробовал несколько ответов здесь, и ни один из них не сработал. По иронии судьбы, то, что сработало, было о самой простой альтернативе, которую
<br/>
можно было предпринять:<div style="flex-basis: 100%;"></div>
или вы могли бы также сделать:
<div style="width: 100%;"></div>
Поместите это, где вы хотите новую строку. Кажется, работает даже с соседними
<span>
, но я использую его с соседними<div>
.источник
flex-basis
.Вы можете попробовать обернуть элементы в элемент dom, как здесь. с этим вам не нужно знать много CSS, просто хорошая структура решит проблему.
источник
display: block
и сделать эти новые флексбоксы div 2-го уровня. Это работает для строк. Замените деления с пролетами при использовании режима столбца.