Eu tenho um DIV de largura de fluido.
Dentro deste eu tenho 4 DIVs todos os 300px x 250px ...
<div id="container">
<div class="box1"> </div>
<div class="box2"> </div>
<div class="box3"> </div>
<div class="box4"> </div>
</div>
O que eu quero que aconteça é a caixa 1 ser lançada à esquerda, a caixa 4 ser lançada à direita e as caixas 2 e 3 espaçadas igualmente entre elas. Quero que o espaçamento seja fluido também, para que o navegador fique menor, o espaço também fique menor.
html
css
fluid-layout
Lee Price
fonte
fonte
display:inline-block;
vez de flutuar?inline-block
eminline
elementosRespostas:
Veja: http://jsfiddle.net/thirtydot/EDp8R/
text-align: justify
combinado com o.stretch
que está lidando com o posicionamento.display:inline-block; *display:inline; zoom:1
correçõesinline-block
para o IE6 / 7, veja aqui .font-size: 0; line-height: 0
corrige um pequeno problema no IE6.O extra
span
(.stretch
) pode ser substituído por:after
.Isso ainda funciona nos mesmos navegadores que a solução acima.
:after
não funciona no IE6 / 7, mas eles estão usando dedistribute-all-lines
qualquer maneira, por isso não importa.Veja: http://jsfiddle.net/thirtydot/EDp8R/3/
Há uma pequena desvantagem
:after
: para que a última linha funcione perfeitamente no Safari, você deve ter cuidado com o espaço em branco no HTML.Especificamente, isso não funciona:
E isso faz:
Você pode usar isso para qualquer número arbitrário de filhos
div
sem adicionar umaboxN
classe a cada um, alterandopara
Isso seleciona qualquer div que seja o primeiro filho da
#container
div e nenhuma outra abaixo dela. Para generalizar as cores de segundo plano, você pode usar o seletor de ordem n de CSS3 , embora ele seja suportado apenas no IE9 + e em outros navegadores modernos:torna-se:
Veja aqui um exemplo do jsfiddle.
fonte
<div/><div/><div/>
ele não funcionará. Você precisa ter<div/> <div/> <div/>
.justify
para esse caso, mas obrigado por fornecer uma solução funcional. poupou-me muitos experimentos (apesar da depuração de 3h: D). Além disso, eu poderia acrescentar uma nota que se você quiser a sua última linha a ser alinhado à esquerda, você deve adicionar algumas caixas invisíveis extras (para completar a linha).stretch
/:after
é necessário porque (normalmente) com texto justificado, a última linha não é justificada . Aqui, queremos que a última linha seja justificada, daí a necessidade:after
. Quanto à sua segunda pergunta, explorei isso há algum tempo em uma resposta anterior . Nessa resposta, era necessário JavaScript. Se você precisa oferecer suporte a navegadores mais antigos (IE8), acredito que precisa de JavaScript.A maneira mais fácil de fazer isso agora é com um flexbox:
http://css-tricks.com/snippets/css/a-guide-to-flexbox/
O CSS é simplesmente:
demo: http://jsfiddle.net/QPrk3/
No entanto , atualmente isso é suportado apenas por navegadores relativamente recentes ( http://caniuse.com/flexbox ). Além disso, as especificações para o layout do flexbox foram alteradas algumas vezes, portanto, é possível cobrir mais navegadores incluindo uma sintaxe mais antiga:
http://css-tricks.com/old-flexbox-and-new-flexbox/
http://css-tricks.com/using-flexbox/
fonte
Se css3 for uma opção, isso pode ser feito usando a
calc()
função css .Caso 1: justificando caixas em uma única linha ( FIDDLE )
A marcação é simples - um monte de divs com algum elemento container.
CSS fica assim:
onde -1px para corrigir um erro de calc / arredondamento do IE9 + - veja aqui
Caso 2: justificando caixas em várias linhas ( FIDDLE )
Aqui, além da
calc()
função,media queries
são necessários.A idéia básica é configurar uma consulta de mídia para cada #columns estados, onde então uso calc () para calcular a margem direita de cada um dos elementos (exceto os da última coluna).
Parece muito trabalho, mas se você estiver usando LESS ou SASS, isso pode ser feito facilmente
(Ainda pode ser feito com css regular, mas você terá que fazer todos os cálculos manualmente e, se alterar a largura da caixa - precisará resolver tudo novamente)
Abaixo está um exemplo usando LESS: (Você pode copiar / colar este código aqui para brincar com ele, [é também o código que eu usei para gerar o violino mencionado acima])
Então, basicamente, você primeiro precisa decidir a largura da caixa e a margem mínima que deseja entre as caixas.
Com isso, você pode descobrir quanto espaço precisa para cada estado.
Em seguida, use calc () para calcular a margem direita e enésimo filho para remover a margem direita das caixas na coluna final.
A vantagem desta resposta sobre a resposta aceita
text-align:justify
é que, quando você tem mais de uma linha de caixas - as caixas na linha final não são "justificadas", por exemplo: Se houver duas caixas na linha final - I não queira que a primeira caixa fique à esquerda e a próxima à direita - mas que as caixas se sigam em ordem.Sobre o suporte ao navegador : Isso funcionará no IE9 +, Firefox, Chrome, Safari6.0 + - (veja aqui para mais detalhes)
No entanto, notei que no IE9 + há um pouco de falha entre os estados de consulta de mídia. [se alguém souber como consertar isso, eu realmente gostaria de saber :)]<- CORRIGIDO AQUIfonte
Outras postagens mencionaram flexbox , mas se mais de uma linha de itens for necessária , a
space-between
propriedade da flexbox falhará (consulte o final da postagem)Até o momento, a única solução limpa para isso é com o
Módulo de layout de grade CSS ( demo do Codepen )
Basicamente, o código relevante necessário se resume a isso:
1) Faça do elemento container um container grid
2) Defina a grade com uma quantidade 'automática' de colunas - conforme necessário. Isso é feito para layouts responsivos. A largura de cada coluna será 120 px. (Observe o uso de
auto-fit
(como oposto aauto-fill
) que (para um layout de 1 linha) reduz as faixas vazias para 0 - permitindo que os itens se expandam para ocupar o espaço restante. (Confira esta demonstração para ver do que estou falando) )).3) Defina as lacunas / calhas para as linhas e colunas da grade - aqui, como deseja um layout de 'espaço entre elas' - a lacuna será realmente uma lacuna mínima, pois aumentará conforme necessário.
4) e 5) - Similar ao flexbox.
Demonstração Codepen (Redimensione para ver o efeito)
Suporte do navegador - Caniuse
Atualmente suportado pelo Chrome (Blink), Firefox, Safari e Edge! ... com suporte parcial do IE (veja este post de Rachel Andrew)
NB:
A
space-between
propriedade do Flexbox funciona muito bem para uma linha de itens, mas quando aplicada a um contêiner flexível que envolve seus itens - (comflex-wrap: wrap
) - falha, porque você não tem controle sobre o alinhamento da última linha de itens; a última linha sempre será justificada (geralmente não é o que você deseja)Para demonstrar:
Mostrar snippet de código
Codepen (redimensione para ver do que estou falando)
Leitura adicional em grades CSS:
fonte
Isso funcionou para mim com 5 imagens em tamanhos diferentes.
Isso funciona por causa do justify-content: space-between, e está em uma lista, exibido horizontalmente.
Em CSS
Em html
fonte
em
jQuery
que você pode direcionar o Pai diretamente.Isso permitirá que
parent
cresça horizontalmente à medida quechildren
são adicionados.NOTA: Isso pressupõe que o
'.children'
têmwidth
eHeight
SetEspero que ajude.
fonte
Se você souber o número de elementos por "linha" e a largura do contêiner, poderá usar um seletor para adicionar uma margem aos elementos necessários para causar uma aparência justificada.
Eu tinha linhas de três divs que eu queria justificadas, então usei o:
.tile:nth-child(3n+2) { margin: 0 10px }
isso permite que a div central em cada linha tenha uma margem que força a primeira e a terceira div às bordas externas do contêiner
Também é bom para outras coisas, como bordas de cores de fundo etc.
fonte