How to create table with different number of cells in the rows?
Categories:
Crafting HTML Tables with Variable Row Cell Counts

Explore techniques to create HTML tables where rows can have different numbers of cells, addressing common layout challenges and ensuring accessibility.
HTML tables are primarily designed for displaying tabular data, where each row typically has the same number of columns. However, there are scenarios where you might need a table-like structure with rows containing a varying number of cells. This article delves into methods for achieving this, focusing on semantic HTML and CSS best practices, while also highlighting potential pitfalls and accessibility considerations.
Understanding the Challenge: HTML Table Structure
The fundamental structure of an HTML <table>
element relies on <tr>
(table row) elements, each containing <td>
(table data) or <th>
(table header) cells. By default, browsers render these cells to align neatly, assuming a consistent column count across all rows. Deviating from this can lead to unexpected layouts or accessibility issues if not handled correctly.
flowchart TD A[Start] --> B{Need Variable Cells?} B -->|No| C[Standard HTML Table] B -->|Yes| D{Data is Tabular?} D -->|No| E[Consider CSS Grid/Flexbox] D -->|Yes| F[Use colspan/rowspan] F --> G[Ensure Accessibility] G --> H[End] C --> H
Decision flow for handling variable cell counts in HTML layouts.
Method 1: Using colspan
and rowspan
Attributes
The colspan
and rowspan
attributes are the standard HTML mechanisms for making a single cell span across multiple columns or rows, respectively. This is the most semantically correct way to achieve a variable cell count within a true HTML table, as it explicitly defines how cells relate to the table's grid.
<table border="1">
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
</tr>
<tr>
<td>Data A1</td>
<td colspan="2">Data A2 spanning two columns</td>
</tr>
<tr>
<td>Data B1</td>
<td>Data B2</td>
<td>Data B3</td>
</tr>
<tr>
<td rowspan="2">Data C1 spanning two rows</td>
<td>Data C2</td>
<td>Data C3</td>
</tr>
<tr>
<td>Data D2</td>
<td>Data D3</td>
</tr>
</table>
HTML table demonstrating colspan
and rowspan
for variable cell layouts.
colspan
or rowspan
, always ensure that the total number of 'effective' columns (or rows) in each section remains consistent. For example, if a row has 3 columns, and one cell uses colspan="2"
, the row should then only have two <td>
elements (one normal, one spanning two).Method 2: CSS Grid or Flexbox for Non-Tabular Layouts
If your data is not strictly tabular (i.e., it's not truly a spreadsheet-like grid of related data points), then using HTML <table>
elements might be semantically incorrect. In such cases, CSS Grid or Flexbox provide powerful and flexible ways to create grid-like layouts with varying numbers of 'cells' (which would be <div>
elements or similar) per 'row' (another <div>
acting as a container).
<div class="grid-container">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item full-width">Item 3 (full width)</div>
<div class="grid-item">Item 4</div>
<div class="grid-item">Item 5</div>
</div>
HTML structure for a CSS Grid layout.
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3 equal columns */
gap: 10px;
border: 1px solid #ccc;
padding: 10px;
}
.grid-item {
background-color: #f0f0f0;
padding: 15px;
text-align: center;
border: 1px solid #eee;
}
.full-width {
grid-column: 1 / -1; /* Spans all columns */
}
CSS Grid styling to create variable 'row' layouts.
<div>
elements with CSS Grid/Flexbox for truly tabular data can harm accessibility. Screen readers rely on the semantic structure of <table>
elements to convey relationships between headers and data cells. Only use CSS layout methods when the content is not inherently tabular.Accessibility Considerations
Regardless of the method chosen, accessibility is paramount. For true tables using colspan
and rowspan
:
- Use
<th>
for headers: Clearly define row and column headers. - Scope attributes: Use
scope="col"
andscope="row"
on<th>
elements to explicitly link headers to their respective data cells. - Caption and Summary: Provide a
<caption>
for the table and, if necessary, asummary
attribute (thoughsummary
is deprecated in HTML5, a descriptive paragraph before the table can serve a similar purpose).
For non-tabular layouts using CSS Grid/Flexbox, ensure that the visual order matches the logical reading order and that relationships between elements are clear through other means (e.g., ARIA attributes if absolutely necessary, but prefer semantic HTML).
1. Assess Data Type
Determine if your data is truly tabular (e.g., a spreadsheet) or if it's a collection of related items that merely need a grid-like visual layout.
2. Choose the Right Tool
For tabular data with varying cell counts, use <table>
with colspan
and rowspan
. For non-tabular data needing a flexible grid, opt for CSS Grid or Flexbox with <div>
elements.
3. Implement and Test
Write your HTML and CSS. Thoroughly test the layout across different browsers and screen sizes. Crucially, test with screen readers to ensure accessibility and correct interpretation of your content.