¿Cómo evitar el salto de columna dentro de un elemento?
Considere el siguiente HTML:
<div class='x'>
<ul>
<li>Number one</li>
<li>Number two</li>
<li>Number three</li>
<li>Number four is a bit longer</li>
<li>Number five</li>
</ul>
</div>
Y el siguiente CSS:
.x {
-moz-column-count: 3;
column-count: 3;
width: 30em;
}
Tal como está, Firefox actualmente hace esto de manera similar a lo siguiente:
• Number one • Number three bit longer
• Number two • Number four is a • Number five
Observe que el cuarto elemento se dividió entre la segunda y la tercera columna. ¿Cómo prevengo eso?
El renderizado deseado podría parecerse más a:
• Number one • Number four is a
• Number two bit longer
• Number three • Number five
O
• Number one • Number three • Number five
• Number two • Number four is a
bit longer
Edit: El ancho solo se especifica para demostrar el renderizado no deseado. En el caso real, de por supuesto no hay ancho fijo.
16 answers
La forma correcta de hacer esto es con la propiedad CSS break-inside :
.x li {
break-inside: avoid-column;
}
Desafortunadamente, ningún navegador actualmente admite esto. Con Chrome, pude usar lo siguiente, pero no pude hacer que nada funcionara para Firefox ( Ver Bug 549114):
.x li {
-webkit-column-break-inside: avoid;
}
La solución que puede hacer para Firefox si es necesario es envolver su contenido que no se rompe en una tabla, pero esa es una solución realmente, realmente terrible si se puede evitar se.
UPDATE
De acuerdo con el informe de error mencionado anteriormente, Firefox 20 + soporta page-break-inside: avoid
como un mecanismo para evitar saltos de columna dentro de un elemento, pero el siguiente fragmento de código demuestra que todavía no funciona con listas:
.x {
-moz-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
width: 30em;
}
.x ul {
margin: 0;
}
.x li {
-webkit-column-break-inside: avoid;
-moz-column-break-inside:avoid;
-moz-page-break-inside:avoid;
page-break-inside: avoid;
break-inside: avoid-column;
}
<div class='x'>
<ul>
<li>Number one, one, one, one, one</li>
<li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>
<li>Number three</li>
</ul>
</div>
Como otros mencionan, puedes hacer overflow: hidden
o display: inline-block
pero esto elimina las viñetas mostradas en la pregunta original. Su solución variará en función de cuáles sean sus objetivos.
ACTUALIZACIÓN 2 Dado que Firefox evita romper en display:table
y display:inline-block
una solución confiable pero no semántica sería envolver cada elemento de la lista en su propia lista y aplicar la regla de estilo allí:
.x {
-moz-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
width: 30em;
}
.x ul {
margin: 0;
-webkit-column-break-inside: avoid; /* Chrome, Safari */
page-break-inside: avoid; /* Theoretically FF 20+ */
break-inside: avoid-column; /* IE 11 */
display:table; /* Actually FF 20+ */
}
<div class='x'>
<ul>
<li>Number one, one, one, one, one</li>
</ul>
<ul>
<li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>
</ul>
<ul>
<li>Number three</li>
</ul>
</div>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-06 18:25:10
Añadiendo;
display: inline-block;
A los elementos secundarios evitará que se dividan entre columnas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-09 13:07:38
Establezca lo siguiente en el estilo del elemento que no desea romper:
overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-02 00:13:59
A partir de octubre de 2014, break-inside todavía parece tener errores en Firefox e IE 10-11. Sin embargo, agregar overflow: hidden al elemento, junto con el break-inside: avoid, parece hacer que funcione en Firefox e IE 10-11. Actualmente estoy usando:
overflow: hidden; /* Fix for firefox and IE 10-11 */
-webkit-column-break-inside: avoid; /* Chrome, Safari, Opera */
page-break-inside: avoid; /* Firefox */
break-inside: avoid; /* IE 10+ */
break-inside: avoid-column;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 12:59:23
Firefox ahora soporta esto:
page-break-inside: avoid;
Esto resuelve el problema de los elementos que se rompen a través de columnas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-29 11:00:30
La respuesta aceptada tiene ahora dos años y las cosas parecen haber cambiado.
Este artículo explica el uso de la propiedad column-break-inside
. No puedo decir cómo o por qué esto difiere de break-inside
, porque solo este último parece estar documentado en la especificación W3. Sin embargo, Chrome y Firefox soportan lo siguiente:
li {
-webkit-column-break-inside:avoid;
-moz-column-break-inside:avoid;
column-break-inside:avoid;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-06 21:53:25
Esto funciona para mí en 2015 :
li {
-webkit-column-break-inside: avoid;
/* Chrome, Safari, Opera */
page-break-inside: avoid;
/* Firefox */
break-inside: avoid;
/* IE 10+ */
}
.x {
-moz-column-count: 3;
column-count: 3;
width: 30em;
}
<div class='x'>
<ul>
<li>Number one</li>
<li>Number two</li>
<li>Number three</li>
<li>Number four is a bit longer</li>
<li>Number five</li>
</ul>
</div>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-21 11:12:47
Firefox 26 parece requerir
page-break-inside: avoid;
Y Chrome 32 necesita
-webkit-column-break-inside:avoid;
-moz-column-break-inside:avoid;
column-break-inside:avoid;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-13 15:14:29
Tuve el mismo problema que creo y encontré una solución en esto:
-webkit-column-fill: auto; /* Chrome, Safari, Opera */
-moz-column-fill: auto; /* Firefox */
column-fill: auto;
Trabajando también en FF 38.0.5: http://jsfiddle.net/rkzj8qnv/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-01 14:14:11
El siguiente código funciona para evitar saltos de columna dentro de los elementos:
-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 16:12:14
Una posible solución para Firefox es establecer la propiedad CSS "display" del elemento que no desea tener un descanso dentro de "table". No se si funciona para la etiqueta LI (probablemente perderás el estilo list-item), pero funciona para la etiqueta P.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-10 18:05:22
Acabo de arreglar algunos div
s que se dividían en la siguiente columna agregando
overflow: auto
Al niño div
s.
* Se dio cuenta de que solo lo arregla en Firefox!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 14:52:04
Me enfrenté al mismo problema mientras usaba card-columns
Lo arreglé usando
display: inline-flex ;
column-break-inside: avoid;
width:100%;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-07 09:50:21
Hice una actualización de la respuesta real.
Esto parece estar funcionando en firefox y chrome: http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result /
.x{
columns: 5em;
-webkit-columns: 5em; /* Safari and Chrome */
-moz-columns: 5em; /* Firefox */
}
.x li{
float:left;
break-inside: avoid-column;
-webkit-column-break-inside: avoid; /* Safari and Chrome */
}
Nota: La propiedad float parece ser la que hace el comportamiento de bloque.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-23 12:26:30
Esta respuesta solo puede aplicarse a ciertas circunstancias; Si establece una altura para sus elementos, esto será obedecido por el estilo de columna. Allí, manteniendo todo lo que está contenido dentro de esa altura en una fila.
Tenía una lista, como el op, pero contenía dos elementos, elementos y botones para actuar sobre esos elementos. Lo traté como a una mesa.<ul> - table
, <li> - table-row
, <div> - table-cell
coloque la UL en un diseño de 4 columnas. Las columnas a veces se dividían entre el elemento y sus botones. El truco que usé era dar a los elementos Div una altura de línea para cubrir los botones.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-23 08:05:46
<style>
ul li{display: table;}
</style>
Funciona perfectamente
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 13:05:28