Digamos que eu tenho esse HTML:
<h3>Features</h3>
<ul>
<li><img src="alphaball.png">Smells Good</li>
<li><img src="alphaball.png">Tastes Great</li>
<li><img src="alphaball.png">Delicious</li>
<li><img src="alphaball.png">Wholesome</li>
<li><img src="alphaball.png">Eats Children</li>
<li><img src="alphaball.png">Yo' Mama</li>
</ul>
e este CSS:
li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }
O resultado pode ser visto aqui: http://jsfiddle.net/YMN7U/1/
Agora imagine que eu quero dividir isso em três colunas, o equivalente a injetar um <br>
após o terceiro <li>
. (Na verdade, fazer isso seria semanticamente e sintaticamente inválido.)
Eu sei como selecionar o terceiro <li>
no CSS, mas como forçar uma quebra de linha depois dele? Isso não funciona:
li:nth-child(4):after { content:"xxx"; display:block }
Também sei que esse caso em particular é possível usando em float
vez de inline-block
, mas não estou interessado em soluções usando float
. Eu também sei que com blocos de largura fixa isso é possível definindo a largura no pai ul
como cerca de 3x essa largura; Não estou interessado nesta solução. Também sei que poderia usar display:table-cell
se quisesse colunas reais; Não estou interessado nesta solução. Estou interessado na possibilidade de forçar uma quebra no conteúdo embutido.
Edit : Para ser claro, estou interessado em 'teoria', não a solução para um problema específico. O CSS pode injetar uma quebra de linha no meio dos display:inline(-block)?
elementos ou é impossível? Se você tem certeza de que é impossível, essa é uma resposta aceitável.
Respostas:
Consegui fazê-lo funcionar em elementos LI embutidos. Infelizmente, ele não funciona se os elementos LI forem inline-block:
Demonstração ao vivo: http://jsfiddle.net/dWkdp/
Ou a versão do penhasco:
fonte
:after
sempre imprime como texto direto.\A
é o caractere de alimentação de linha ... é uma fugaVocê não está interessado em muitas "soluções" para o seu problema. Eu não acho que realmente exista uma boa maneira de fazer o que você quer fazer. Qualquer coisa que você insira usando
:after
econtent
tenha exatamente a mesma validade sintática e semântica que teria feito se você tivesse escrito nela mesmo.As ferramentas CSS fornecem trabalho. Você deve apenas flutuar os
li
eclear: left
quando quiser iniciar uma nova linha, como você mencionou:Veja um exemplo: http://jsfiddle.net/marcuswhybrow/YMN7U/5/
fonte
:after
será sintaticamente válido ou uma boa idéia, pois já existem ferramentas para isso. Daí a resposta.float: center
.Quando a reescrita do html é permitida, você pode aninhar
<ul>
s dentro do<ul>
e apenas permitir que o interior seja<li>
exibido como bloco embutido. Isso também semanticamente faria sentido no IMHO, pois o agrupamento também é refletido no html.Demo
fonte
Uma maneira fácil de dividir listas em linhas é flutuando os itens de lista individuais e, no item que você deseja ir para a próxima linha, você pode limpar o flutuador.
por exemplo
fonte
float
configuração substitui ainline-block
configuração. Eles realmente não coexistemEu sei que você não queria usar carros alegóricos e a pergunta era apenas teoria, mas caso alguém ache isso útil, aqui está uma solução usando carros alegóricos.
Adicione uma classe de esquerda aos seus
li
elementos que você deseja flutuar:e altere seu CSS da seguinte maneira:
http://jsfiddle.net/chut319/xJ3pe/
Você não precisa especificar larguras ou blocos embutidos e funciona desde o IE6.
fonte
Consegui isso criando um seletor :: before para o primeiro elemento embutido na linha e transformando esse seletor em um bloco com uma margem superior ou inferior para separar um pouco as linhas.
fonte
Observe que isso funcionará, dependendo de como você renderiza a página. Mas que tal começar uma nova lista não ordenada?
ie
fonte
Uma solução melhor é usar -webkit-columns: 2;
http://jsfiddle.net/YMN7U/889/
fonte
Talvez seja completamente possível apenas com CSS, mas prefiro evitar "flutuar" o máximo possível, pois isso interfere na altura dos pais.
Se você estiver usando o jQuery, poderá criar um plugin `wrapN` simples que seja semelhante ao` wrapAll`, exceto que apenas envolve os elementos "N" e depois quebra e envolve os próximos elementos "N" usando um loop. Em seguida, defina sua classe de wrappers para `display: block;`.
Aqui está um JSFiddle do produto final:
http://jsfiddle.net/dustinpoissant/L79ahLoz/
fonte