tableau html sans framework

Créer un tableau HTML responsive sans framework

Par Lucas

Un tableau HTML qui déborde sur mobile, c’est l’un des problèmes les plus fréquents en intégration web. Et pourtant, la solution ne nécessite ni Bootstrap, ni plugin JavaScript, ni bibliothèque externe. Quelques lignes de CSS suffisent pour rendre n’importe quel tableau responsive, lisible sur smartphone et parfaitement fonctionnel.

Ce guide vous donne le code directement utilisable, des explications claires sur chaque technique, et les bonnes pratiques à adopter selon votre situation. Que vous soyez débutant ou développeur confirmé, vous repartirez avec une solution adaptée à votre projet.

Pas besoin d’installer quoi que ce soit. Tout fonctionne en HTML et CSS natifs.

Pourquoi les tableaux HTML posent problème sur mobile

Un tableau HTML a une largeur naturellement fixe : il s’étire pour afficher toutes ses colonnes, quelle que soit la taille de l’écran. Sur un écran de 320 ou 375 pixels de large, un tableau avec six colonnes déborde immanquablement hors du conteneur. L’utilisateur doit scroller horizontalement, ce qui nuit à l’expérience et au taux de lecture.

Les navigateurs ne redimensionnent pas les tableaux automatiquement comme ils le font pour les images. Il faut donc intervenir manuellement avec du CSS pour forcer un comportement adaptatif.

Le bonne nouvelle : plusieurs techniques existent, chacune adaptée à un type de contenu précis. Vous n’avez pas besoin de tout apprendre, juste de choisir la bonne approche selon vos données.

Technique 1 : le scroll horizontal avec overflow-x

Comment ça fonctionne

C’est la méthode la plus simple et la plus rapide à mettre en place. On enveloppe le tableau dans un conteneur div, auquel on applique overflow-x: auto. Résultat : le tableau conserve sa structure, et un scroll horizontal apparaît uniquement sur les petits écrans.

<div class="table-wrapper">
  <table>
    <thead>
      <tr>
        <th>Nom</th>
        <th>Prénom</th>
        <th>Email</th>
        <th>Téléphone</th>
        <th>Ville</th>
        <th>Statut</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Martin</td>
        <td>Sophie</td>
        <td>sophie@exemple.fr</td>
        <td>06 12 34 56 78</td>
        <td>Lyon</td>
        <td>Actif</td>
      </tr>
    </tbody>
  </table>
</div>
.table-wrapper {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch; /* fluidité sur iOS */
}
table {
  width: 100%;
  border-collapse: collapse;
  min-width: 600px; /* largeur minimale pour garder la lisibilité */
}
th, td {
  padding: 10px 14px;
  text-align: left;
  border-bottom: 1px solid #e0e0e0;
  white-space: nowrap;
}
thead {
  background-color: #f5f5f5;
}

Pour qui c’est adapté

Cette technique convient parfaitement aux tableaux de données complexes : comparatifs produits, listes d’utilisateurs, exports financiers. L’intégrité visuelle est préservée, l’utilisateur voit exactement les mêmes données que sur desktop, il scrolle simplement pour en voir plus.

C’est la solution recommandée quand vous ne pouvez pas réduire le nombre de colonnes et que la lecture complète est nécessaire.

Technique 2 : empiler les cellules sur mobile avec CSS uniquement

Transformer les lignes en blocs

Cette approche est plus élaborée, mais elle offre une expérience utilisateur bien meilleure sur smartphone. Chaque ligne du tableau devient un bloc indépendant. Chaque cellule s’affiche sur une ligne complète, avec un label qui reprend le nom de la colonne correspondante.

Le résultat ressemble à une liste de fiches : clair, lisible, sans scroll horizontal.

<table class="responsive-table">
  <thead>
    <tr>
      <th>Produit</th>
      <th>Prix</th>
      <th>Stock</th>
      <th>Catégorie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-label="Produit">Chaise de bureau</td>
      <td data-label="Prix">249 €</td>
      <td data-label="Stock">12</td>
      <td data-label="Catégorie">Mobilier</td>
    </tr>
    <tr>
      <td data-label="Produit">Bureau réglable</td>
      <td data-label="Prix">499 €</td>
      <td data-label="Stock">4</td>
      <td data-label="Catégorie">Mobilier</td>
    </tr>
  </tbody>
</table>
/* Styles de base (desktop) */
.responsive-table {
  width: 100%;
  border-collapse: collapse;
}
.responsive-table th,
.responsive-table td {
  padding: 12px 16px;
  text-align: left;
  border-bottom: 1px solid #ddd;
}
.responsive-table thead {
  background-color: #f0f4f8;
  font-weight: 600;
}
.responsive-table tbody tr:hover {
  background-color: #fafafa;
}
/* Comportement mobile */
@media (max-width: 640px) {
  .responsive-table thead {
    display: none; /* on masque l'en-tête classique */
  }
  .responsive-table tbody tr {
    display: block;
    margin-bottom: 16px;
    border: 1px solid #ddd;
    border-radius: 6px;
    padding: 8px;
  }
  .responsive-table td {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 8px 12px;
    border-bottom: 1px solid #f0f0f0;
    font-size: 0.9rem;
  }
  .responsive-table td:last-child {
    border-bottom: none;
  }
  /* Affichage du label via l'attribut data-label */
  .responsive-table td::before {
    content: attr(data-label);
    font-weight: 600;
    color: #555;
    margin-right: 12px;
    white-space: nowrap;
  }
}

