Existe uma maneira de fazer uma quebra de linha no flexbox de várias linhas?
Por exemplo, para quebrar após cada terceiro item neste 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>
Gostar
.item:nth-child(3n){
/* line-break: after; */
}
Respostas:
A solução mais simples e confiável é inserir itens flexíveis nos lugares certos. Se tiverem largura suficiente (
width: 100%
), forçarão uma quebra de linha.Mostrar snippet de código
Mas isso é feio e não semântico. Em vez disso, poderíamos gerar pseudoelementos dentro do contêiner flex e usá
order
-los para movê-los para os lugares certos.Mostrar snippet de código
Mas há uma limitação: o contêiner flex pode ter apenas um
::before
e um::after
pseudo-elemento. Isso significa que você só pode forçar duas quebras de linha.Para resolver isso, você pode gerar os pseudoelementos dentro dos itens flex, em vez de no contêiner flex. Dessa forma, você não ficará limitado a 2. Mas esses pseudoelementos não serão itens flexíveis, portanto não poderão forçar quebras de linha.
Mas, felizmente, o CSS Display L3 introduziu
display: contents
(atualmente suportado apenas pelo Firefox 37):Assim, você pode aplicar
display: contents
aos filhos do contêiner flex e envolver o conteúdo de cada um dentro de um invólucro adicional. Então, os itens flexíveis serão os invólucros adicionais e os pseudoelementos das crianças.Mostrar snippet de código
Alternativamente, de acordo com Fragmentar Flex Disposição e fragmentação CSS , Flexbox permite quebras forçado usando
break-before
,break-after
ou os seus nomes alternativos CSS 2.1:Mostrar snippet de código
As quebras de linha forçadas no flexbox ainda não são amplamente suportadas, mas funcionam no Firefox.
fonte
break-after
solução, que exigiria apenas a modificação de um seletor na folha de estilo.display: block;
as classes.container
::before
e::after
pseudo para fazer a solução número dois funcionar no IE. YMMV!Na minha perspectiva, é mais semântico usar
<hr>
elementos como quebras de linha entre itens flexíveis.Testado no Chrome 66, Firefox 60 e Safari 11.
fonte
gap: 10px;
a distância entre as linhas é realmente20px
. Para endereço, especificar uma lacuna fileira de metade desse tamanho:gap: 5px 10px;
.border
deve ser definida paranone
, em vez de0
border:0;
é tão válido quantoborder:none;
. Veja: stackoverflow.com/questions/2922909/…O @Oriol tem uma excelente resposta, infelizmente, a partir de outubro de 2017, também
display:contents
nãopage-break-after
é amplamente suportado, é melhor dizer que é sobre o Firefox que suporta isso, mas não os outros jogadores, eu criei o seguinte "hack", que considero melhor do que difícil codificação em uma pausa após cada terceiro elemento, porque isso tornará muito difícil tornar a página compatível com dispositivos móveis.Como foi dito, é um truque e a desvantagem é que você precisa adicionar muitos elementos extras por nada, mas ele funciona e funciona em vários navegadores, mesmo no IE11 datado.
O "hack" é simplesmente adicionar um elemento adicional após cada div, que é definido como
display:none
e, em seguida, usado o cssnth-child
para decidir qual deles deve ser realmente visível, forçando um freio de linha como este:fonte
.container>p
. Então todas essas<p></p>
tags não precisariam doclass
atributo. Não é importante, é claro. Apenas meu cérebro preguiçoso encontrando um pequeno ajuste na economia da sua solução inteligente. Obviamente, também depende do usuário não ter outras<p>
tags como filhos diretos da.container
div. Tecnicamente, você poderia fazer o mesmo com todas as outras<div>
crianças, mas é muito mais provável que você tenha outros<div>
s do.container
que você<p>
é, então provavelmente não é uma jogada inteligente para lá.Você quer uma quebra de linha semântica?
Então considere usar
<br>
. O W3Schools pode sugerir que vocêBR
é apenas para escrever poemas (o meu será lançado em breve), mas você pode alterar o estilo para que se comporte como um elemento de bloco de 100% de largura que levará o seu conteúdo para a próxima linha. Se 'br' sugere uma pausa, parece-me mais apropriado do que usarhr
ou 100%div
e torna o html mais legível.Insira o local
<br>
onde você precisa quebras de linha e estilize-o assim.Você pode desativar
<br>
com consultas de mídia , definindodisplay:
ablock
ounone
conforme o caso (eu incluí um exemplo disso, mas deixou-o comentado).Você também pode
order:
definir o pedido, se necessário.E você pode colocar quantas quiser, com diferentes classes ou nomes :-)
Não há necessidade de se limitar ao que o W3Schools diz:
fonte
<br class="2col">
após cada segundo item,<br class="3col">
após cada terceiro. Em seguida, aplique uma classecols-2
ao contêiner e crie css para ativar apenas as quebras de linha apropriadas para esse número de colunas. por exemplo.br { display: none; } .cols-2 br.2col { display: block; }
br
não é para elementos de quebra de linha , é para texto : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/…break-*
mostrado na resposta aceita), embora, infelizmente, ainda não chegue a vários navegadores , portanto, o segundo melhor é usar um elemento que preencha nativamente a largura dos pais e forneça os irmãos próximos a uma linha de si mesmos, o que novamente é dado na resposta aceita. Portanto, usar qualquer outro elemento que não seja um bloco como um seria pior, semanticamente, como obr
.Eu acho que a maneira tradicional é flexível e bastante fácil de entender:
Marcação
Crie o arquivo grid.css :
Eu criei um exemplo (jsfiddle)
Tente redimensionar a janela em 400px, é responsivo !!
fonte
Outra solução possível que não requer adição de nenhuma marcação extra é adicionar margem dinâmica para separar os elementos.
No caso do exemplo, isso pode ser feito com a ajuda de
calc()
, apenas adicionandomargin-left
emargin-right
ao elemento 3n + 2 (2, 5, 8)Exemplo de snippet
fonte
calc
conforme descrito nesta resposta.margin-right: 1px
do item, e fará com que o próximo item comece em uma nova linha.Para perguntas futuras, também é possível fazer isso usando a
float
propriedade e limpando-a em cada 3 elementos.Aqui está um exemplo que eu fiz.
fonte
display: flex;
, nãodisplay: inline-block;
.cell:nth-child(3n + 1)
vezTentei várias respostas aqui e nenhuma delas funcionou. Ironicamente, o que funcionou foi a alternativa mais simples a uma que
<br/>
se poderia tentar:<div style="flex-basis: 100%;"></div>
ou você também pode fazer:
<div style="width: 100%;"></div>
Coloque isso onde quiser uma nova linha. Parece funcionar mesmo com os adjacentes
<span>
, mas estou usando com os adjacentes<div>
.fonte
flex-basis
.você pode tentar agrupar os itens em um elemento dom como aqui. Com isso, você não precisa conhecer muitos CSS, apenas ter uma boa estrutura resolverá o problema.
fonte
display: block
e criar flexboxes para essas novas divisões de nível 2. Isso funciona para linhas. Substitua os divs por vãos ao usar o modo de coluna.