Таблица HTML не отображается правильно при объединении строк соседних столбцов

У меня есть таблица HTML с двумя столбцами и четырьмя строками, и некоторые ячейки объединены, что, по моему мнению, вызывает ошибку рендеринга.

Ниже я показываю код таблицы до слияния, вызывающего проблему:

<!DOCTYPE html>
<html>
  <head>
    <style>
      table {
        border-spacing: 0;
      }
      td {
        border: 1px black solid;
      }
      td {
        width: 300px;
        height: 100px;
        background-color: aqua;
      }
      .no-width {
        width: 0;
        border-width: 0;
        background-color: rgba(0, 0, 0, 0);
      }
    </style>
  </head>
  <body>
    <table>
      <tr>
        <!-- Row 1 -->
        <!-- <td class = "no-width"></td> -->
        <td> Data cells {1, 1} </td>
        <td> Data cells {1, 2} </td>
      </tr>
      <tr>
        <!-- Row 2 -->
        <!-- <td class = "no-width"></td> -->
        <td rowspan = "2"> Data cells {2, 1} and {3, 1} rowspan = "2" </td>
        <td> Data cells {2, 2} </td>
      </tr>
      <tr>
        <!-- Row 3 -->
        <!-- <td class = "no-width"></td> -->
        <td style = "background-color:lightpink;"> Data cells {3, 2} </td>
      </tr>
      <tr>
        <!-- Row 4 -->
        <!-- <td class = "no-width"></td> -->
        <td> Data cells {4, 1} </td>
        <td style = "background-color:lightpink;"> Data cells {4, 2} </td>
      </tr>
    </table>
  </body>
</html>

Ниже показана соответствующая веб-страница. Обратите внимание, что я идентифицирую каждую ячейку данных с помощью кортежей {m, n}, где _m_ и _n_ — индексы строки и столбца соответственно. Обратите внимание, что ячейки {2, 1} и {3, 1} объединены.

Теперь я собираюсь объединить ячейки {3, 2} и {4, 2}, поэтому я добавляю атрибут rowspan="2" для элемента td с именем "Ячейки данных {3, 2}" в строке 3 и удаляю td. с именем «Ячейки данных {4, 2}» в строке 4, что приводит к следующему коду:

<!DOCTYPE html>
<html>
  <head>
    <style>
      table {
        border-spacing: 0;
      }
      td {
        border: 1px black solid;
      }
      td {
        width: 300px;
        height: 100px;
        background-color: aqua;
      }
      .no-width {
        width: 0;
        border-width: 0;
        background-color: rgba(0, 0, 0, 0);
      }
    </style>
  </head>
  <body>
    <table>
      <tr>
        <!-- Row 1 -->
        <!-- <td class = "no-width"></td> -->
        <td> Data cells {1, 1} </td>
        <td> Data cells {1, 2} </td>
      </tr>
      <tr>
        <!-- Row 2 -->
        <!-- <td class = "no-width"></td> -->
        <td rowspan = "2"> Data cells {2, 1} and {3, 1} rowspan = "2" </td>
        <td> Data cells {2, 2} </td>
      </tr>
      <tr>
        <!-- Row 3 -->
        <!-- <td class = "no-width"></td> -->
        <td style = "background-color:lightpink;" rowspan = "2"> 
          Data cells {3, 2} and {4, 2}  rowspan = "2"
        </td>
      </tr>
      <tr>
        <!-- Row 4 -->
        <!-- <td class = "no-width"></td> -->
        <td> Data cells {4, 1} </td>        
      </tr>
    </table>
  </body>
</html>

Обратите внимание: хотя присутствуют все 4 элемента tr, в таблице показаны только 3 строки. Ячейки данных 3-й и 4-й строк фактически выставлены в 3-й, скажем, «визуальной» строке, а 4-я «визуальная» строка не отображается.

Чтобы решить эту проблему, я добавил в таблицу первый «скрытый» столбец, как показано ниже:

