Eu tenho uma tabela "classificável" onde o cabeçalho da coluna atualmente classificada exibe um ícone:
O ícone de classificação deve ser exibido no final do texto (ou seja, apoiamos LTR / RTL). Atualmente estou usando display:flex
. No entanto, se a largura da tabela diminuir e o texto do cabeçalho da coluna começar a quebrar, eu corro para estados ambíguos em que não está claro qual coluna está classificada:
Em vez disso, gostaria de atender aos seguintes requisitos:
- O ícone sempre deve estar "firmemente" alinhado com o "final" da linha de texto mais longa (mesmo que a célula / botão de agrupamento seja mais amplo).
- O ícone também deve estar alinhado com a última linha do texto.
- O ícone nunca deve quebrar em uma linha própria.
- O botão deve estar presente e deve abranger toda a largura da célula. (O estilo interno e a marcação podem mudar conforme necessário.)
- CSS e HTML somente se possível.
- Ele não pode confiar nas larguras conhecidas / definidas da coluna ou no texto do cabeçalho.
Por exemplo:
Estive a experimentar com um monte de diferentes combinações de display: inline/inline-block/flex/grid
, position
, ::before/::after
, e até mesmo float
(!), Mas não pode obter o comportamento desejado. Aqui está o meu código atual demonstrando o problema:
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size: 0.875rem;
border: 0;
background-color: transparent;
width: 100%;
display: flex;
align-items: flex-end;
font-weight: bold;
line-height: 1.4;
}
.sort {
width: 1.25rem;
height: 1.25rem;
}
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
Age
<span class="sort"></span>
</button>
</th>
<th class="th">
<button class="button">
Favorite Food
<span class="sort"></span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
Favorite Color
<span class="sort">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
Likes Neil Diamond?
<span class="sort"></span>
</button>
</th>
</tr>
</thead>
</table>
Alguma idéia de como realizar essa interface do usuário? Provavelmente isso tem pouco a ver com as coisas da mesa ou do botão. Realmente preciso Thing A
alinhar a parte inferior / extremidade "firmemente" Thing B
(de uma largura flexível e que possa ter texto Thing A
em quebra automática ), mas não possa quebrar em uma linha própria.
Eu tentei mexer com os flex
valores, mas qualquer combinação faz com que o texto seja quebrado prematuramente ou não em breve.
Respostas:
Pense que você precisa de JS para isso. Aqui está uma resposta que deve atender a todas as condições, exceto 5.
fonte
Eu acho que não há nenhum problema aqui, exceto a ambiguidade visual. Aqui estão minhas observações.
Existe um limite tão estreito que apenas o espaçamento dinâmico está causando a ambiguidade visual.
Agora, chegando à solução, a solução mais próxima que eu poderia encontrar sem a intervenção do JavaScript , embora não seja perfeita, é:
Limite a largura deste texto, fornecendo uma largura máxima:
Nota: O
text-align: center
objetivo é apenas reduzir o efeito de falta de espaço, a menos que você tenha um requisito estrito de não concordar com isso.Informe-me se isso resolver sua pergunta.
É assim que o efeito seria:
fonte
Eu acho que você é quase bom e sente falta do (3), o que é um truque. Uma idéia é fazer com que o elemento icon tenha uma largura igual a
0
e desativar qualquer espaço em branco entre o texto e o ícone de classificação. Para isso, uso um invólucro extra para o texto e removi o uso do flexbox.Você terá algum excesso, mas isso não é um problema, pois você está aplicando o preenchimento. Você também pode aumentar o
padding-right
se quiserfonte
Se o título do seu cabeçalho não for dinâmico, eu tenho uma correção muito fácil.
para isso, você terá que colocar a última palavra do título e o ícone svg juntos
por exemplo: -html
remove display: flex da classe .button e dê estilo display: inline-block ao intervalo adicionado
devido ao span ser inline-block, o ícone svg nunca estará em uma linha separada. haverá pelo menos uma palavra na frente
fonte
Você pode tentar assim:
Espero que esta resposta seja útil para você.Não fiz css para visualização em dispositivos móveis!
fonte