Le point clé : l’attribut data-label

L’astuce repose sur l’attribut HTML personnalisé data-label, posé directement sur chaque cellule <td>. Le CSS récupère ce contenu avec le pseudo-élément ::before et la fonction attr(), sans la moindre ligne de JavaScript.

C’est une solution 100 % CSS, légère, rapide, et facile à personnaliser.

Technique 3 : masquer des colonnes secondaires sur mobile

Quand certaines colonnes sont moins importantes que d’autres, une option efficace consiste à les masquer sur les petits écrans. L’utilisateur voit les données essentielles, sans être submergé par trop d’informations.

/* Colonnes à masquer sur mobile */
@media (max-width: 640px) {
  .col-secondary {
    display: none;
  }
}

Il suffit d’ajouter la classe col-secondary aux colonnes <th> et <td> concernées. Simple, propre, sans impact sur l’accessibilité si vous choisissez bien quelles données rester visibles.

Cette technique se combine souvent avec la première : on masque les colonnes non essentielles, et on autorise un scroll si le reste déborde encore.

Pourquoi c’est utile de le faire sans framework

Bootstrap ou Foundation proposent des classes pour rendre les tableaux responsives, c’est vrai. Mais ces frameworks ont un coût : des fichiers CSS de plusieurs centaines de kilo-octets, des dépendances à maintenir, et souvent bien plus de code que nécessaire pour un seul composant.

Faire sans framework, c’est gagner sur plusieurs tableaux de bord :

  • Performance : pas de fichier externe à charger, le CSS est minimaliste.
  • Maîtrise : vous contrôlez exactement ce qui s’affiche et comment.
  • Portabilité : le code fonctionne dans n’importe quel environnement, CMS, application ou page statique.
  • Longévité : pas de risque que la mise à jour d’un framework casse votre tableau.
  • Légèreté : quelques dizaines de lignes CSS, rien de plus.

Pour un projet avec un ou plusieurs tableaux de données, la solution maison est souvent plus rapide à mettre en place qu’une installation Bootstrap.

Comment choisir la bonne technique selon votre cas

Chaque tableau est différent. Voici comment orienter votre choix rapidement.

Votre tableau a beaucoup de colonnes et toutes sont importantes

Optez pour le scroll horizontal avec overflow-x: auto. C’est la méthode la plus sûre pour des données denses. L’utilisateur scrolle, mais il voit tout.

Votre tableau affiche des fiches ou des entrées distinctes

La technique d’empilement des cellules sera plus agréable à lire. Chaque ligne devient une fiche autonome. Idéal pour les catalogues produits, les annuaires ou les listes de contacts.

Certaines colonnes sont vraiment secondaires

Masquez-les sur mobile. Une colonne « ID interne » ou « Date de création » n’a pas forcément besoin d’être visible sur un écran de 375 pixels.

Vous avez besoin des deux

Les techniques se combinent très bien. Vous pouvez masquer des colonnes et activer un scroll résiduel si le tableau reste large après masquage.

Bonnes pratiques pour un tableau HTML responsive réussi

Toujours utiliser une structure HTML sémantique

Un tableau responsive commence par un tableau bien construit. Utilisez <thead>, <tbody>, <th> avec l’attribut scope, et des <caption> quand le contexte le justifie. La sémantique aide les lecteurs d’écran et améliore l’accessibilité.

<th scope="col">Nom du produit</th>

Tester sur de vrais appareils, pas seulement dans le navigateur

Les outils de simulation des DevTools sont pratiques, mais rien ne remplace un test sur un vrai smartphone. Le comportement du scroll, le rendu des polices et les zones tactiles peuvent varier.

Ne pas abuser du white-space: nowrap

Cette propriété empêche le retour à la ligne dans les cellules, ce qui est parfois utile pour les dates ou les codes. Mais appliquée partout, elle force le tableau à s’élargir excessivement et rend le scroll interminable.

Penser à l’accessibilité dès le départ

  • Ajoutez un <caption> pour décrire le contenu du tableau.
  • Utilisez scope="col" sur les <th> d’en-tête de colonnes.
  • Si vous masquez l’en-tête sur mobile, assurez-vous que les data-label reprennent fidèlement les intitulés de colonnes.
  • Vérifiez le contraste des couleurs pour les utilisateurs malvoyants.

Garder le CSS simple et bien organisé

Regroupez les styles de base hors media query, et placez toutes les adaptations mobiles dans un seul bloc @media. Votre code sera plus facile à maintenir et à transmettre à un autre développeur.

Exemple complet : tableau responsive prêt à l’emploi