<!DOCTYPE html>
<html>
  <head>
    <style>
      table {
        border-spacing: 0;
      }
      td {
        border: 1px black solid;
      }
      td {
        width: 300px;
        height: 100px;
        background-color: aqua;
      }
      .no-width {
        width: 0;
        border-width: 0;
        background-color: rgba(0, 0, 0, 0);
      }
    </style>
  </head>
  <body>
    <table>
      <tr>
        <!-- Row 1 -->
        <td class = "no-width"></td>
        <td> Data cells {1, 1} </td>
        <td> Data cells {1, 2} </td>
      </tr>
      <tr>
        <!-- Row 2 -->
        <td class = "no-width"></td>
        <td rowspan = "2"> Data cells {2, 1} and {3, 1} rowspan = "2" </td>
        <td> Data cells {2, 2} </td>
      </tr>
      <tr>
        <!-- Row 3 -->
        <td class = "no-width"></td>
        <td style = "background-color:lightpink;" rowspan = "2"> 
          Data cells {3, 2} and {4, 2}  rowspan = "2"
        </td>      
      </tr>
      <tr>
        <!-- Row 4 -->
        <td class = "no-width"></td>
        <td> Data cells {4, 1} </td>        
      </tr>
    </table>
  </body>
</html>

Полученные веб-страницы теперь отображаются так, как ожидалось:

В принципе, я думал, что это проблема рендеринга. Я знаю, что каждая строка (<tr>) должна содержать одинаковое количество ячеек данных, чтобы предотвратить ошибки отображения, но эта таблица имеет одинаковое количество элементов <td> в каждой строке, если мы принимаем во внимание диапазоны строк. Однако разные браузеры ведут себя подобным образом, и я отказываюсь верить, что все они используют один и тот же механизм рендеринга, поэтому я пришел к выводу, что мой код неверен. Но что не так? Я не могу этого понять.

Ребята, помогите мне понять, в чем здесь ошибка, пожалуйста? Или это ожидаемое поведение, и мне следует продолжать использовать этот прием, добавляя в таблицу «невидимый» столбец?

Поможет ли быстрое решение, например, добавление высоты строк? тр {высота: 50 пикселей; }

Milan 02.07.2024 17:28

рабочий пример для демонстрации быстрого решения: jsfiddle.net/n9muwk5a

Milan 02.07.2024 17:29

Что касается объяснения, то официальная ссылка на обработку табличной модели — html.spec.whatwg.org/multipage/…

Milan 02.07.2024 17:37

@Милан, ваше быстрое исправление позволило понять, что высота 3-й строки равна нулю из-за отсутствия собственного содержимого. Это так?

Humberto Fioravante Ferro 02.07.2024 19:11

@Милан, как ты заметил, tr{height: 50px;} делает свое дело. Однако tr{min-height: 50px;} этого не делает — знаете почему?

Humberto Fioravante Ferro 02.07.2024 19:39

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

Milan 05.07.2024 10:55
Улучшение производительности загрузки с помощью 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
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот демонстрация того, как ячейки таблицы вписываются в доступные слоты (подробнее об обработке модели таблицы здесь).
ПРИМЕЧАНИЕ. Для строк таблицы задана высота, чтобы можно было видеть диапазон строк.

Я использовал раскраску и отобразил две таблицы в качестве демонстрации.

table {
  border-spacing: 0;
}

tr {
  height: 50px;
}

td {
  border: 1px black solid;
  width: 300px;
  background-color: aqua;
}

.lg {
  background-color: lightgreen;
}

.lp {
  background-color: lightpink;
}
<table>
  <caption>Table 1:</caption>
  <tr>
    <!-- Row 1 -->
    <td> Data cells {1, 1} </td>
    <td> Data cells {1, 2} </td>
  </tr>
  <tr>
    <!-- Row 2 -->
    <td> Data cells {2, 1} </td>
    <td class = "lg" rowspan = "2">Data cells {2, 2} and {3, 2} rowspan = "2" </td>
  </tr>
  <tr>
    <!-- Row 3 -->
    <td class = "lp" rowspan = "2">Data cells {3, 1} and {4, 1} rowspan = "2"
    </td>
  </tr>
  <tr>
    <!-- Row 4 -->
    <td> Data cells {4, 2} </td>
  </tr>
</table>

<table>
  <caption>Table 2:</caption>
  <tr>
    <!-- Row 1 -->
    <td> Data cells {1, 1} </td>
    <td> Data cells {1, 2} </td>
  </tr>
  <tr>
    <!-- Row 2 -->
    <td style = "background-color:lightgreen;" rowspan = "2">Data cells {2, 1} and {3, 1} rowspan = "2" </td>
    <td> Data cells {2, 2} </td>
  </tr>
  <tr>
    <!-- Row 3 -->
    <td style = "background-color:lightpink;" rowspan = "2">Data cells {3, 2} and {4, 2} rowspan = "2" </td>
  </tr>
  <tr>
    <!-- Row 4 -->
    <td> Data cells {4, 1} </td>
  </tr>
</table>

Кроме того, вот изображение выходной страницы (две таблицы примера):

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