# Table column N established by element “td” has no cells beginning in it.

> Canonical HTML version: https://rocketvalidator.com/html-validation/table-column-n-established-by-element-td-has-no-cells-beginning-in-it
> Attribution: Rocket Validator (https://rocketvalidator.com)
> License: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

When browsers build a table's internal grid, each cell occupies one or more column slots. A cell with `colspan="3"` occupies three column slots, and columns are established based on the maximum number of slots any row uses. The validator checks that every column position in this grid has at least one cell whose starting position is in that column. If a column exists only because other cells span across it — but no cell ever *begins* there — the validator raises this warning.

This is a problem for several reasons:

- **Accessibility**: Screen readers use the table grid model to navigate cells and announce column headers. An empty or orphaned column confuses this navigation, making the table harder to understand for assistive technology users.
- **Standards compliance**: The HTML specification defines a precise table model. A column with no originating cell suggests a structural error in the table's markup.
- **Rendering inconsistencies**: Different browsers may handle these orphaned columns differently, leading to unpredictable layouts.

The most common causes are:

1. **Excessive `colspan` values** — a cell spans more columns than intended, creating extra columns that other rows don't fill.
2. **Missing cells in a row** — a row has fewer cells than the table's column count, leaving trailing columns empty.
3. **Incorrect `rowspan` calculations** — a cell spans rows, but subsequent rows still include cells for that column position, pushing other cells into non-existent columns or leaving gaps.

To fix the issue, count the total number of columns your table should have, then verify that every row's cells (accounting for `colspan` and active `rowspan` from previous rows) add up to exactly that number. Ensure each column position has at least one cell starting in it across all rows.

## Examples

### Incorrect: `colspan` creates a column no cell begins in

In this example, the first row establishes 3 columns. The second row spans all 3 with `colspan="3"`. The third row only has 2 cells, so column 3 has no cell beginning in it.

```html
<table>
  <tr>
    <th>Name</th>
    <th>Role</th>
    <th>Status</th>
  </tr>
  <tr>
    <td colspan="3">Team Alpha</td>
  </tr>
  <tr>
    <td>Alice</td>
    <td>Developer</td>
    <!-- Column 3 has no cell beginning here -->
  </tr>
</table>
```

### Fixed: every row accounts for all columns

```html
<table>
  <tr>
    <th>Name</th>
    <th>Role</th>
    <th>Status</th>
  </tr>
  <tr>
    <td colspan="3">Team Alpha</td>
  </tr>
  <tr>
    <td>Alice</td>
    <td>Developer</td>
    <td>Active</td>
  </tr>
</table>
```

### Incorrect: excessive `colspan` creates extra columns

Here, the second row's `colspan="4"` establishes 4 columns, but no other row has a cell starting in column 4.

```html
<table>
  <tr>
    <th>Q1</th>
    <th>Q2</th>
    <th>Q3</th>
  </tr>
  <tr>
    <td colspan="4">Full year summary</td>
  </tr>
  <tr>
    <td>100</td>
    <td>200</td>
    <td>300</td>
  </tr>
</table>
```

### Fixed: `colspan` matches the actual column count

```html
<table>
  <tr>
    <th>Q1</th>
    <th>Q2</th>
    <th>Q3</th>
  </tr>
  <tr>
    <td colspan="3">Full year summary</td>
  </tr>
  <tr>
    <td>100</td>
    <td>200</td>
    <td>300</td>
  </tr>
</table>
```

### Incorrect: `rowspan` causes a missing cell origin

The `rowspan="2"` on "Alice" means the second row already has column 1 occupied. But the second row only provides one cell, leaving column 3 without a beginning cell in any row except the header.

```html
<table>
  <tr>
    <th>Name</th>
    <th>Task</th>
    <th>Hours</th>
  </tr>
  <tr>
    <td rowspan="2">Alice</td>
    <td>Design</td>
    <td>8</td>
  </tr>
  <tr>
    <td>Code</td>
    <!-- Column 1 is occupied by rowspan; column 3 has no cell -->
  </tr>
</table>
```

### Fixed: the spanned row includes the right number of cells

Since `rowspan="2"` on column 1 carries into the next row, that row only needs cells for columns 2 and 3.

```html
<table>
  <tr>
    <th>Name</th>
    <th>Task</th>
    <th>Hours</th>
  </tr>
  <tr>
    <td rowspan="2">Alice</td>
    <td>Design</td>
    <td>8</td>
  </tr>
  <tr>
    <td>Code</td>
    <td>6</td>
  </tr>
</table>
```

A good practice is to sketch out your table grid on paper or in a spreadsheet before writing the HTML. Label each column slot and verify that every row fills all slots — either with a new cell or with a `rowspan` carry-over from a previous row. This makes it much easier to catch mismatched `colspan` and `rowspan` values before they cause validation errors.
