Estou usando uma caixa flexível para exibir 8 itens que serão redimensionados dinamicamente com minha página. Como forçá-lo a dividir os itens em duas linhas? (4 por linha)?
Aqui está um trecho relevante:
(Ou se você preferir jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
Respostas:
Você entrou
flex-wrap: wrap
no recipiente. Isso é bom, porque substitui o valor padrão, que énowrap
( origem ). É por isso que os itens não são agrupados para formar uma grade em alguns casos .Nesse caso, o principal problema está
flex-grow: 1
nos itens flexíveis.Na
flex-grow
verdade, a propriedade não dimensiona itens flexíveis. Sua tarefa é distribuir espaço livre no contêiner ( origem ). Portanto, não importa o tamanho da tela, cada item receberá uma parte proporcional do espaço livre na linha.Mais especificamente, existem oito itens flexíveis no seu contêiner. Com
flex-grow: 1
, cada um recebe 1/8 do espaço livre na linha. Como não há conteúdo em seus itens, eles podem diminuir para largura zero e nunca serão quebrados.A solução é definir uma largura nos itens. Tente o seguinte:
Com
flex-grow: 1
definido naflex
abreviação, não há necessidade deflex-basis
25%, o que resultaria em três itens por linha devido às margens.Como
flex-grow
consumirá espaço livre na linha,flex-basis
só precisa ser grande o suficiente para impor uma quebra automática. Nesse caso, comflex-basis: 21%
, há muito espaço para as margens, mas nunca espaço suficiente para um quinto item.fonte
flex: 1 0 calc(25% - 10px);
margin: 2%;
vez de um número fixo de pixels para impedir que as caixas pulem para uma nova linha em pequenos dispositivos / resoluções. a fórmula geral é(100 - (4 * box-width-percent)) / 8
% para diferentes larguras de caixaAdicione uma largura aos
.child
elementos. Eu, pessoalmente, usaria porcentagens nomargin-left
se você quiser tê-lo sempre 4 por linha.DEMO
fonte
Aqui está outra abordagem.
Você também pode fazer isso desta maneira:
Exemplo: https://codepen.io/capynet/pen/WOPBBm
E uma amostra mais completa: https://codepen.io/capynet/pen/JyYaba
fonte
Eu faria assim usando margens negativas e calc para as calhas:
Demonstração: https://jsfiddle.net/9j2rvom4/
Método alternativo de grade CSS:
Demonstração: https://jsfiddle.net/jc2utfs3/
fonte
Espero que ajude. para mais detalhes, você pode seguir este link
fonte
Acredito que este exemplo é mais barebones e mais fácil de entender do que @dowomenfart.
Isso realiza os mesmos cálculos de largura enquanto corta diretamente para a carne. A matemática é muito mais fácil e
em
é o novo padrão devido à sua escalabilidade e facilidade de uso.fonte
;)
fonte
justify-content: space-evenly;
ao incentivo, ele se alinhará bem e você não precisará fazer issocalc
na criança. Obrigado pelo exemplo, no entanto!Invólucro flexível + margem negativa
Por que flexionar vs.
display: inline-block
?Por que margem negativa?
Você usa SCSS ou CSS-in-JS para os casos extremos (ou seja, primeiro elemento da coluna) ou define uma margem padrão e se livra da margem externa posteriormente.
Implementação
https://codepen.io/zurfyx/pen/BaBWpja
fonte
Aqui está outra maneira sem usar
calc()
.É tudo o que há para isso. Você pode gostar das dimensões para obter tamanhos mais estéticos, mas essa é a ideia.
fonte