¿Hay alguna manera de hacer un salto de línea en flexbox de varias líneas?
Por ejemplo, para romper después de cada 3er elemento en este 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>
Me gusta
.item:nth-child(3n){
/* line-break: after; */
}

Respuestas:
La solución más simple y confiable es insertar elementos flexibles en los lugares correctos. Si son lo suficientemente anchos (
width: 100%), forzarán un salto de línea.Mostrar fragmento de código
Pero eso es feo y no semántico. En cambio, podríamos generar pseudoelementos dentro del contenedor flexible y usarlos
orderpara moverlos a los lugares correctos.Mostrar fragmento de código
Pero hay una limitación: el contenedor flexible solo puede tener un
::beforey un::afterpseudo-elemento. Eso significa que solo puedes forzar 2 saltos de línea.Para resolver eso, puede generar los pseudoelementos dentro de los elementos flexibles en lugar de en el contenedor flexible. De esta forma, no estará limitado a 2. Pero esos pseudoelementos no serán elementos flexibles, por lo que no podrán forzar saltos de línea.
Pero afortunadamente, se introdujo CSS Display L3
display: contents(actualmente solo es compatible con Firefox 37):Por lo tanto, puede aplicar
display: contentsa los hijos del contenedor flexible y envolver el contenido de cada uno dentro de un contenedor adicional. Entonces, los elementos flexibles serán esos envoltorios adicionales y los pseudo-elementos de los niños.Mostrar fragmento de código
Alternativamente, de acuerdo con Fragmenting Flex Layout y CSS Fragmentation , Flexbox permite interrupciones forzadas mediante el uso de
break-before,break-aftero sus alias CSS 2.1:Mostrar fragmento de código
Los saltos de línea forzados en flexbox aún no son ampliamente compatibles, pero funciona en Firefox.
fuente
break-aftersolución, que solo requeriría modificar un selector en la hoja de estilo.display: block;a las.container::beforey::afterpseudo clases para hacer que la solución número dos funcione en IE. YMMV!Desde mi perspectiva, es más semántico usar
<hr>elementos como saltos de línea entre elementos flexibles.Probado en Chrome 66, Firefox 60 y Safari 11.
fuente
gap: 10px;la distancia entre filas es en realidad20px. Para la dirección, especifique un hueco fila de la mitad de ese tamaño:gap: 5px 10px;.borderdebe establecerse ennone, en lugar de0border:0;es tan válido comoborder:none;. Ver: stackoverflow.com/questions/2922909/…@Oriol tiene una excelente respuesta, lamentablemente a partir de octubre de 2017, ninguno
display:contents, ningunopage-break-afteres ampliamente compatible, mejor dicho, se trata de Firefox que admite esto, pero no de los otros jugadores, se me ocurrió el siguiente "truco" que considero mejor que difícil codificar en un descanso después de cada tercer elemento, porque eso hará que sea muy difícil hacer que la página sea amigable para dispositivos móviles.Como se dijo, es un truco y el inconveniente es que debe agregar una gran cantidad de elementos adicionales para nada, pero funciona y funciona en varios navegadores incluso en el IE11 con fecha.
El "truco" es simplemente agregar un elemento adicional después de cada div, que se establece en
display:noney luego usa el CSSnth-childpara decidir cuál de estos debe hacerse visible forzando un freno de línea como este:fuente
.container>p. Entonces todas esas<p></p>etiquetas no necesitarían elclassatributo. No es importante, por supuesto. Solo mi cerebro perezoso encuentra un pequeño y ahorrador espacio para su solución inteligente. Por supuesto, también se basa en que el usuario no tenga otras<p>etiquetas como hijos directos del.containerdiv. Técnicamente, podrías hacer lo mismo con todos los demás<div>niños, pero es mucho más probable que tengas otros<div>s en.containertu vida<p>, así que probablemente no sea un movimiento inteligente allí.¿Quieres un salto de línea semántico?
Entonces considere usar
<br>. W3Schools puede sugerirle queBRes solo para escribir poemas (el mío vendrá pronto) pero puede cambiar el estilo para que se comporte como un elemento de bloque de 100% de ancho que empujará su contenido a la siguiente línea. Si 'br' sugiere un descanso, entonces me parece más apropiado que usarhro un 100%divy hace que el html sea más legible.Inserte el lugar
<br>donde necesita los saltos de línea y asígnele un estilo como este.Se puede desactivar
<br>con preguntas de los medios , mediante el establecimientodisplay:deblockononeen su caso (he incluido un ejemplo de esto, pero lo dejó comentada).Puedes usar
order:para establecer el orden si es necesario también.Y puedes poner tantos como quieras, con diferentes clases o nombres :-)
No es necesario limitarse a lo que dice W3Schools:
fuente
<br class="2col">después de cada segundo elemento,<br class="3col">después de cada tercero. Luego aplique una clasecols-2al contenedor y cree css para habilitar solo los saltos de línea apropiados para ese número de columnas. p.ej.br { display: none; } .cols-2 br.2col { display: block; }brno es para elementos de salto de línea , es para texto : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/…break-*muestra en la respuesta aceptada) aunque desafortunadamente aún no ha llegado a los navegadores cruzados , por lo que la segunda mejor opción es utilizar un elemento que llene de forma nativa el ancho de su elemento primario y empuje a los siguientes hermanos a una fila de sí mismos, que nuevamente se da en la respuesta aceptada. Por lo tanto, usar cualquier otro elemento que no sea un bloque como uno sería peor, semánticamente, como elbr.Creo que la forma tradicional es flexible y bastante fácil de entender:
Margen
Crear archivo grid.css :
He creado un ejemplo (jsfiddle)
Intenta cambiar el tamaño de la ventana por debajo de 400 px, ¡responde!
fuente
Otra posible solución que no requiere agregar ningún marcado adicional es agregar un margen dinámico para separar los elementos.
En el caso del ejemplo, esto se puede hacer con la ayuda de
calc(), simplemente agregandomargin-leftymargin-rightal elemento 3n + 2 (2, 5, 8)Ejemplo de fragmento
fuente
calccomo se describe en esta respuesta.margin-right: 1pxel artículo, y hará que el siguiente artículo comience en una nueva fila.Para futuras preguntas, también es posible hacerlo utilizando
floatpropiedad y borrándola en cada 3 elementos.Aquí hay un ejemplo que hice.
fuente
display: flex;nodisplay: inline-block;.cell:nth-child(3n + 1)lugarIntenté varias respuestas aquí, y ninguna de ellas funcionó. Irónicamente, lo que funcionó fue la alternativa más simple a la que
<br/>uno podría intentar:<div style="flex-basis: 100%;"></div>o también podrías hacer:
<div style="width: 100%;"></div>Coloca eso donde quieras una nueva línea. Parece funcionar incluso con los adyacentes
<span>, pero lo estoy usando con los adyacentes<div>.fuente
flex-basis.podría intentar envolver los elementos en un elemento dom como aquí. con esto no tienes que saber mucho css, solo tener una buena estructura resolverá el problema.
fuente
display: blocky hacer esos nuevos flexboxes divs de nivel 2. Esto funciona para filas. Reemplace los divs con vanos cuando use el modo columna.