¿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
order
para moverlos a los lugares correctos.Mostrar fragmento de código
Pero hay una limitación: el contenedor flexible solo puede tener un
::before
y un::after
pseudo-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: contents
a 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-after
o 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-after
solución, que solo requeriría modificar un selector en la hoja de estilo.display: block;
a las.container
::before
y::after
pseudo 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;
.border
debe establecerse ennone
, en lugar de0
border: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-after
es 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:none
y luego usa el CSSnth-child
para 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 elclass
atributo. 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.container
div. 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.container
tu 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 queBR
es 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 usarhr
o un 100%div
y 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:
deblock
onone
en 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-2
al 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; }
br
no 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-left
ymargin-right
al elemento 3n + 2 (2, 5, 8)Ejemplo de fragmento
fuente
calc
como se describe en esta respuesta.margin-right: 1px
el artículo, y hará que el siguiente artículo comience en una nueva fila.Para futuras preguntas, también es posible hacerlo utilizando
float
propiedad 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: block
y hacer esos nuevos flexboxes divs de nivel 2. Esto funciona para filas. Reemplace los divs con vanos cuando use el modo columna.