Para definir a distância mínima entre itens flexbox que estou usando margin: 0 5px
no .item
e margin: 0 -5px
no recipiente. Para mim, parece um hack, mas não consigo encontrar uma maneira melhor de fazer isso.
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
.item {
background: gray;
width: 50px;
height: 50px;
margin: 0 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
row-gap: 5px
- feito.gap
propriedade em contêineres flexíveis ( caniuse ) #Respostas:
border-spacing
tabelas (exceto a propriedade CSS,gap
que não é bem suportada na maioria dos navegadores, caniuse )Portanto, conseguir o que você está pedindo é um pouco mais difícil.
Na minha experiência, a maneira "mais limpa" que não usa
:first-child
/:last-child
e funciona sem nenhuma modificaçãoflex-wrap:wrap
é colocarpadding:5px
no contêiner emargin:5px
nas crianças. Isso criará uma10px
lacuna entre cada criança e entre cada criança e seus pais.Demo
fonte
order
propriedade estiver definida?:first-child/:last-child
não funcionará como esperado.Isso não é um hack. A mesma técnica também é usada pelo bootstrap e sua grade, embora, em vez de margem, o bootstrap use preenchimento para suas colunas.
fonte
height:100%; width:100%
ignora o preenchimento do item.flex-basis
valores do IE10 e 11. não são consideradosbox-sizing: border-box
, portanto, um filho com qualquer preenchimento ou borda transbordará o pai (ou quebrará nesse caso). FonteFlexbox e css calc com suporte a várias linhas
Olá, abaixo está a minha solução de trabalho para todos os navegadores que suportam o flexbox. Sem margens negativas.
Fiddle Demo
Observe que esse código pode ser mais curto usando o SASS
Atualização 2020.II.11 Colunas alinhadas na última linha à esquerda
Atualização 2020.II.14 Removida a margem inferior na última linha
fonte
justify-content
.justify-content: space-evenly;
oujustify-content: space-around;
.Você pode usar bordas transparentes.
Eu considerei esse problema enquanto tentava criar um modelo de grade flexível que pudesse retornar a um modelo de tabelas + células de tabela para navegadores mais antigos. E bordas para calhas de colunas me pareciam a melhor escolha apropriada. isto é, as células da tabela não têm margens.
por exemplo
Observe também que você precisa
min-width: 50px;
do flexbox. O modelo flexível não manipula tamanhos fixos, a menos que você façaflex: none;
o elemento filho específico que deseja como fixo e, portanto, excluído de existir"flexi"
. http://jsfiddle.net/GLpUp/4/ Mas todas as colunas juntasflex:none;
não são mais um modelo flexível. Aqui está algo mais próximo de um modelo flexível: http://jsfiddle.net/GLpUp/5/Portanto, você pode usar as margens normalmente se não precisar do fallback de célula de tabela para navegadores mais antigos. http://jsfiddle.net/GLpUp/3/
A configuração
background-clip: padding-box;
será necessária ao usar um plano de fundo, caso contrário, o plano de fundo fluirá para a área de borda transparente.fonte
background-clip: padding-box
Esta solução funcionará para todos os casos, mesmo se houver várias linhas ou qualquer número de elementos. Mas a contagem da seção deve ser a mesma que você deseja 4 na primeira linha e 3 na segunda linha, não funcionará dessa maneira, o espaço para o quarto conteúdo ficará em branco e o contêiner não será preenchido.
Nós estamos usando
display: grid;
e suas propriedades.A desvantagem deste método está no Mobile Opera Mini não será suportado e no PC isso funciona apenas após o IE10 .
Nota para compatibilidade completa do navegador, incluindo o IE11, use o Autoprefixer
RESPOSTA ANTIGA
Não pense nisso como uma solução antiga, ainda é uma das melhores se você deseja apenas uma única linha de elementos e funcionará com todos os navegadores.
Esse método é usado pela combinação de irmãos CSS , para que você possa manipulá-lo de várias outras maneiras também, mas se sua combinação estiver errada, também poderá causar problemas.
O código abaixo fará o truque. Nesse método, não há necessidade de fornecer
margin: 0 -5px;
ao#box
wrapper.Uma amostra de trabalho para você:
fonte
grid-template-columns
que definimos não dinamicamente. Portanto, se você atribuir o valor1fr 1fr 1fr 1fr
, ele dividirá a div4fractions
e tentará preencher os elementos filhos em cada umafractions
, pelo que sei, é a única maneira de entrargrid
. O que afirmei na resposta é que, se o usuário precisar dividir a div em 4 e usá-los com muitos elementos, mesmo para várias linhas,gid
isso ajudará.Você pode usar
& > * + *
como seletor para emular umflex-gap
(para uma única linha):Se você precisar suportar flex wrapping , poderá usar um elemento wrapper:
fonte
*
operador não aumenta a especificidade como você poderia esperar. Portanto, dependendo do css existente, pode ser necessário aumentar a especificidade no.flex > *
seletor ou adicionar!important
à regra se houver outros seletores aplicando margem a esse elemento.Digamos que se você deseja definir o
10px
espaço entre os itens, você pode definir.item {margin-right:10px;}
todos e redefini-lo no último.item:last-child {margin-right:0;}
Você também pode usar o irmão geral
~
ou o+
seletor de irmão seguinte para definir a margem esquerda nos itens, excluindo o primeiro.item ~ .item {margin-left:10px;}
ou usar.item:not(:last-child) {margin-right: 10px;}
O Flexbox é tão inteligente que recalcula automaticamente e distribui igualmente a grade.
Se você deseja permitir flex wrap , consulte o exemplo a seguir.
fonte
:last-child
não afeta cada último filho no final de uma linha, correto?Eu encontrei uma solução baseada no seletor geral de irmãos
~
, e permite o aninhamento infinito.Veja esta caneta de código para um exemplo de trabalho
Basicamente, dentro dos contêineres da coluna, todo filho que é precedido por outro filho recebe uma margem superior. Da mesma forma, dentro de cada contêiner de linha, todo filho que é precedido por outro recebe uma margem esquerda.
fonte
Passando da resposta de sawa, aqui está uma versão ligeiramente aprimorada que permite definir um espaçamento fixo entre os itens sem a margem circundante.
http://jsfiddle.net/chris00/s52wmgtq/49/
Também está incluída a versão "-webkit-flex" do Safari.
fonte
De acordo com o #ChromDevSummit, há uma implementação de
gap
propriedade para o Flexbox, embora no momento (14 de novembro de 2019) ele seja suportado apenas no Firefox, mas deva ser implementado no Chrome em breve:Demonstração ao vivo
Também atualizarei minha resposta quando chegar ao Chrome.
fonte
Eu usei isso para colunas de largura fixa e empacotada. A chave aqui é
calc()
Amostra SCSS
Exemplo completo de Codepen
fonte
Um contêiner flexível com margem -x (negativa) e itens flexíveis com margem x (positiva) ou preenchimento resultam no resultado visual desejado: Os itens flexíveis têm um intervalo fixo de 2x apenas entre si.
Parece ser simplesmente uma questão de preferência, seja para usar margem ou preenchimento nos itens flexíveis.
Neste exemplo, os itens flexíveis são dimensionados dinamicamente para preservar a diferença fixa:
fonte
Eventualmente, eles adicionarão a
gap
propriedade ao flexbox. Até então, você poderia usar a grade CSS, que já possui agap
propriedade, e apenas ter uma única linha. Melhor do que lidar com margens.fonte
gap
Propriedade CSS :Há uma nova
gap
propriedade CSS para layouts de múltiplas colunas, caixas flexíveis e grade que funciona em alguns navegadores agora! (Consulte Posso usar o link 1 ; link 2 ).Até o momento, isso só funciona no Firefox infelizmente. Atualmente, ele funciona no Chrome se você ativar "Ativar recursos experimentais da plataforma web" em
about:flags
.fonte
Usando o Flexbox em minha solução, usei a
justify-content
propriedade para o elemento pai (contêiner) e especifiquei as margens dentro daflex-basis
propriedade dos itens. Verifique o snippet de código abaixo:fonte
Com o flexbox, criar calhas é uma dor, especialmente quando o embrulho está envolvido.
Você precisa usar margens negativas ( como mostrado na pergunta ):
... ou altere o HTML ( como mostrado em outra resposta ):
... ou alguma outra coisa.
De qualquer forma, você precisa de um truque feio para fazê-lo funcionar, porque o flexbox não fornece "
flex-gap
" um recurso ( pelo menos por enquanto ).A questão das sarjetas, no entanto, é simples e fácil com o CSS Grid Layout.
A especificação Grid fornece propriedades que criam espaço entre os itens da grade, ignorando o espaço entre os itens e o contêiner. Essas propriedades são:
grid-column-gap
grid-row-gap
grid-gap
(a abreviação de ambas as propriedades acima)Recentemente, a especificação foi atualizada para estar em conformidade com o Módulo de alinhamento de caixas CSS , que fornece um conjunto de propriedades de alinhamento para uso em todos os modelos de caixas. Portanto, as propriedades são agora:
column-gap
row-gap
gap
(forma abreviada)No entanto, nem todos os navegadores que suportam o Grid suportam as propriedades mais recentes, então usarei as versões originais na demonstração abaixo.
Além disso, se o espaçamento for necessário entre os itens e o contêiner, ele
padding
funcionará perfeitamente (consulte o terceiro exemplo na demonstração abaixo).Das especificações:
Mais Informações:
fonte
Por que não fazer assim:
Isso usa o seletor de irmão adjacente , para fornecer todos os
.item
elementos, exceto o primeiro amargin-left
. Graças ao flexbox, isso resulta em elementos igualmente amplos. Isso também pode ser feito com elementos posicionados verticalmente emargin-top
, é claro.fonte
Aqui está minha solução, que não requer a definição de classes nos elementos filho:
Uso:
A mesma técnica pode ser usada para linhas e colunas flexíveis normais, além do exemplo embutido fornecido acima, e estendida com classes para espaçamento diferente de 4px.
fonte
Costumo usar o operador + para esses casos
fonte
Acho que a maneira mais fácil de fazer isso é com porcentagens e apenas permitindo que a margem calcule sua largura
Isso significa que você acaba com algo assim se estiver usando seu exemplo
Significa que seus valores são baseados na largura, o que pode não ser bom para todos.
fonte
Aqui está uma grade de elementos da interface do usuário do cartão com espaçamento concluído usando a caixa flexível:
Fiquei frustrado com o espaçamento manual dos cartões, manipulando o preenchimento e as margens com resultados duvidosos. Então, aqui estão as combinações de atributos CSS que achei muito eficazes:
Espero que isso ajude as pessoas, presente e futuro.
fonte
Columnify - Uma classe individual para N colunas
Flexbox e SCSS
Flexbox e CSS
Jogue com ele no JSFiddle .
fonte
fonte
Basta usar
.item + .item
no seletor para combinar com o segundo.item
fonte
Assumindo:
Defina uma margem esquerda em cada item, exceto no 1º, 5º e 9º itens, e assim por diante; e defina a largura fixa em cada item. Se a margem esquerda for 10 px, cada linha terá uma margem de 30 px entre 4 itens, a largura percentual do item poderá ser calculada da seguinte maneira:
Esta é uma solução decente para problemas que envolvem a última linha do flexbox.
fonte
De fato, existe uma maneira agradável, organizada e apenas de CSS de fazer isso (que pode ser considerado "melhor").
De todas as respostas postadas aqui, encontrei apenas uma que usa calc () com sucesso (de Dariusz Sikorski). Mas quando colocado com: "mas falha se houver apenas 2 itens na última linha", não houve solução expandida.
Esta solução aborda a questão do OP com uma alternativa às margens negativas e aborda o problema colocado para Dariusz.
notas:
calc()
para permitir que o navegador faça contas da maneira que deseja -100%/3
(embora 33,3333% devam funcionar da mesma maneira) e(1em/3)*2
(embora .66em também deva funcionar bem) .::after
para preencher a última linha se houver menos elementos do que colunasTambém em https://codepen.io/anon/pen/rqWagE
fonte
Você poderia usar a nova propriedade
gap
. Copio e colo a explicação que encontrei neste artigo , além de mais informaçõesInfelizmente, no momento, apenas o FireFox suporta lacunas nos layouts flexíveis.
fonte
gap
já foi recomendado em uma resposta aqui stackoverflow.com/a/58041749/2756409 Além disso, isso não é CSS.Não funcionará em todos os casos, mas se você tiver larguras filho flexíveis (%) e souber o número de itens por linha, poderá especificar de maneira muito limpa as margens dos elementos necessários usando o
nth-child
(s) seletor (es).Depende em grande parte do que você quer dizer com "melhor". Dessa maneira, não é necessária marcação adicional do wrapper para elementos filhos ou elementos negativos - mas essas coisas têm seu lugar.
fonte
Eu me deparei com o mesmo problema anteriormente, então me deparei com a resposta para isso. Espero que ajude outras pessoas para referência futura.
resposta longa, adicione uma borda aos itens flexíveis do seu filho. então você pode especificar margens entre itens flexíveis para o que quiser. No snippet, eu uso preto para fins de ilustração, você pode usar 'transparent' se quiser.
fonte
O truque da margem negativa no contêiner de caixa funciona muito bem. Aqui está outro exemplo que funciona muito bem com pedidos, embalagens e o que não.
fonte