Colspan для полустолбцов в нескольких строках

Я хотел бы использовать colspan для создания нескольких полустолбцов. Чтобы проиллюстрировать это с помощью:

Я пробовал с этим кодом, я смог сделать один из двух полустолбцов, но не другой...

table, th, td {
  border: 1px solid black;
}
  <table>
    <tr>
      <th></th>
      <th colspan = "1">Test</th>
      <th colspan = "2">Test</th>
      <th colspan = "2">Test</th>
      <th colspan = "1">Test</th>
    </tr>
    <tr>
      <td></td>
      <th colspan = "4">Test</th>
      <th colspan = "2">Test</th>
    </tr>
    <tr>
      <td></td>
      <th colspan = "2">Test</th>
      <th colspan = "4">Test</th>
    </tr>
  </table>

Можно ли этого добиться, да еще и с бОльшим числом полустолбиков?

Ваши данные на самом деле табличные? Если нет, возможно, лучше стилизовать это с помощью сетки.

A Haworth 18.04.2023 21:08

@AHaworth мои данные не совсем табличные, но я решил использовать таблицу и colspan, чтобы не выполнять все вычисления ширины для каждого элемента...

Louis de Bussac 18.04.2023 21:15

Используйте CSS Grid или другой метод компоновки, если данные не табличные. Не используйте таблицы для макета.

Sean 18.04.2023 22:16

У вас также не должно быть так много ячеек заголовков таблицы. Это проблема доступности. Если все, что вам нужно, это смелый стиль, используйте <b>.

isherwood 18.04.2023 22:50

Вам не нужно делать все расчеты, используйте, например, CSS сетка. К таблице HTML привязана семантика, поэтому избегайте ее, если ваши данные не являются табличными, чтобы облегчить доступность (если только это не требуется, например, для некоторых почтовых клиентов).

A Haworth 19.04.2023 02:25
Улучшение производительности загрузки с помощью 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
5
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, можно это сделать, если вы ПРАВИЛЬНО вычисляете количество столбцов/ячеек в каждой строке. И каждая строка имеет одинаковое количество столбцов/ячеек.

Я посмотрел на фотографию вверху и перевел это как 8 столбцов, а не 6, как вы.

И это дало бы это:

th {
  background: pink;
  margin: 3px;
}
<table>
  <tr>
    <th colspan = "2">Test</th>
    <th colspan = "2">Test</th>
    <th colspan = "2">Test</th>
    <th colspan = "2">Test</th>
  </tr>
  <tr>
    <th colspan = "5">Test</th>
    <th colspan = "3">Test</th>
  </tr>
  <tr>
    <th colspan = "3">Test</th>
    <th colspan = "5">Test</th>
  </tr>
</table>

Также нет смысла загромождать таблицу пустыми столбцами/ячейками.

ОБНОВЛЯТЬ Странно, интересно, это особенность рендеринга браузера.

После добавления начальных отдельных ячеек все работает. Это заставляет меня задаться вопросом, пересчитывает ли браузер количество столбцов перед рендерингом...

.onepixelrow {
  height: 1px;
  overflow: hidden;
}

th {
  height: 1px;
  border: none;
}
<table>
  <tbody>
    <tr class = "onepixelrow">
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
      <th>&nbsp;</th>
    </tr>
    <tr>
      <td colspan = "2">Test</td>
      <td colspan = "2">Test</td>
      <td colspan = "2">Test</td>
      <td colspan = "2">Test</td>
    </tr>
    <tr>
      <td colspan = "5">Test</td>
      <td colspan = "3">Test</td>
    </tr>
    <tr>
      <td colspan = "3">Test</td>
      <td colspan = "5">Test</td>
    </tr>
  </tbody>
</table>

С вашим кодом ни один из двух полустолбцов не работает, проблема остается той же...

Louis de Bussac 18.04.2023 21:59

Я обновил ответ, чтобы показать, что он работает, и логика верна, я был потрясен, увидев, что он не работал, пока я не добавил отдельные ячейки, действительно странно!

