Imagine o seguinte layout, onde os pontos representam o espaço entre as caixas:
[Left box]......[Center box]......[Right box]
Quando removo a caixa direita, gosto que a caixa central ainda esteja no centro, da seguinte forma:
[Left box]......[Center box].................
O mesmo vale para se eu remover a caixa esquerda.
................[Center box].................
Agora, quando o conteúdo dentro da caixa central ficar mais longo, ele ocupará o espaço disponível necessário, enquanto permanece centralizado. A caixa de esquerda e direita nunca vai encolher e, assim, quando, onde há espaço deixado o overflow:hidden
e text-overflow: ellipsis
virão em vigor para quebrar o conteúdo;
[Left box][Center boxxxxxxxxxxxxx][Right box]
Tudo acima é a minha situação ideal, mas não tenho idéia de como conseguir esse efeito. Porque quando eu crio uma estrutura flexível assim:
.parent {
display : flex; // flex box
justify-content : space-between; // horizontal alignment
align-content : center; // vertical alignment
}
Se as caixas esquerda e direita tiverem exatamente o mesmo tamanho, obtenho o efeito desejado. No entanto, quando um dos dois é de tamanho diferente, a caixa centralizada não está mais realmente centralizada.
Existe alguém que possa me ajudar?
Atualizar
A justify-self
seria bom, isso seria ideal:
.leftBox {
justify-self : flex-start;
}
.rightBox {
justify-self : flex-end;
}
flexbox
é assim que deve funcionar. Você pode tentar outra metodologia.justify-self
hoje mais cedo, então você pode achar isso interessante: stackoverflow.com/questions/32551291/…Respostas:
Aqui está um método usando o flexbox para centralizar o item do meio, independentemente da largura dos irmãos.
Características principais:
Use contêineres flexíveis e
auto
margens aninhados :Veja como funciona:
.container
) de nível superior é um contêiner flexível..box
) filho agora é um item flexível..box
item é fornecidoflex: 1
para distribuir o espaço do contêiner igualmente ( mais detalhes ).justify-content: center
.span
elemento é um item flexível centralizado.auto
margens flexíveis para deslocar os botões externos paraspan
a esquerda e direita.Você também pode renunciar
justify-content
e usarauto
margens exclusivamente.Mas
justify-content
pode funcionar aqui porque asauto
margens sempre têm prioridade.fonte
width
que seja especificado #white-space: nowrap
foi a última peça do quebra-cabeça para impedir a quebra de texto quando a área ficar muito pequena.flex: 1
para o primeiro e o último. Isso os faz crescer igualmente para preencher o espaço disponível deixado pelo meio.No entanto, se o primeiro ou o último item tiver um conteúdo amplo, esse item flexível também aumentará devido ao novo
min-width: auto
valor inicial.Nota O Chrome parece não implementar isso corretamente. No entanto, você pode definir
min-width
como-webkit-max-content
ou-webkit-min-content
e funcionará também.Somente nesse caso o elemento do meio será empurrado para fora do centro.
fonte
Em vez de usar o flexbox como padrão, o uso da grade o resolve em 2 linhas de CSS sem marcação adicional dentro dos filhos de nível superior.
HTML:
CSS:
O Flexbox é ótimo, mas não deve ser a resposta para tudo. Nesse caso, a grade é claramente a opção mais limpa.
A Even fez um codepen para o seu prazer em testar: https://codepen.io/anon/pen/mooQOV
fonte
flex
de tudo. Minha única objeção é que alinhamento vertical se torna mais fácil usando o flex (align-items: center
) no caso de seus itens são diferentes alturas e precisam ser alinhadosVocê pode fazer o seguinte:
fonte
Aqui está uma resposta que usa grade em vez de flexbox. Esta solução não requer elementos netos extras no HTML, como a resposta aceita. E funciona corretamente mesmo quando o conteúdo de um lado é longo o suficiente para transbordar para o centro, ao contrário da resposta da grade de 2019.
A única coisa que essa solução não faz é mostrar reticências ou ocultar o conteúdo extra na caixa central, conforme descrito na pergunta.
fonte
Aqui está outra maneira de fazer isso, usando
display: flex
nos pais e filhos:fonte
você também pode usar esta maneira simples de atingir o alinhamento exato do centro do elemento do meio:
codepen: https://codepen.io/ErAz7/pen/mdeBKLG
fonte