J'ai une table "triable" où l'en-tête de la colonne actuellement triée affiche une icône:
L'icône de tri doit être affichée à la fin du texte (c'est-à-dire que nous prenons en charge LTR / RTL). J'utilise actuellement display:flex
. Cependant, si la largeur du tableau diminue et que le texte de l'en-tête de colonne commence à s'habiller, je tombe dans des états ambigus où il n'est pas clair quelle colonne est triée:
Au lieu de cela, je voudrais répondre aux exigences suivantes:
- L'icône doit toujours être "étroitement" alignée avec la "fin" de la plus longue ligne de texte (même si la cellule / le bouton d'habillage est plus large).
- L'icône doit également être alignée en bas de la dernière ligne de texte.
- L'icône ne doit jamais être placée sur une ligne à part.
- Le bouton doit être présent et doit s'étendre sur toute la largeur de la cellule. (Son style interne et le balisage peuvent changer selon les besoins.)
- CSS et HTML uniquement si possible.
- Il ne peut pas s'appuyer sur des largeurs de colonne ou un texte d'en-tête connus / définis.
Par exemple:
Je l' ai expérimenté avec un tas de différentes combinaisons de display: inline/inline-block/flex/grid
, position
, ::before/::after
et même float
(!) Mais ne peut pas obtenir le comportement souhaité. Voici mon code actuel illustrant le problème:
.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>
Des idées sur la façon d'accomplir cette interface utilisateur? Cela n'a probablement pas grand chose à voir avec la table ou les boutons. Vraiment, j'ai besoin que le Thing A
bas / l'extrémité soit "étroitement" aligné sur Thing B
(d'une largeur flexible et qui peut avoir du texte enveloppé) mais je Thing A
ne peux pas envelopper sur une ligne qui lui est propre.
J'ai essayé de jouer avec les flex
valeurs, mais toute combinaison permet de boucler le texte prématurément ou pas assez tôt.