Zeddy 18.04.2023 22:17

С отдельными ячейками вверху все работает, спасибо! Знаете ли вы, как их скрыть (со скрытым атрибутом ячейки возвращаются в нехорошее положение...)

Louis de Bussac 18.04.2023 22:27
<tr> элементы не могут быть прямыми дочерними элементами <table>. Пожалуйста, добавьте <tbody> между ними.
InSync 18.04.2023 22:31

Я снова обновил его, добавив стили для вашей верхней строки и инкапсулировав строки таблицы в тег тела таблицы, как рекомендовано InSync.

Zeddy 18.04.2023 22:46
Ответ принят как подходящий

Хотя вы уже приняли ответ на этот вопрос, стоит повторить комментарии к вашему вопросу: таблицы не следует использовать для целей макета. Для этого есть гораздо лучшие инструменты.

С этой целью я хочу предложить еще два решения; один использует гибкий макет, а другой использует сетку:

*,::before,::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

section {
  border: 2px solid hsl(300deg 85% 70% / 1);
  /* setting the inline-size of the element, the size of the
     element on the inline-axis (the axis upon which inline
     content is placed), using the clamp() function to
     set a minimum size of 30rem, a maximum size of 900px and
     a preferred size of 60%: */
  inline-size: clamp(30rem, 60%, 900px);
  /* setting a margin after the element, on the block axis (the
     axis perpendicular to the inline, on which blocks are laid
     out): */
  margin-block-end: 1rem;
  /* centering the element on the inline axis: */
  margin-inline: auto;
  /* setting all padding on the element: */
  padding: 0.25rem;
}

.grid {
  display: grid;
  /* defining eight columns, each of which is one
     fraction of the available space: */
  grid-template-columns: repeat(8, 1fr);
}

.flex {
  display: flex;
  /* setting both:
       flex-direction: row;
       flex-wrap: wrap;
     using the shorthand 'flex-flow' property */
  flex-flow: row wrap;
}

span {
  background-color: hsl(200deg 80% 70% / 1);
  block-size: 2rem;
  border: 1px solid #000;
  /* defining the base size of the <span> elements to be
     25% of the size of their parent: */
  flex-basis: 25%;
  /* allowing the <span> elements to grow to fill available
     space: */
  flex-grow: 1;
  /* setting all <span> elements to span two grid-columns: */
  grid-column: span 2;
  text-align: center;
}

span:nth-child(odd) {
  background-color: hsl(200deg 80% 70% / 0.5);
}

.hero {
  background-color: hsl(300deg 80% 70% / 0.5);
  /* preventing the .hero elements from expanding, forcing
     them to take their assigned size, and allowing sibling
     elements to expand to fill any space leftover (this
     is only for elements inside of a flex layout): */
  flex-grow: 0;
}

/* within the .grid parent, the .heroAdjacent elements
   will span 3 grid-columns: */
.grid .heroAdjacent {
  grid-column: span 3;
}

/* within the .grid parent the .hero elements will
   span 5 columns: */
.grid .hero {
  grid-column: span 5;
}

.flex .hero {
   /* within the .flex parent the .hero items will have a base
      size of 62.5%: */
  flex-basis: 62.5%;
}
<section class = "grid">
  <span>01</span>
  <span>02</span>
  <span>03</span>
  <span>04</span>
  <span class = "hero">05</span>
  <!-- unfortunately, I couldn't find a selector to reliably select
       the elements that are immediately before a ".hero" element,
       so I chose to use the ".heroAdjacent" class-name (though this
       is no more work than specifying colspan in the event of
       using a <table> -->
  <span class = "heroAdjacent">06</span>
  <span class = "heroAdjacent">07</span>
  <span class = "hero">08</span>
</section>

<section class = "flex">
  <span>01</span>
  <span>02</span>
  <span>03</span>
  <span>04</span>
  <span class = "hero">05</span>
  <span>06</span>
  <span>07</span>
  <span class = "hero">08</span>
</section>

Демонстрация JS Fiddle.

Использованная литература:

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