Нет разрыва между тегами span в th

У меня есть таблица со стрелками сортировки в заголовке таблицы. Каждый элемент th имеет span для текста и span для стрелок сортировки. Я хочу, чтобы текст слева span динамически переносился, а span со стрелками сортировки оставался в правом верхнем углу th.

CSS:

th {
    border: 1px solid black;
}
.sort {
    float: right;
}
.sort-arrow {
    width: 0;
    height: 0;
    border-left: 5px solid transparent;
    border-right: 5px solid transparent;
}
.sort-arrow.asc {
    border-bottom: 5px solid #1F2B39;
    margin-bottom: 4px;
    margin-top: 3px;
}
.sort-arrow.desc {
    border-top: 5px solid #1F2B39;
    margin-top: 4px;
    margin-bottom: 3px;
}

HTML:

<table>
    <thead>
        <tr>
            <th>
                <span>A pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty long text.</span>
                <span class = "sort">
                    <div class = "sort-arrow asc"></div>
                    <div class = "sort-arrow desc"></div>
                </span>
            </th>
            <th>
                <span>Short</span>
                <span class = "sort">
                    <div class = "sort-arrow asc"></div>
                    <div class = "sort-arrow desc"></div>
                </span>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr><td>Test</td><td>Test</td></tr>
        <tr><td>Test</td><td>Test</td></tr>
    </tbody>
</table>

Идентификаторы по-прежнему должны быть уникальными...

CBroe 08.11.2022 11:09

измените id на class , чтобы этот стиль применялся к обоим

MAYUR SANCHETI 08.11.2022 11:21

Изменил id на класс. Это была ошибка копирования/вставки.

Conny Olsson 08.11.2022 11:45
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
3
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Использование position: relative для родителя и position: absolute для детей должно работать. Затем вы можете поместить их, используя top: 0 и right: 0, и они будут помещены в верхний правый угол!

Чтобы иметь перенос текста, просто сделайте ваши контейнеры фиксированной ширины (или с процентами), текст будет переноситься, потому что это естественный способ работы.

И, как сказал @CBroe в комментарии, идентификаторы должны быть уникальными!

Спасибо за ваш ответ! Это сработало с несколькими настройками, но принятый ответ дал мне наименьшие изменения в моем коде.

Conny Olsson 09.11.2022 10:31
Ответ принят как подходящий

Вы можете создать div внутри th и дать этому div отображение гибкости, а для элементов, которые не идут в верхнюю часть th, вы можете использовать vertical-align: top;

th,
td {
  border: 1px solid black;
  vertical-align: top;
  text-align:left;
}

thead,
tbody {
  background: yellow;
}

.row {
  display: flex;
  align-items: flex-start;
}



.sort-arrow {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
}

.sort-arrow.asc {
  border-bottom: 5px solid #1F2B39;
  margin-bottom: 4px;
  margin-top: 3px;
}

.sort-arrow.desc {
  border-top: 5px solid #1F2B39;
  margin-top: 4px;
  margin-bottom: 3px;
}
<table>
  <thead>
    <tr >
      <th>
        <div class = "row">
          <span>A pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty long text.</span>
          <span class = "sort">
                    <div class = "sort-arrow asc"></div>
                    <div class = "sort-arrow desc"></div>
                </span>
        </div>
      </th>
      <th >
      <div class = "row">
        <span>Short</span>
        <span class = "sort">
                    <div class = "sort-arrow asc"></div>
                    <div class = "sort-arrow desc"></div>
                </span>
                </div>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Test</td>
      <td>Test</td>
    </tr>
    <tr>
      <td>Test</td>
      <td>Test</td>
    </tr>
  </tbody>
</table>

Спасибо за ваш ответ! Я попробовал это, а также поставил flex на td, но теперь это больше не структура таблицы. Это просто строки без упорядоченных столбцов.

Conny Olsson 08.11.2022 13:19

Добавил TBODY в мой вопрос.

Conny Olsson 08.11.2022 13:27

только что отредактировал ответ, установив отображение th на flex, испортит структуру таблицы, поэтому создайте div внутри th и вместо этого установите отображение этого div на flex.

jessica-98 08.11.2022 13:48

Обновлено, чтобы показать пример с использованием макета таблицы CSS Grid.

Вы можете легко использовать display: flex с justify-content: space-between. Вы также можете использовать свойство gap, как показано в примере ниже, чтобы добавить пробел между заголовком и стрелками.

table {
  display: grid;
  grid-template-columns: minmax(30ch, auto) 1fr;
}

th,
td {
  border: 1px solid #aaa;
  margin: 0 -1px -1px 0; /* hack to collapse borders */
  padding: 1rem;
}

tr:last-of-type > td {
  border-bottom: 2px solid #aaa;
}

thead,
tbody, 
tr {
  display: contents;
}

.header {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
}

.sort-arrow {
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
}

.sort-arrow.asc {
  border-bottom: 5px solid #1F2B39;
  margin-bottom: 4px;
  margin-top: 3px;
}

.sort-arrow.desc {
  border-top: 5px solid #1F2B39;
  margin-top: 4px;
  margin-bottom: 3px;
}
<table>
  <thead>
    <tr>
      <th>
        <div class = "header">
          <span>A pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty pretty long text.</span>
          <span class = "sort">
            <div class = "sort-arrow asc"></div>
            <div class = "sort-arrow desc"></div>
          </span>
        </div>
      </th>
      <th>
        <div class = "header">
          <span>Short</span>
          <span class = "sort">
            <div class = "sort-arrow asc"></div>
            <div class = "sort-arrow desc"></div>
          </span>
        </div>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Test</td>
      <td>Test</td>
    </tr>
    <tr>
      <td>Test</td>
      <td>Test</td>
    </tr>
  </tbody>
</table>

Спасибо за ваш ответ! Я попробовал это, а также поставил flex на td, но теперь это больше не структура таблицы. Это просто строки без упорядоченных столбцов.

Conny Olsson 08.11.2022 12:48

Добавил TBODY в мой вопрос.

Conny Olsson 08.11.2022 13:26

Другие вопросы по теме