- Success Criterion 1.3.1
- Conformance level A
Data Grid Built From Divs Instead of Real Table Markup
1.3.1 — Info and Relationships
Scenario
Setting
A food delivery app's restaurant menu
What’s wrong
Data presented visually as a table (CSS grid / div rows and columns) with no table semantics — never announced as a table.
Example
<div class="menu-grid">
<div>Margherita Pizza</div><div>$14</div><div>800 cal</div>
<div>Caesar Salad</div><div>$9</div><div>350 cal</div>
</div> Why it matters
A screen reader user hears six unrelated lines in a row, never learning that price and calories both belong to Margherita Pizza.
How to test
Inspect a visual grid of cards/data in DevTools: if it's built from divs with no table/grid ARIA role, a screen reader announces it as plain unstructured text.
How to fix
CSS grid can visually align rows and columns, but only real table markup announces them as related.
<table>
<tr><th>Dish</th><th>Price</th><th>Calories</th></tr>
<tr><td>Margherita Pizza</td><td>$14</td><td>800 cal</td></tr>
<tr><td>Caesar Salad</td><td>$9</td><td>350 cal</td></tr>
</table> Outcome
Browsing the menu, a diner hears price and calories tied to each dish instead of stray numbers.
Who is affected
Screen reader users browsing the menu can't connect a dish's name to its price or calorie count.
Learn more
- Understanding Understanding document (opens in a new tab)
Related scenarios
- Text Styled to Look Like a Heading Instead of Coded as One
- Text Columns Faked With Spaces Instead of Real Table Markup
- Table Layout Faked With Spaces Instead of Real Table Code
- Clickable Div Acting as a Link Button With No Real Role
- Structural HTML Tags Used Purely for Visual Styling
- Layout-Only Table Wrongly Coded With Real Header Cells