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.
Réponses:
Pensez que vous avez besoin de JS pour cela. Voici une réponse qui devrait répondre à toutes les conditions sauf 5.
la source
Je pense qu'il n'y a aucun problème ici, sauf l'ambiguïté visuelle. Voici mes observations.
Il y a tellement de limites serrées , c'est juste que l'espacement dynamique est à l'origine de l'ambiguïté visuelle.
Venons-en maintenant à la solution, la solution la plus proche que j'ai pu trouver sans intervention de JavaScript , bien qu'elle ne soit pas parfaite, est,
Limitez la largeur de ce texte en donnant une largeur max:
Remarque: Le
text-align: center
n'est que pour réduire l'effet de l'espace manquant, sauf si vous avez l'obligation stricte de ne pas y aller.Veuillez me faire savoir si cela répond à votre question.
C'est ainsi que l'effet serait:
la source
Je pense que vous êtes presque bon et que vous manquez le (3) qui est un petit truc. Une idée est de rendre l'élément icône ayant une largeur égale à
0
et de désactiver les espaces blancs entre le texte et l'icône de tri. Pour cela, j'utilise un wrapper supplémentaire pour le texte et j'ai supprimé l'utilisation de flexbox.Vous aurez un débordement, mais ce n'est pas un problème puisque vous appliquez un remplissage. Vous pouvez également augmenter le
padding-right
si vous voulezla source
si votre titre n'est pas dynamique, j'ai une solution très simple.
pour cela, vous devrez mettre ensemble le dernier mot du titre et l'icône svg dans span
par exemple: -html
supprimer display: flex de la classe .button et donner un style display: inline-block à la plage ajoutée
en raison du fait que span est un bloc en ligne, l'icône svg ne sera jamais en ligne séparée. il y aura au moins un mot devant
la source
Vous pouvez essayer comme ceci:
J'espère que cette réponse vous sera utile.Je n'ai pas fait de CSS pour la vue mobile!
la source