Tengo una tabla "ordenable" donde el encabezado de la columna actualmente ordenada muestra un icono:
El icono de clasificación se mostrará al final del texto (es decir, admitimos LTR / RTL). Actualmente estoy usando display:flex
. Sin embargo, si el ancho de la tabla se reduce y el texto del encabezado de la columna comienza a ajustarse, me encuentro con estados ambiguos donde no está claro qué columna está ordenada:
En cambio, me gustaría cumplir con los siguientes requisitos:
- El ícono siempre debe estar "firmemente" alineado con el "final" de la línea de texto más larga (incluso si la celda / botón de ajuste es más ancho).
- El icono también debe estar alineado con la última fila de texto.
- El icono nunca debe ajustarse a una línea propia.
- El botón debe estar presente y debe abarcar todo el ancho de la celda. (Su estilo interno y el marcado pueden cambiar según sea necesario).
- CSS y HTML solo si es posible.
- No puede basarse en anchos de columna conocidos / establecidos o texto de encabezado.
Por ejemplo:
He estado experimentando con un montón de diferentes combinaciones de display: inline/inline-block/flex/grid
, position
, ::before/::after
, e incluso float
(!) Pero no puedo conseguir el comportamiento deseado. Aquí está mi código actual que demuestra el 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>
¿Alguna idea sobre cómo lograr esta interfaz de usuario? Esto probablemente tiene poco que ver con la tabla o el botón. Realmente necesito Thing A
un fondo / extremo "apretado" alineado a Thing B
(de un ancho flexible y que pueda tener texto ajustado) pero Thing A
no puedo ajustarlo a una línea propia.
He intentado jugar con los flex
valores, pero cualquier combinación hace que el texto se ajuste prematuramente o no lo suficientemente pronto.
Respuestas:
Creo que necesitas JS para esto. Aquí hay una respuesta que debe cumplir con todas las condiciones excepto 5.
fuente
Creo que no hay ningún problema aquí, excepto la ambigüedad visual. Aquí están mis observaciones.
Existe un límite tan estrecho , es solo que el espaciado dinámico está causando la ambigüedad visual.
Ahora que llegamos a la solución, la solución más cercana que podría encontrar sin la intervención de JavaScript , aunque no es perfecta, es,
Limite el ancho de este texto dando un ancho máximo:
Nota: El
text-align: center
objetivo es solo reducir el efecto de espacio perdido, a menos que tenga un requisito estricto de no ir con esto.Avíseme si esto responde a su pregunta.
Así es como sería el efecto:
fuente
Creo que eres casi bueno y te falta el (3) que es un poco truco. Una idea es hacer que el elemento del icono tenga un ancho igual
0
y desactivar cualquier espacio en blanco entre el texto y el icono de ordenación. Para esto utilizo un contenedor adicional para el texto y eliminé el uso de flexbox.Tendrá un desbordamiento pero no es un problema ya que está aplicando relleno. También puedes aumentar el
padding-right
si quieresfuente
Si su título no es dinámico, entonces tengo una solución muy fácil.
para esto tendrás que poner la última palabra del título y el ícono de svg juntos
por ejemplo: -html
eliminar display: flex de la clase .button y dar display de estilo: bloque en línea al lapso agregado
debido a que span está bloqueado en línea, el ícono svg nunca estará en línea separada. al menos habrá una palabra delante de ella
fuente
Podrías intentarlo así:
Espero que esta respuesta te sea útil. ¡No hice CSS para la vista móvil!
fuente