Я хотел бы использовать 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>
Можно ли этого добиться, да еще и с бОльшим числом полустолбиков?
@AHaworth мои данные не совсем табличные, но я решил использовать таблицу и colspan, чтобы не выполнять все вычисления ширины для каждого элемента...
Используйте CSS Grid или другой метод компоновки, если данные не табличные. Не используйте таблицы для макета.
У вас также не должно быть так много ячеек заголовков таблицы. Это проблема доступности. Если все, что вам нужно, это смелый стиль, используйте <b>
.
Вам не нужно делать все расчеты, используйте, например, CSS сетка. К таблице HTML привязана семантика, поэтому избегайте ее, если ваши данные не являются табличными, чтобы облегчить доступность (если только это не требуется, например, для некоторых почтовых клиентов).
Да, можно это сделать, если вы ПРАВИЛЬНО вычисляете количество столбцов/ячеек в каждой строке. И каждая строка имеет одинаковое количество столбцов/ячеек.
Я посмотрел на фотографию вверху и перевел это как 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> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </th>
<th> </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>
С вашим кодом ни один из двух полустолбцов не работает, проблема остается той же...
Я обновил ответ, чтобы показать, что он работает, и логика верна, я был потрясен, увидев, что он не работал, пока я не добавил отдельные ячейки, действительно странно!
С отдельными ячейками вверху все работает, спасибо! Знаете ли вы, как их скрыть (со скрытым атрибутом ячейки возвращаются в нехорошее положение...)
<tr>
элементы не могут быть прямыми дочерними элементами <table>
. Пожалуйста, добавьте <tbody>
между ними.
Я снова обновил его, добавив стили для вашей верхней строки и инкапсулировав строки таблицы в тег тела таблицы, как рекомендовано InSync.
Хотя вы уже приняли ответ на этот вопрос, стоит повторить комментарии к вашему вопросу: таблицы не следует использовать для целей макета. Для этого есть гораздо лучшие инструменты.
С этой целью я хочу предложить еще два решения; один использует гибкий макет, а другой использует сетку:
*,::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>
Использованная литература:
Ваши данные на самом деле табличные? Если нет, возможно, лучше стилизовать это с помощью сетки.