Tables
Getting started with displaying tabular data
Resources and tips
-
Get familiar with
HTML element
<table>
and its relatives - Data tables on Inclusive Components also features nifty code examples for description lists.
Mybring’s variety of complex tables creates potentially big and fun challenges. Common classes and shared principles aim to make it easier to get the basics in order fast.
Principles
Tables are content
Which means that they are best presented as tables and not treated as layout. The point of a table is to make tabular data into comprehensible content. It provides meaning through how the data is organised. In terms of table responsiveness they are not malleable like a flex layout because that would degrade their inherent meaning.
Syntax is free
Use table
and related tags. That way, we get a lot for free. We
need less CSS because the structure is already provided. The behaviour is
predictable. Browsers and assistive tech can read the content as-is. Users can
even retain the structure when copying and pasting.
Avoid 100 % width
Big viewports are just as important as small ones. We don’t want the content to truncate uncontrolled and we don’t want it to expand indefinitely. The default table class aims to let the content dictate column width. This means that every table has different width, which makes the content as readable as possible because the spacings are always the same. We can combine it with min- and max-widths and/or different wrap properties to control the size and scaling so we avoid ultra-wide columns that are hard to read.
Except …
Setting a 100 % width can still make sense in cases where the table has very few columns and is placed inside a box or in conjunction with other width-limited content. That usually means the table is part of a bigger layout and not the main interface itself.
Class reference
Class | Element | Functionality |
---|---|---|
mb-table | table | Provides the basic styling to the entire table |
mb-table__sticky-top | table | Makes the thead element sticky.
See example
|
mb-table__sticky-left | table | Makes the th elements inside tbody
sticky.
See example
|
mb-table__sort | th | Provides hover/focus styling for sorting headers |
mb-table__sort--by | th | Indicates the sorting column |
mb-table__row--clickable | tr | Indicates functionality on hover |
mb-table__row--selected | tr | Marks row as selected |
mb-table__row--inactive | tr | Marks row as inactive |
mb-table__cell--icon | td | Adjusts cell padding to prevent increased row height when using regular sized icons |
mb-table__cell--iconm | td | Adjusts cell padding to prevent increased row height when using medium sized icons |
mb-table__cell--btn-link | td | Adjusts cell padding to prevent increased row height when using btn-link component |
scrollshade-h | parent of table | Adds the vertical shadow at each side when tables scroll/overflow |
mb-dlist | parent of dl | Styles a description list similar to the table, useful when media querying between a simple table and a description list |
Examples
Base table
The mb-table
class is the core of the table component. It
provides styling for headers, footers, rows, columns and cells.
Reference
mb-table
Shipment | Recipient | Sent |
---|---|---|
987654321 | Acme Industries | 14.07.2016 12.56 |
123456789 | Burgers and Beauty as | 26.06.2016 14.12 |
456789123 | Rent-A-Cat Co. | 02.05.2016 11.38 |
<table class="mb-table">
<thead>
<tr>
<th>Shipment</th>
<th>Recipient</th>
<th>Sent</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#">987654321</a></td>
<td>Acme Industries</td>
<td>14.07.2016 12.56</td>
</tr>
<tr>
<td><a href="#">123456789</a></td>
<td>Burgers and Beauty as</td>
<td>26.06.2016 14.12</td>
</tr>
<tr>
<td><a href="#">456789123</a></td>
<td>Rent-A-Cat Co.</td>
<td>02.05.2016 11.38</td>
</tr>
</tbody>
</table>
Row header
Pay attention to the th
tags and scope
attributes.
Customer | Key | Service |
---|---|---|
Acme Industries 12345678910 | 64defd07-8ce1-438d-a3c5-9ffaa9563797 | Supply Base Services |
Burgers and Beauty as 10987654321 | df021eaf-24c1-4436-b55d-11e5f14e22fe | Parcels |
Rent-A-Cat Co. 01234567891 | 2c55f310-eaa4-46a5-869a-24c974dfdf03 | Cargo |
<table class="mb-table">
<thead>
<tr>
<th>Customer</th>
<th>Key</th>
<th>Service</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Acme Industries
<span class="db text-0.875r fwn">12345678910</span>
</th>
<td>64defd07-8ce1-438d-a3c5-9ffaa9563797</td>
<td>Supply Base Services</td>
</tr>
<tr>
<th scope="row">Burgers and Beauty as
<span class="db text-0.875r fwn">10987654321</span>
</th>
<td>df021eaf-24c1-4436-b55d-11e5f14e22fe</td>
<td>Parcels</td>
</tr>
<tr>
<th scope="row">Rent-A-Cat Co.
<span class="db text-0.875r fwn">01234567891</span>
</th>
<td>2c55f310-eaa4-46a5-869a-24c974dfdf03</td>
<td>Cargo</td>
</tr>
</tbody>
</table>
Footer
Shipment | Recipient | Parcels |
---|---|---|
987654321 | Acme Industries | 2 |
123456789 | Burgers and Beauty as | 43 |
456789123 | Rent-A-Cat Co. | 1 |
Total | 46 |
<table class="mb-table">
<thead>
<tr>
<th>Shipment</th>
<th>Recipient</th>
<th class="tr">Parcels</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#">987654321</a></td>
<td>Acme Industries</td>
<td class="tr">2</td>
</tr>
<tr>
<td><a href="#">123456789</a></td>
<td>Burgers and Beauty as</td>
<td class="tr">43</td>
</tr>
<tr>
<td><a href="#">456789123</a></td>
<td>Rent-A-Cat Co.</td>
<td class="tr">1</td>
</tr>
</tbody>
<tfoot>
<tr>
<th scope="row">Total</th>
<td></td>
<td class="tr">46</td>
</tr>
</tfoot>
</table>