Considere o seguinte 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>
e o seguinte CSS:
.x {
-moz-column-count: 3;
column-count: 3;
width: 30em;
}
No momento, o Firefox atualmente processa isso da mesma forma que o seguinte:
• Number one • Number three bit longer
• Number two • Number four is a • Number five
Observe que o quarto item foi dividido entre a segunda e a terceira coluna. Como evito isso?
A renderização desejada pode parecer algo como:
• Number one • Number four is a
• Number two bit longer
• Number three • Number five
ou
• Number one • Number three • Number five
• Number two • Number four is a
bit longer
Editar: a largura é especificada apenas para demonstrar a renderização indesejada. No caso real, é claro que não há largura fixa.
html
css
css-multicolumn-layout
Timwi
fonte
fonte
Respostas:
A maneira correta de fazer isso é com a propriedade CSS invasora :
Infelizmente, a partir de outubro de 2019, isso não é suportado no Firefox, mas é suportado por todos os outros principais navegadores . Com o Chrome, eu pude usar o código acima, mas não consegui fazer nada funcionar no Firefox ( consulte Bug 549114 ).
A solução alternativa que você pode fazer para o Firefox, se necessário, é agrupar seu conteúdo ininterrupto em uma tabela, mas essa é uma solução realmente terrível se você puder evitá-lo.
ATUALIZAR
De acordo com o relatório de bug mencionado acima, o Firefox 20+ suporta
page-break-inside: avoid
como um mecanismo para evitar quebras de coluna dentro de um elemento, mas o trecho de código abaixo demonstra que ele ainda não está funcionando com listas:Mostrar snippet de código
Como outros mencionar, você pode fazer
overflow: hidden
oudisplay: inline-block
mas isso remove as balas mostrados na pergunta original. Sua solução variará de acordo com quais são seus objetivos.ATUALIZAÇÃO 2 Como o Firefox impede a interrupção
display:table
edisplay:inline-block
uma solução confiável, mas semântica, seria agrupar cada item da lista em sua própria lista e aplicar a regra de estilo:fonte
break-inside: avoid-column
page-break-inside:avoid
deve funcionar em FF 20.-webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
overflow: hidden
é a melhor opção.display: inline-block;
causa novas peculiaridades com o Chrome, infelizmente.Adicionando;
para os elementos filhos impedirá que eles sejam divididos entre colunas.
fonte
display:block
elemento. Provavelmente será uma solução alternativa sólida para o Firefox por enquanto.<li>
mas tive que adicionarwidth:100%;
para impedir que eles sejam empilhados horizontalmente.defina a seguir o estilo do elemento que você não deseja quebrar:
fonte
overflow:hidden
regra não é uma solução para as outras regras, que é o que faz com que o layout não separável ...Em outubro de 2014, a invasão ainda parece estar com problemas no Firefox e no IE 10-11. No entanto, a adição de overflow: hidden ao elemento, juntamente com o break-inside: evitar, parece fazê-lo funcionar no Firefox e IE 10-11. Atualmente, estou usando:
fonte
O Firefox agora suporta isso:
Isso resolve o problema de elementos quebrando nas colunas.
fonte
page-break-before:
oupage-break-after:
, mas nãopage-break-inside:
A resposta aceita agora tem dois anos e as coisas parecem ter mudado.
Este artigo explica o uso da
column-break-inside
propriedade Não sei dizer como ou por que isso diferebreak-inside
, porque apenas o último parece estar documentado na especificação W3. No entanto, o Chrome e o Firefox suportam o seguinte:fonte
Isso funciona para mim em 2015:
fonte
ul
elementos, é publicado de truques CSS: css-tricks.com/almanac/properties/b/break-inside , e parece correta com base em notas de compatibilidade caniuse: "O apoio parcial refere-se a não apoiar obreak-before
,break-after
,break-inside
propriedades Os navegadores WebKit e Blink têm suporte equivalente para as-webkit-column-break-*
propriedades não padrão para obter o mesmo resultado (mas apenas os valoresauto
ealways
). O Firefox não suporta,break-*
mas suporta aspage-break-*
propriedades para obter o mesmo resultado. "O código a seguir funciona para impedir quebras de coluna dentro de elementos:
fonte
Em 2019, ter isso funciona para mim no Chrome, Firefox e Opera (depois de muitas outras tentativas malsucedidas):
fonte
O Firefox 26 parece exigir
E o Chrome 32 precisa
fonte
Eu tive o mesmo problema que eu acho e encontrei uma solução nisso:
Trabalhando também no FF 38.0.5: http://jsfiddle.net/rkzj8qnv/
fonte
Uma possível solução alternativa para o Firefox é definir a propriedade CSS "display" do elemento que você não deseja interromper como "table". Não sei se funciona para a tag LI (você provavelmente perderá a lista-item-style), mas funciona para a tag P.
fonte
Eu apenas consertei alguns
div
s que estavam se dividindo na próxima coluna adicionandopara a criança
div
s.* Percebi que só o corrige no Firefox!
fonte
Eu enfrentei o mesmo problema ao usar colunas de cartão
eu consertei usando
fonte
funciona perfeitamente
fonte
Eu fiz uma atualização da resposta real.
Isso parece estar funcionando no firefox e no chrome: http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result/
Nota: A propriedade float parece ser a responsável pelo comportamento do bloco.
fonte
Essa resposta pode se aplicar apenas a determinadas circunstâncias; Se você definir uma altura para seus elementos, isso será obedecido pelo estilo da coluna. Mantendo tudo o que está contido nessa altura em uma linha.
Eu tinha uma lista, como o op, mas continha dois elementos, itens e botões para atuar sobre esses itens. Tratei-o como uma tabela
<ul> - table
,<li> - table-row
,<div> - table-cell
colocar o UL em um layout 4 coluna. Às vezes, as colunas eram divididas entre o item e seus botões. O truque que usei foi dar aos elementos Div uma altura de linha para cobrir os botões.fonte