Eu tenho um layout simples de caixa flexível com um contêiner como:
.grid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
Agora, quero que os itens na última linha estejam alinhados com os outros. justify-content: space-between;
deve ser usado porque a largura e a altura da grade podem ser ajustadas.
Atualmente parece
Aqui, quero que o item no canto inferior direito esteja na "coluna do meio". Qual é a maneira mais simples de conseguir isso? Aqui está um pequeno jsfiddle que mostra esse comportamento.
.exposegrid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.exposetab {
width: 100px;
height: 66px;
background-color: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(0, 0, 0, 0.4);
border-radius: 5px;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
margin-bottom: 10px;
}
<div class="exposegrid">
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
</div>
css
flexbox
grid-layout
Thorben Croisé
fonte
fonte
Respostas:
Adicione um
::after
que preencha automaticamente o espaço. Não há necessidade de poluir seu HTML. Aqui está um codepen mostrando: http://codepen.io/DanAndreasson/pen/ZQXLXjfonte
justify-content: space-between;
a partir.grid
e removido.grid:after
e ele funciona da mesma. Agora, se você tentou algo assim, ele quebra totalmente. Observe que as larguras para cada conjunto de 4 não somam 100%. No violino do OP, as larguras são definidas em px, para que sua solução não funcione nessa situação.space-between
. No entanto, quando eu definir aflex-basis
de.grid:after
que o mesmo dimensionamento como os outros itens na grade (por ponto de interrupção, substituindo o código do módulo padrão / base acima), a última linha propagação corretamente. Parece funcionar no Safari, iOS, Firefox, Chrome (preciso testar o IE) e meu maior tamanho de linha é 3 na minha implementação inicial.{ content: "";flex: 0 0 32%;max-width: 480px;}
e alterei a largura máxima com as alterações de consulta de mídia para que a grade fosse perfeita em todas as larguras.Uma técnica seria inserir um número de elementos extras (o número máximo de elementos que você espera ter em uma linha) que recebem altura zero. O espaço ainda está dividido, mas as linhas supérfluas entram em colapso:
http://codepen.io/dalgard/pen/Dbnus
No futuro, isso pode ser possível através do uso de múltiplos
::after(n)
.fonte
Como outros pôsteres mencionaram - não há uma maneira limpa de alinhar à esquerda a última linha com o flexbox (pelo menos conforme as especificações atuais)
No entanto, para o que vale a pena: Com o CSS Grid Layout Module, é surpreendentemente fácil de produzir:
Basicamente, o código relevante se resume a isso:
1) Faça do elemento container um container grid
2) Defina a grade com colunas automáticas de largura 100px. (Observe o uso do preenchimento automático (ao contrário de
auto-fit
- que (para um layout de 1 linha) reduz as faixas vazias para 0 - fazendo com que os itens se expandam ocupem o espaço restante. Isso resultaria em um justificado espaço entre 'layout quando a grade tem apenas uma linha que, no nosso caso, não é o que queremos. (confira esta demonstração para ver a diferença entre elas).3) Defina espaços / calhas para as linhas e colunas da grade - aqui, como deseja um layout de 'espaço entre' - o espaço será realmente um espaço mínimo, pois aumentará conforme necessário.
4) Semelhante ao flexbox.
Mostrar snippet de código
Codepen Demo (Redimensione para ver o efeito)
fonte
auto-fit
, houve um bug no Chrome 57-60 (e navegadores baseados em seu mecanismo, como o Samsung Internet 6.0) porque a especificação era um pouco ambígua na época. Agora, as especificações foram esclarecidas e as novas versões do Chrome renderizadasauto-fit
corretamente, mas os navegadores com mecanismo antigo ainda estão em uso, portanto, tenha cuidado com esse valor.:after
pseudo-elemento pode levar a resultados indesejados em casos extremos.Sem nenhuma marcação extra, apenas adicionar
::after
funcionou para mim especificando a largura da coluna.Com o HTML assim:
fonte
flex-basis: 10em
vez de largura.Você não pode. O Flexbox não é um sistema de grade. Ele não possui construções de linguagem para fazer o que você está pedindo, pelo menos não se você estiver usando
justify-content: space-between
. O mais próximo que você pode chegar do Flexbox é usar a orientação da coluna, que requer a definição de uma altura explícita:http://cssdeck.com/labs/pvsn6t4z (observação: prefixos não incluídos)
No entanto, seria mais simples usar apenas colunas, que oferecem melhor suporte e não exigem a definição de uma altura específica:
http://cssdeck.com/labs/dwq3x6vr (observação: prefixos não incluídos)
fonte
Uma solução possível é usar
justify-content: flex-start;
no.grid
contêiner, restrições de tamanho em seus filhos e margens nas devidas elementos filhos - dependendo do número desejado de colunas.Para uma grade de 3 colunas, o CSS básico seria assim:
É outra solução imperfeita, mas funciona.
http://codepen.io/tuxsudo/pen/VYERQJ
fonte
Eu sei que há muitas respostas aqui, mas ... A maneira mais simples de fazer isso é com um em
grid
vez deflex
egrid template columns
comrepeat
eauto fills
, onde você deve definir o número de pixels que você atribuiu a cada elemento, a100px
partir do seu código de trecho.fonte
Sim.! Podemos, mas com algumas consultas de mídia, o número máximo de colunas é predefinido .
Aqui estou usando 4 colunas. Verifique meu código:
NOTA
1) Não há necessidade de criar div filho. Pode ser qualquer outra tag, como 'img' r, o que você quiser.
2) Se você quiser mais colunas, ajuste as consultas de mídia e o número máximo de colunas.
fonte
Se você deseja uma grade com algum espaço entre os itens e os itens iniciados sem nenhum espaço inicial, esta solução simples funciona:
Se você deseja o espaço inicial de 5 px, remova a margem negativa :) Simples.
https://jsfiddle.net/b97ewrno/2/
A resposta aceita, embora boa, faz com que não haja espaço entre os elementos na segunda linha.
fonte
Se você deseja alinhar o último item à grade, use o seguinte código:
Recipiente de grade
Item na grade
O truque é definir a largura máxima do item igual à largura máxima da grade .card: after.
Demonstração ao vivo no Codepen
fonte
É possível usar o "flex-start" e adicionar as margens manualmente. Requer alguns hackers matemáticos, mas é definitivamente fácil de fazer e facilita o uso com um pré-processador CSS como o LESS.
Veja, por exemplo, este mix MENOS:
E, em seguida, pode ser facilmente usado para exibir um layout de grade responsivo:
Aqui está um exemplo de
http://codepen.io/anon/pen/YyLqVB?editors=110
fonte
Esse problema foi resolvido para mim usando a grade CSS,
Esta solução é aplicável apenas se você estiver tendo um número fixo de colunas, ou seja, não. de elementos a serem exibidos em uma única linha
-> usando grade, mas não especificando o número de linhas, à medida que o número de elementos aumenta, ele agrupa em colunas e adiciona linhas dinamicamente, especifiquei três colunas neste exemplo
-> você não precisa dar nenhuma posição ao seu (s) filho (s), pois ele o consertará, o que não queremos.
fonte
Esta versão é a melhor maneira para blocos com largura fixa:
http://codepen.io/7iomka/pen/oxxeNE
Em outros casos - versão do dalgard
http://codepen.io/dalgard/pen/Dbnus
fonte
Existe uma maneira sem o flexbox, embora você precise atender às seguintes condições. 1) O recipiente possui preenchimento. 2) Os itens têm o mesmo tamanho e você sabe exatamente quantos deseja por linha.
O preenchimento menor no lado direito do contêiner permite o preenchimento extra à direita de cada item da lista. Supondo que outros itens no mesmo pai que o objeto de lista sejam preenchidos com 0 a 5%, ele será alinhado com eles. Você também pode ajustar as porcentagens para a margem que desejar ou usar os valores de cálculo de px.
Obviamente, você pode fazer o mesmo sem o preenchimento no contêiner usando o enésimo filho (IE 9+) para remover a margem em cada terceira caixa.
fonte
Usando flexbox e algumas consultas de mídia, eu fiz essa pequena solução: http://codepen.io/una/pen/yNEGjv (é um pouco hacky, mas funciona):
fonte
Eu fiz um SCSS mixin para ele.
Este é o link do codepen: http://codepen.io/diana_aceves/pen/KVGNZg
Você só precisa definir a largura dos itens em porcentagem e número de colunas.
Espero que isso possa ajudá-lo.
fonte
Aqui está outro par de scss mixins.
Esses mixins assumem que você não utilizará plug-ins js como o Isotope (eles não respeitam a ordem de marcação html, alterando assim as regras da css nth).
Além disso, você poderá tirar o máximo proveito deles, especialmente se estiver escrevendo seus pontos de interrupção responsivos da primeira maneira móvel. Idealmente, você usará flexbox_grid () no ponto de interrupção menor e flexbox_cell () nos seguintes pontos de interrupção. flexbox_cell () cuidará de redefinir as margens definidas anteriormente, que não serão mais usadas em pontos de interrupção maiores.
A propósito, desde que você configure corretamente as propriedades flex do seu contêiner, também poderá usar apenas flexbox_cell () nos itens, se necessário.
Aqui está o código:
Uso:
Obviamente, cabe a você definir eventualmente o preenchimento / margem / largura do contêiner e as margens inferiores da célula e similares.
Espero que ajude!
fonte
Isso é bastante hacky, mas funciona para mim. Eu estava tentando obter espaçamento / margens consistentes.
http://codepen.io/rustydev/pen/f7c8920e0beb0ba9a904da7ebd9970ae/
fonte
Parece que ninguém propôs a solução flex-grow no último item. A idéia é ter seu último item flexível para ocupar todo o lugar possível usando o crescimento flexível: 1.
Nota: Essa solução não é perfeita, especialmente se você tiver elementos centralizados nos itens flexíveis, pois ele se concentrará no último item flexível possivelmente enorme.
fonte
Essa é uma combinação de muitas respostas, mas faz exatamente o que eu estava precisando - ou seja, alinhar o último filho em um contêiner flexível à esquerda, mantendo o comportamento entre espaços (neste caso, são três colunas layout).
Aqui está a marcação:
fonte
flex-grow: 0.9
vez deflex-basis
obras para qualquer número de colunas. Testado em um monte de navegadores modernos - ele funciona em todos eles, mas o preenchimento é quebrado no IE (mas trabalhar em Edge0Assumindo:
Defina uma margem esquerda em todos os itens, exceto nos itens 1, 5 e 9, e assim por diante. Se a margem esquerda for 10 px, cada linha terá uma margem de 30 px distribuída entre 4 itens. A largura percentual para o item é calculada da seguinte forma:
Esta é uma solução decente para problemas que envolvem a última linha do flexbox.
fonte
Se você souber a largura dos espaços entre os elementos na linha e a quantidade de elementos em uma linha, isso funcionaria:
fonte
Basta usar o truque Jquery / Javascript para adicionar uma div vazia:
fonte
Oh garoto, acho que encontrei uma boa solução com CSS mínimo e sem JS. Confira:
A chave aqui é lembrar que o que estamos tentando alcançar é exatamente o que
text-align: justify
faz!Os elementos vazios no HTML estão lá para fazer com que a última linha seja exibida perfeitamente sem alterar a aparência, mas pode não ser necessária, considerando o que você está tentando alcançar. Para um equilíbrio perfeito em todas as situações, você precisa de pelo menos x-4 elementos vazios, x sendo o número de elementos a serem exibidos ou n-2, n sendo o número de colunas que deseja exibir.
fonte
Basta adicionar alguns itens falsos com as mesmas propriedades, exceto a altura definida como 0px até o final.
fonte
você quer alinhar
use em
align-content: flex-start;
vez dejustify-content: space-between;
isso puxa os itens da última linha para a esquerda e também distribui o espaço uniformemente,
https://codepen.io/anon/pen/aQggBW?editors=1100
A solução danAnderson NÃO É DINÂMICA.
quando a largura do item foi alterada de 25 para 28 dan anderson falha no espaço entre as imagens
danAnderson: https://codepen.io/anon/pen/ZwYPmB?editors=1100
dinâmico: https://codepen.io/anon/pen/aQggBW?editors=1100
isso é o que tenho tentado dizer. dans é hacky .....
fonte
Consegui fazer isso
justify-content: space-between
no contêinerfonte