CSS Table Display Layouts and Anonymous Box Generation
When applying display: table-cell to an element without explicit table or row parents, browsers automatically generate anonymous wrapper boxes to satisfy the CSS Table Model's three-tier structure requirement. This implicit box creation forms an anonymous table and table-row around the cell, establishing the necessary formatting context without additional markup.
Consider these equivalent structures:
<!-- Implicit wrappers -->
<div class="data-cell">Content</div>
<style>
.data-cell { display: table-cell; }
</style>
<!-- Browser-generated equivalent -->
<div style="display: table;">
<div style="display: table-row;">
<div class="data-cell">Content</div>
</div>
</div>
Similarly, when placing block-level children directly inside a table container:
<div style="display: table;">
<p>First paragraph</p>
<p>Second paragraph</p>
</div>
The browser wraps both paragraphs within an anonymous table-row and anonymous table-cell to maintain structural integrity.
Dimensional Relationships
Width Propagation
The interplay between table-layout algorithms and explicit sizing creates distinct behaviors:
Automatic Layout (table-layout: auto)
- When the table lacks explicit width, it collapses to fit its contents, constrained by the containing block
- If the table has explicit width but content requires more space, the minimum content width takes precedence over the declared value
- Cell widths with explicit values influence the final table width unless constrained by parent containers
Fixed Layout (table-layout: fixed)
- The table respects explicit width declarations strictly
- Available space distributes equal among columns lacking explicit widths
- Explicit cell widths are honored, potentially causing overflow if their sum exceeds the table width
Height Synchronization
All cells within a single table-row inherently share identical heights. The row expands vertically to accommodate the tallest cell's content, automatically equalizing column heights without JavaScript or additional markup.
Vertical Alignment Mechanics
Within table cells, vertical-align controls content positioning relative to the cell's vertical axis rather than the baseline alignment used in inline contexts. Setting this property to middle centers content vertically with in the available cell height.
Practical Layout Patterns
Fluid Two-Column Layout
Combine floated fixed-width elements with table-cell displays to create adaptive sidebars:
.sidebar {
float: left;
width: 200px;
background: #f0f0f0;
}
.content {
display: table-cell;
width: 100%;
padding: 20px;
}
<div class="wrapper">
<aside class="sidebar">Navigation</aside>
<main class="content">Main content area expands to fill remaining space</main>
</div>
Equal-Width Columns
Fixed table layout eliminates calculation requirements for uniform distribution:
.grid-container {
display: table;
table-layout: fixed;
width: 100%;
border-collapse: separate;
border-spacing: 10px;
}
.grid-unit {
display: table-cell;
background: #e0e0e0;
padding: 15px;
}
<div class="grid-container">
<div class="grid-unit">Column A</div>
<div class="grid-unit">Column B</div>
<div class="grid-unit">Column C</div>
</div>
Intrinsic Equal Heights
Table-row display creates natural height matching:
.match-height {
display: table-row;
}
.column {
display: table-cell;
width: 50%;
border: 1px solid #ccc;
padding: 10px;
}
<div class="match-height">
<div class="column">Short content</div>
<div class="column">Tall content that extends across multiple lines and determines the row height</div>
</div>
Vertical Centering
Reliable vertical alignment without flexbox:
.center-wrapper {
display: table-cell;
height: 250px;
width: 400px;
vertical-align: middle;
text-align: center;
border: 2px solid #333;
}
<div class="center-wrapper">
<div class="centered-content">
Perfectly centered content
</div>
</div>
Constraint Behaviors
Elements with display: table-cell or display: table-row ignore horizontal margins—these properties compute to zero regardless of declared values. Furthermore, width declarations on table-row elements have no effect; row dimensions derive exclusively from the parent table width and the collective requirements of child cells.