У меня есть «сортируемая» таблица, где в заголовке сортируемого в данный момент столбца отображается значок:
Значок сортировки должен отображаться в конце текста (т. Е. Мы поддерживаем LTR / RTL). Я сейчас пользуюсь display:flex
. Однако, если ширина таблицы уменьшается и текст заголовка столбца начинает переноситься, я сталкиваюсь с неоднозначными состояниями, когда неясно, какой столбец отсортирован:
Вместо этого я хотел бы соответствовать следующим требованиям:
- Значок всегда должен быть «тесно» выровнен с «концом» самой длинной строки текста (даже если ячейка / кнопка переноса шире).
- Значок также должен быть выровнен снизу относительно последней строки текста.
- Значок никогда не должен переноситься на собственную линию.
- Кнопка должна присутствовать и должна охватывать всю ширину ячейки. (Это внутренняя стилизация и разметка может меняться по мере необходимости.)
- CSS и HTML, только если это вообще возможно.
- Он не может полагаться на известную / установленную ширину столбца или текст заголовка.
Например:
Я экспериментировал с кучей различных комбинаций display: inline/inline-block/flex/grid
, position
, ::before/::after
и даже float
(!) , Но не может получить желаемое поведение. Вот мой текущий код, демонстрирующий проблему:
.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>
Любые идеи о том, как сделать этот интерфейс? Это, вероятно, имеет мало общего с таблицей или кнопками. На самом деле мне нужно Thing A
«плотно» нижний / конец выровнен по Thing B
(гибкой ширины и который может иметь обернутый текст), но Thing A
не могу перенести на собственную линию.
Я пробовал возиться со flex
значениями, но любая комбинация либо делает перенос текста преждевременным, либо недостаточно быстрым.
Ответы:
Думаю, вам нужен JS для этого. Вот ответ, который должен соответствовать всем условиям, кроме 5.
источник
Я думаю, что здесь нет никаких проблем, кроме визуальной неоднозначности. Вот мои наблюдения.
Такая тесная связь существует, просто динамический интервал вызывает визуальную неоднозначность.
Теперь, перейдя к решению, самое близкое решение, которое я мог бы предложить без вмешательства JavaScript , хотя и не идеально, это
Ограничьте ширину этого текста, указав максимальную ширину:
Примечание:
text-align: center
только уменьшить влияние недостающего пространства, если вы не имеете строгое требование не идти с этим.Пожалуйста, дайте мне знать, если это отвечает на ваш вопрос.
Вот как будет выглядеть эффект:
источник
Я думаю, что вы почти хороши и упускаете (3), что немного хитрость. Идея состоит в том, чтобы сделать элемент значка шириной равным
0
и отключить все пробелы между текстом и значком сортировки. Для этого я использую дополнительную обертку для текста и убрал использование flexbox.У вас будет некоторое переполнение, но это не проблема, так как вы применяете отступы. Вы также можете увеличить,
padding-right
если вы хотитеисточник
если ваш заголовок не динамический, то я могу легко это исправить.
для этого вам придется сложить последнее слово заголовка и значок SVG в span
например: -html
удалить display: flex из класса .button и присвоить стилю display: inline-block добавленный диапазон
из-за того, что span является встроенным блоком, значок svg никогда не будет в отдельной строке. перед ним будет хотя бы одно слово
источник
Вы можете попробовать вот так:
Надеюсь, что этот ответ будет полезным для вас. Я не сделал CSS для мобильного просмотра!
источник