Keep the first column visible while the table pans horizontally
Aliases: frozen column · row header column · sticky first column
What it is
When a table pans right, the column that says who the row is must not leave with it, or the remaining cells lose their subject. A frozen leading column keeps the name, id, or object title on the left of the viewport and lets only the attribute columns move. It preserves “which record this is.” That job is orthogonal to pinning the header, which preserves column names: one is row identity, the other is column identity.
Why it happens
A row is an object plus a set of attributes. Horizontal panning brings attributes on stage in sequence. Once the object column has gone, attributes become unowned data — the reader has to remember “I am on row three” and reattach incoming numbers to that name. With many rows the hook breaks. Freezing the leading column makes the object name an anchor on the row axis: panning changes which attribute is in view, not which object is being seen. The frozen column has to be the real identifier. Freezing a row number or a status while the name slides away plants the anchor in the wrong place. A wide frozen column eats attribute viewport and shrinks the comparison window, so the anchor should fit the identifier and not a summary as well. If the header is not also pinned, a distant column still has no name — both freezes need to be present, but they are separate mechanisms.
Studying it
On a wide table, ask people to read a named object’s value on a distant column, and to compare two objects on that same distant column. In one condition the leading column leaves; in the other it is frozen. Record mix-ups (A’s value attributed to B) and pans back to the left to re-read the name. Independent variables: row count, identifier length, distance from the leading column to the distant one. Dependent variables: object-identity errors, horizontal round-trip distance. Factor with header pinning to confirm that wrong-column and wrong-row errors really separate.
Where it stops holding
If there are few columns and no horizontal pan, there is nothing to freeze. After a card reflow that already puts the identifier in each card title, there is no sliding subject. Freezing the wrong column (the checkbox, while the name moves) is more confusing than freezing nothing, because a stable left edge implies “the anchor is here” when the anchor is empty. In right-to-left layouts the identifier sits on the visual trailing edge; freeze that leading column, not the physical first column of the markup. Row-spanning merged cells can clip a cross-row name in half when frozen; freeze logical rows, not painted rows.
Applying it
- Name the identifier column and freeze only that; a checkbox may lock with it, but do not freeze the checkbox alone.
- Put a seam between the frozen column and the panning columns so cell content cannot slide under the anchor and be misread.
- If the identifier is long, clip the tail and offer the full string on hover or in detail; do not let the frozen column consume most of the viewport.
- How to check: pan all the way right and ask “who is this row?” If the answer requires panning back, the subject was not frozen.