Responsive Design in Tables
The journey of responsive design is always full of experimentation and fun. The most important challenge is to provide an application that works on all screen sizes.
In this article, we will make a table responsive keeping some best UI/UX approaches in mind.
Problem
When we have many rows and columns inside a table, browser introduces a horizontal scrollbar on small-screen devices which affects the User experience. There are many options to solve this issue:
- Decreasing font-size on small screens : It fails as it also affects
visibility
. - Hiding some columns and rows which are not much important: It fails as any
loss of information
is not a good idea.
Approach
There can be other approaches to solve this issue, but the best way can be to do this with CSS
only.
Writing basic HTML and CSS for table.
<table>
<thead>
<tr>
<th>Year</th>
<th>First Name</th>
<th>Last Name</th>
<th>Section</th>
<th>Roll number</th>
<th>Marks</th>
<th>Position</th>
<th>Discipline</th>
<th>Sports</th>
<th>Weight</th>
<th>Height</th>
<th>Attendance</th>
</tr>
</thead>
<tbody>
<tr>
<th>Ist</th>
<td>Foo</td>
<td>bar</td>
<td>II</td>
<td>1209112002</td>
<td>95/100</td>
<td>1</td>
<td>A</td>
<td>B</td>
<td>60</td>
<td>5'</td>
<td>95%</td>
</tr>
<tr>
<th>IInd</th>
<td>James</td>
<td>Doe</td>
<td>II</td>
<td>1209112002</td>
<td>85/100</td>
<td>2</td>
<td>C</td>
<td>B</td>
<td>69</td>
<td>6'</td>
<td>85%</td>
</tr>
<tr>
<th>IIIrd</th>
<td>Jennifer</td>
<td>Jen</td>
<td>III</td>
<td>1209112006</td>
<td>89/100</td>
<td>3</td>
<td>A</td>
<td>B</td>
<td>72</td>
<td>6'</td>
<td>90%</td>
</tr>
</tbody>
</table>
This will give us a layout of a simple table and we can write some styling in CSS
to make it more cleaner.
@import url('https://fonts.googleapis.com/css?family=Roboto:300');
* {
box-sizing: border-box;
font-family: 'Roboto', sans-serif;
}
table {
width: 100%;
font-size: 14px;
color: black;
}
thead {
background-color: black;
color: white;
}
th,td {
text-align: center;
border: 0;
border-bottom: 1px solid gray;
height: 50px;
border-right: 1px solid gray;
}
This gives a simple table on Desktop which will not be fully-responsive and will introduce a scrollbar on smaller devices.
The CSS Magic
CSS has some beautiful elements
such as nth-child()
and content: ""
which we will use here. The nth-child( number or expression )
is used to select any element from a set of elements such as a list to add styles. The content
element can append a string value inside the existing DOM
node.
@media (max-width: 700px) {
th, td {
display: block;
float: left;
}
th {
width: 100%;
background-color: #000;
color: white;
padding-top: 10px;
}
td {
width: 33.33%;
}
thead th {
display: none;
}
td::before {
display: block;
font-weight: bold;
margin-top: .33em;
margin-bottom: .33em;
}
td:nth-child(2):before {
content: "First Name";
}
td:nth-child(3):before {
content: "Last Name";
}
td:nth-child(4):before {
content: "Section";
}
td:nth-child(5):before {
content: "Roll Number";
}
td:nth-child(6):before {
content: "Marks";
}
td:nth-child(7):before {
content: "Position";
}
td:nth-child(8):before {
content: "Discipline";
}
td:nth-child(9):before {
content: "Sports";
}
td:nth-child(10):before {
content: "Weight";
}
td:nth-child(11):before {
content: "Height";
}
td:nth-child(12):before {
content: "Attendance";
}
}
@media (min-width: 501px) and (max-width: 700px) {
td {
width: 25%;
}
}
When the screen width is less than 700px
playing around with some float
and than hiding all thead th
elements and adding their content using css content
tag inside an existing DOM
element is the most interesting stuff here.
On Desktop
On Tablets
On Mobiles
Conclusion
Designing responsive tables has always been a challenge in web design, this approach can provide better experiences on small screens
but can be used only when the table size is known. For dynamic tables
, where the data from the server can change the table size, the scrollbar
and content hiding
approach work best.