Em uma linha de grade com três trilhas, gostaria que as trilhas esquerda e direita tivessem exatamente o mesmo tamanho, respeitando o maior conteúdo mínimo entre as duas, e que a trilha do meio ocupasse o espaço restante, independentemente do tamanho do seu conteúdo. O HTML+CSS a seguir ilustra o problema:
nav {
display: grid;
grid-template-columns: 1fr auto 1fr;
/* grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr); */
background: green;
align-items: center;
overflow: hidden;
}
.box {
box-sizing: border-box;
overflow: hidden;
}
.scroll-container {
position: relative;
}
ul {
display: flex;
border: 1px solid black;
border-radius: 4px;
list-style: none;
padding: 0;
overflow-x: auto;
position: relative;
li {
padding: 8px 16px;
white-space: nowrap;
&:not(:last-child) {
border-inline-end: 1px solid black;
}
}
}
.edge {
padding: 8px;
white-space: nowrap;
}
.right {
justify-self: end;
}
<nav>
<div class="box edge left">
<h3 class="title">Super Cool App</h3>
</div>
<div class="box centre">
<div class="scroll-container">
<ul class="links">
<li>First Link Item</li>
<li>Second Link Item</li>
<li>Third Link Item</li>
<li>Fourth Link Item</li>
<li>Fifth Link Item</li>
<li>Sixth Link Item</li>
<li>Seventh Link Item</li>
<li>Eighth Link Item</li>
<li>Ninth Link Item</li>
<li>Tenth Link Item</li>
</ul>
</div>
</div>
<div class="box edge right">
<button>X</button>
</div>
</nav>
grid-template-columns: 1fr auto 1fr;
descreve bem o que eu quero alcançar, mas não funciona. Em vez disso, como 1fr
é essencialmente equivalente ao minmax(auto, 1fr)
que outros já observaram em outros lugares, as trilhas de borda são reduzidas a 0 de largura e a trilha do meio ocupará todo o espaço. Algo como grid-template-columns: minmax(min-content, 1fr) auto minmax(min-content, 1fr);
produz um resultado um pouco melhor, mas também não é o que eu quero, porque reduzirá as bordas para min-content
, o que é diferente para cada uma delas, ou seja, elas não terão a mesma largura.
Resposta curta: Não, isso não pode ser feito sem algumas concessões.
O que você está pedindo não faz sentido, você quer que todas as três colunas preencham "o espaço restante", o que é impossível de calcular, pois você não especifica o "espaço ocupado".
Basicamente, você quer dar uma noção de espaço ocupado para que o navegador possa calcular quanto oferecer aos outros.
Opção 1: Limite o crescimento do centro e projete em torno disso. Ambas as bordas serão forçadas a ter o mesmo tamanho.
Opção 2: Limite o quanto o meio pode crescer e minimize o tamanho das bordas para o conteúdo. As bordas corresponderão ao tamanho somente quando o meio não precisar de espaço, mas todo o conteúdo estará sempre visível.
Opção 3: Defina o tamanho das bordas. O meio ocupará o espaço restante não ocupado pelas bordas.
Opção 4: Coloque tudo em parâmetros flexíveis. Os tamanhos relativos serão sempre mantidos.
Pode haver outra sintaxe para obter resultados semelhantes, como envolver col-span etc., mas essas são basicamente suas opções para construir sua grade logicamente.
expanda o elemento esquerdo ao máximo e use Javascript para obter a largura do elemento esquerdo e adicioná-lo ao elemento direito.
JavaScript para alterar a largura. Você pode modificar e adicionar um ouvinte de eventos para eventos de redimensionamento.
Não acho que seja possível fazer isso somente com CSS.
Mas mesmo que fosse, eu não usaria esse design. Eu não tentaria fazer os lados esquerdo e direito iguais. Ficaria melhor se os trilhos esquerdo e direito tivessem cada um o tamanho necessário — isso resultaria em espaços iguais entre o trilho central e os dois trilhos laterais. Basta usar um flexbox com
justify-content: space-between
.