

Com gestionar l'element <table> perquè es vegi perfecte tant en pantalles d'escriptori com en dispositius mòbils.
Les taules HTML (<table>) van ser concebudes originalment per mostrar dades tabulars de mida fixa. En l'era del disseny responsiu, presenten reptes d'usabilitat notables:
<th>) desapareix de la vista, fent impossible saber quin concepte representa cada valor.La taula es mostra natural i àmplia. Permet la comparació ràpida de columnes i files gràcies a l'ample de pantalla disponible.
Si no està adaptada, comprimeix el contingut de forma il·legible o genera una barra de scroll horitzontal incòmoda per a l'usuari.
Consisteix a mantenir l'estructura original de la taula però col·locant-la dins d'un contenidor <div> que gestioni el desplaçament horitzontal de forma aïllada.
<div class="table-responsive">
<table>
<thead>
<tr>
<th>Producte</th>
<th>Preu</th>
<th>Estoc</th>
</tr>
</thead>
<tbody>
<tr>
<td>Camisa Tècnica</td>
<td>29.99 €</td>
<td>12 unitats</td>
</tr>
</tbody>
</table>
</div>
CSS:
.table-responsive {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch; /* Scroll suau en dispositius iOS */
margin-bottom: 1rem;
}
table {
width: 100%;
border-collapse: collapse;
white-space: nowrap; /* Evita que el text es trenqui inoportunament */
}
table th, table td {
padding: 10px 15px;
border: 1px solid #ddd;
}
Mitjançant Media Queries de CSS, canviem el disseny de la taula perquè en mòbil cada fila es converteixi en un bloc tipus "card", injectant el nom del camp mitjançant l'atribut data-label.
<table class="responsive-card-table">
<thead>
<tr>
<th>Producte</th>
<th>Preu</th>
<th>Estoc</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Producte">Camisa Tècnica</td>
<td data-label="Preu">29.99 €</td>
<td data-label="Estoc">12 unitats</td>
</tr>
</tbody>
</table>
CSS:
@media screen and (max-width: 768px) {
/* Convertim la taula i els seus elements en blocs */
.responsive-card-table,
.responsive-card-table thead,
.responsive-card-table tbody,
.responsive-card-table th,
.responsive-card-table td,
.responsive-card-table tr {
display: block;
}
/* Ocultem les capçaleres originals de la taula */
.responsive-card-table thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
.responsive-card-table tr {
border: 1px solid #ccc;
margin-bottom: 1rem;
background: #fff;
border-radius: 8px;
padding: 8px;
}
.responsive-card-table td {
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-left: 50%; /* Espai per a l'etiqueta */
text-align: right;
}
.responsive-card-table td:last-child {
border-bottom: none;
}
/* Creem l'etiqueta lateral llegint l'atribut data-label */
.responsive-card-table td::before {
content: attr(data-label);
position: absolute;
left: 10px;
width: 45%;
padding-right: 10px;
white-space: nowrap;
text-align: left;
font-weight: bold;
color: #555;
}
}
Si la taula es genera de manera dinàmica des d'un servidor o API, pots usar un script per afegir automàticament els atributs data-label a cada cel·la basant-se en el contingut del <th>.
document.addEventListener("DOMContentLoaded", function() {
const table = document.querySelector('.responsive-card-table');
if (!table) return;
// Obtenim els textos de les capçaleres TH
const headers = Array.from(table.querySelectorAll('thead th')).map(th => th.textContent.trim());
const rows = table.querySelectorAll('tbody tr');
// Assignem el data-label corresponent a cada cel·la TD
rows.forEach(row => {
const cells = row.querySelectorAll('td');
cells.forEach((cell, index) => {
if (headers[index]) {
cell.setAttribute('data-label', headers[index]);
}
});
});
});
No cal que escriguis tot aquest codi CSS a mà ni que calculis els atributs data-label un per un. He creat una eina gratuïta que genera el codi net, accessible i llest per copiar en qüestió de segons.
Tria entre 6 estils diferents, personalitza els colors i decideix si vols mode "Cards" o "Scroll".
Tots els drets reservats - @joallons - 2025 ® · Fet amb passió & codi