Voici un exemple combinant structure HTML correcte et CSS responsive, directement intégrable dans votre projet.

<!-- HTML -->
<div class="table-container">
  <table class="data-table">
    <caption>Liste des commandes en cours</caption>
    <thead>
      <tr>
        <th scope="col">Commande</th>
        <th scope="col">Client</th>
        <th scope="col">Montant</th>
        <th scope="col" class="col-secondary">Date</th>
        <th scope="col">Statut</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td data-label="Commande">#1042</td>
        <td data-label="Client">Dupont Marie</td>
        <td data-label="Montant">128,50 €</td>
        <td data-label="Date" class="col-secondary">14/06/2025</td>
        <td data-label="Statut">Expédiée</td>
      </tr>
      <tr>
        <td data-label="Commande">#1043</td>
        <td data-label="Client">Bernard Luc</td>
        <td data-label="Montant">75,00 €</td>
        <td data-label="Date" class="col-secondary">15/06/2025</td>
        <td data-label="Statut">En préparation</td>
      </tr>
    </tbody>
  </table>
</div>
/* CSS */
.table-container {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.data-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.95rem;
}
.data-table caption {
  text-align: left;
  font-weight: 600;
  margin-bottom: 10px;
  color: #333;
}
.data-table th,
.data-table td {
  padding: 12px 16px;
  text-align: left;
  border-bottom: 1px solid #e4e4e4;
}
.data-table thead {
  background-color: #f2f6fa;
}
.data-table tbody tr:hover {
  background-color: #f9f9f9;
}
@media (max-width: 640px) {
  .col-secondary {
    display: none;
  }
  .data-table thead {
    display: none;
  }
  .data-table tbody tr {
    display: block;
    margin-bottom: 14px;
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 6px;
  }
  .data-table td {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 8px 10px;
    border-bottom: 1px solid #f0f0f0;
    font-size: 0.875rem;
  }
  .data-table td:last-child {
    border-bottom: none;
  }
  .data-table td::before {
    content: attr(data-label);
    font-weight: 600;
    color: #444;
    flex-shrink: 0;
    margin-right: 10px;
  }
}

FAQ : tableau HTML responsive sans framework

Faut-il obligatoirement JavaScript pour rendre un tableau responsive ?

Non. Toutes les techniques présentées dans ce guide fonctionnent uniquement en HTML et CSS. JavaScript peut apporter des améliorations supplémentaires (tri des colonnes, filtres dynamiques), mais pour la simple adaptation mobile, il n’est pas nécessaire.

La technique avec data-label est-elle accessible ?

Oui, à condition de bien renseigner les attributs et de conserver une structure HTML sémantique. Les lecteurs d’écran lisent les cellules <td> normalement, et le contenu affiché via ::before est purement décoratif. Le sens des données reste intact.

Quelle breakpoint utiliser pour le mobile ?

La valeur la plus courante est 640px ou 768px. Tout dépend de la largeur minimale de votre tableau. Si votre tableau est lisible jusqu’à 500 pixels de large, vous pouvez descendre le breakpoint. L’essentiel est de tester sur les tailles d’écran réelles de votre audience.

Peut-on combiner plusieurs techniques dans le même tableau ?

Tout à fait. Le scroll horizontal et le masquage de colonnes se cumulent sans conflit. Vous pouvez masquer les colonnes secondaires sur mobile et laisser un scroll disponible si le tableau reste trop large après masquage. C’est même la configuration la plus solide pour les tableaux très chargés.

Est-ce que ces techniques fonctionnent sur tous les navigateurs modernes ?

overflow-x: auto, display: block sur des cellules, attr() en CSS : tout cela est supporté par Chrome, Firefox, Safari, Edge et Opera depuis de nombreuses années. La propriété -webkit-overflow-scrolling: touch concerne uniquement les anciens iOS et reste inoffensive sur les autres navigateurs.

Comment adapter le code si mon tableau est généré dynamiquement ?

Si votre tableau est généré par PHP, JavaScript ou un CMS, assurez-vous que chaque cellule <td> reçoit bien l’attribut data-label avec le bon intitulé de colonne. En PHP, par exemple, vous pouvez passer les noms de colonnes en variable et les injecter dans un tableau de correspondance. Le CSS n’a pas besoin d’être modifié : il s’adapte automatiquement au contenu de l’attribut.

Résultat : un tableau responsive sans dépendance

Vous avez maintenant trois techniques opérationnelles, un exemple complet prêt à copier-coller, et les bases pour choisir la bonne approche selon votre contexte. Pas besoin de framework, pas besoin de plugin : juste du HTML propre et quelques règles CSS bien pensées.

Copiez le code, adaptez les couleurs et les polices à votre charte graphique, testez sur mobile, et c’est réglé. Si votre tableau évolue ou que votre contenu change, les techniques décrites ici restent stables et maintenables sur le long terme.

Pour aller plus loin, combinez ces bases avec un tri de colonnes en JavaScript vanilla ou une pagination légère pour offrir une expérience encore plus fluide à vos utilisateurs.

Laisser un commentaire