Обрезать диапазон внутри td

Я использую классы Materialize для создания «заполнителя для фотографий» для пользователя, который содержит первую букву его имени.

У меня проблемы с длинными именами внутри тега <td>. Я не хочу, чтобы имя ломалось, когда оно слишком длинное. Из-за этого я попытался применить class = "truncate" к спаму, содержащему имя, но его не удалось обрезать.

Как я могу это решить?

main {
  padding: 16px;
}

table {
  table-layout: fixed;
}

td {
  width: 33.33%;
}

.photo-placeholder {
  width: 40px;
  height: 40px;
  line-height: 40px;
  border-radius: 50%;
  text-align: center;
  display: inline-block;
  background-color: crimson;
  color: white;
}

.truncate {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>

<main>

  <table id = "table1" class = "white z-depth-1 centered">
    <thead>
      <tr>
        <th>Col 1</th>
        <th>Col 2</th>
        <th>Col 3</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td data-label = "Col 1">
          <span class = "photo-placeholder">P</span>
          <span class = "truncate">Pedro Luis Arend Gonçalves</span>
        </td>
        <td data-label = "Col 2">Info 2</td>
        <td data-label = "Col 3">Info 3</td>
      </tr>
    </tbody>
  </table>

</main>

JSFiddle

Ожидаемый результат:

Обрезать диапазон внутри td

Текст кажется усеченным, когда он длиннее своего контейнера <td>. Вы хотите, чтобы это работало по-другому? Можете ли вы помочь уточнить желаемую функциональность и/или проблему?

showdev 29.05.2019 15:13

Теперь я добавил изображение того, как я хочу, чтобы результат был похож. Имя должно быть сбоку от «заполнителя фотографии» и при необходимости обрезаться внутри td.

Pedro Gonçalves 29.05.2019 15:16

Вы объявили display в truncate как block, что означает, что он переместится на следующую строку в паре с photo-placeholder, который объявлен с display: inline-block.

Heretic Monkey 29.05.2019 15:18

Я только что сделал две вещи и работал нормально. 1- добавить float слева к диапазону фото-заполнителя 2- добавить эти свойства к .truncate span margin-left: 25%; обивка верха: 4%;

Junaid Ali 29.05.2019 15:24
Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
0
4
604
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Убедитесь, что для элемента установлено правило стиля width или max-width. В противном случае, пока есть место для роста, он будет занимать это место. Добавление правила стиля max-width: 50px; помогло мне в вашем примере.

Ответ принят как подходящий

Похоже, что класс «truncate» устанавливает для элемента значение display:block, что помещает его в отдельную строку.

Одним из решений может быть установка его на display:inline-block и установка его ширины на оставшееся пространство в ячейке таблицы. Ниже я рассчитал подходящую ширину, используя calc(). Я также удалил пустое пространство между двумя элементами <span>, чтобы оно не увеличивало ширину.

main {
  padding: 16px;
}

table {
  table-layout: fixed;
}

td {
  width: 33.33%;
}

.photo-placeholder {
  width: 40px;
  height: 40px;
  line-height: 40px;
  border-radius: 50%;
  text-align: center;
  display: inline-block;
  background-color: crimson;
  color: white;
}

#table1 .truncate {
  display: inline-block;
  width: calc(100% - 40px);
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>

<main>

  <table id = "table1" class = "white z-depth-1 centered">
    <thead>
      <tr>
        <th>Col 1</th>
        <th>Col 2</th>
        <th>Col 3</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td data-label = "Col 1">
          <span class = "photo-placeholder">P
          </span><span class = "truncate">Pedro Luis Arend Gonçalves</span>
        </td>
        <td data-label = "Col 2">Info 2</td>
        <td data-label = "Col 3">Info 3</td>
      </tr>
    </tbody>
  </table>

</main>

Чтобы не вычислять ширину, вы можете просто float оставить заполнитель слева, вот так:

main {
  padding: 16px;
}

table {
  table-layout: fixed;
}

td {
  width: 33.33%;
}

.photo-placeholder {
  float: left;
  width: 40px;
  height: 40px;
  line-height: 40px;
  border-radius: 50%;
  text-align: center;
  background-color: crimson;
  color: white;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>

<main>

  <table id = "table1" class = "white z-depth-1 centered">
    <thead>
      <tr>
        <th>Col 1</th>
        <th>Col 2</th>
        <th>Col 3</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td data-label = "Col 1">
          <span class = "photo-placeholder">P</span>
          <span class = "truncate">Pedro Luis Arend Gonçalves</span>
        </td>
        <td data-label = "Col 2">Info 2</td>
        <td data-label = "Col 3">Info 3</td>
      </tr>
    </tbody>
  </table>

</main>

Вот другой метод, использующий контейнер флексбокс. Мне нравится этот, потому что проще центрировать два элемента по вертикали с помощью align-items:center.

main {
  padding: 16px;
}

table {
  table-layout: fixed;
}

td {
  width: 33.33%;
}

.photoContent {
  display: flex;
  align-items: center;
}

.photo-placeholder {
  flex: 0 0 40px;
  height: 40px;
  line-height: 40px;
  border-radius: 50%;
  text-align: center;
  background-color: crimson;
  color: white;
  margin: 0 0.5em 0 0;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>

<main>

  <table id = "table1" class = "white z-depth-1 centered">
    <thead>
      <tr>
        <th>Col 1</th>
        <th>Col 2</th>
        <th>Col 3</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td data-label = "Col 1">
          <div class = "photoContent">
            <span class = "photo-placeholder">P</span>
            <span class = "truncate">Pedro Luis Arend Gonçalves</span>
          </div>
        </td>
        <td data-label = "Col 2">Info 2</td>
        <td data-label = "Col 3">Info 3</td>
      </tr>
    </tbody>
  </table>

</main>

Оно работает! Но имя стало немного странным, не так ли? Я заметил, что если я разорву строку между тегами <span>, она сделает то же самое, что и display:block.

Pedro Gonçalves 29.05.2019 15:28

Вероятно, это из-за пробела между двумя элементами. Из-за способа вычисления ширины усеченного элемента общая ширина двух элементов плюс это пустое пространство превышает 100% ширины контейнера, а второй элемент переносится на следующую строку. Вот почему я удалил пробел между двумя элементами в своем первом примере.

showdev 29.05.2019 15:30

Скрипка Попробуйте добавить следующий CSS:

.photo-placeholder {
  margin: 10px;
  min-width: 40px;
}

table.centered tbody tr td:first-child {
  display: flex;
  width: 100%;
  align-items: center;
  justify-content: center;
}

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