- Dans les tableaux comportant de nombreuses lignes, plus on fait défiler, plus il devient facile d’oublier le sens des colonnes, ce qui rend la lecture des données moins pratique
- Il suffit d’ajouter
position: sticky; et top: 0; à thead pour mettre en place un en-tête fixe
sticky bénéficie d’une prise en charge par environ 96 % des navigateurs dans le monde, ce n’est donc pas vraiment une fonctionnalité expérimentale
- Même lorsqu’on consulte des lignes plus bas, comme le 300e élément, les titres de colonnes restent visibles, ce qui améliore l’expérience de navigation dans le tableau
- La mise en œuvre est minime mais l’effet est important ; pour une page web qui propose de longs tableaux, cela mérite d’être appliqué comme amélioration de base de l’utilisabilité
Le problème des en-têtes qui disparaissent dans les longs tableaux
- Dans les grands jeux de données ou les tableaux de plusieurs centaines de lignes, après défilement, l’en-tête du tableau disparaît hors de l’écran
- Si l’on descend jusqu’au 300e élément, il peut devenir difficile de vérifier à nouveau ce que signifient les données de chaque colonne
- Plus un tableau est nouveau pour l’utilisateur, plus il doit garder en mémoire le sens des colonnes pendant sa lecture, ce qui alourdit la navigation
Appliquer sticky à thead
- La solution consiste à ajouter deux propriétés CSS à
thead
position: sticky;
top: 0;
- En utilisant ensemble
position: sticky et top: 0, l’en-tête peut être fixé en haut de l’écran pendant le défilement
sticky dispose d’un taux de prise en charge mondial d’environ 96 %, ce qui permet de l’utiliser dans de nombreux navigateurs
- Le comportement réel peut être vérifié dans l’exemple CodePen
1 commentaires
Avis sur Hacker News
Je veux bien admettre les en-têtes fixes sur un axe, mais j’attends encore le jour où CSS les prendra en charge sur les deux axes : https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: auto, mais on nous dit de choisir l’un ou l’autre.J’avoue que je connais très peu CSS, mais je construis quand même des applis web qui fonctionnent à peu près. Récemment, j’ai essayé de figer l’en-tête d’un tableau monstre d’environ 20 000 lignes : https://www.datasciencemeta.com/rpackages Au début, je m’attendais à trouver quelque chose comme
class="table table-header-sticky"dans les classes de table Bootstrap, mais il n’y avait rien ; après une vingtaine de minutes à bricoler des suggestions de Stack Overflow, GPT et CodePen, j’obtenais des effets de bord bizarres. Mais avec le CodePen de cet article, ça a fonctionné en 2 minutes, et je suis en train de le déployer en production.Figer l’en-tête d’un tableau semble simple avec un seul
position: sticky;, mais dès qu’on commence à ajouter quelque chose au contenu du tableau, ça se complique vite. Sur un tableau avec en-tête fixe, j’avais ajouté une fonctionnalité qui, lorsque l’utilisateur fait défiler le corps puis quitte la page, enregistre l’index de la première ligne visible et le restaure à son retour ; mais la restauration se faisait toujours environ une ligne trop bas. En fait, la ligne 5 était bien tout en haut du tableau, mais commetheadla recouvrait, la ligne 6 semblait être la première. J’ai donc ajusté la position de défilement en tenant compte de la hauteur dethead, mais il y avait parfois quelques pixels de décalage ; comme le tableau était grand, avec du chargement différé sur les événements de scroll et la mise en page automatique par défaut des tableaux, les cellules d’en-tête passaient à la ligne et la hauteur totale de l’en-tête changeait. Au final, j’ai attaché un ResizeObserver àtheadpour ajuster dynamiquement la position de défilement quand sa hauteur changeait. [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...En implémentant ça, si vous voulez que la bordure de l’en-tête reste elle aussi fixe, vous pouvez le faire en mettant
position: absolute,width: 100%,top: 0/bottom: 0,border-top/border-bottomsurtable thead:beforeettable thead:after.J’aimerais que les en-têtes de tableau se comportent automatiquement comme ça. Si un développeur a pris la peine d’utiliser les balises correspondantes et d’ajouter du travail, il y a de fortes chances que ce soit déjà le comportement souhaité.
au lieu deet 45 niveaux de `` imbriqués dans chacun d’eux, donc je doute que ça fonctionne sur ces sites.En ligne de commande, il suffit d’envoyer l’en-tête vers stderr et le corps vers stdout. Sinon, le résultat de
heights | sort -k2 -nrsera dans l’ordreGeorge 186,Wally 173,NAME HEIGHT, mais si l’en-tête contourne stdout, on obtientNAME HEIGHT,George 186,Wally 173.heights | (sed -u 1q; sort -k2 -nr)fonctionne correctement. Source : https://stackoverflow.com/a/56151840heightsest un fichier, on peut faire% head -1 heights ; sed 1,1d heights | sort -k2 -nr, et siheightsest un exécutable coûteux à lancer deux fois, on peut faire% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nr. On peut aussi le passer àawk. Les autres options sont moins pratiques, mais moins surprenantes, et elles fonctionnent même si l’auteur de l’exécutable avait une autre idée en tête.Ça n’a pas fonctionné pendant longtemps. Chrome avait auparavant désactivé
position: stickysur les élémentstheadettr: https://issues.chromium.org/issues/41303743 Je me souviens que les tableaux de compatibilité des navigateurs étaient presque entièrement verts, mais que ça ne marchait justement pas dans les tables de Chrome.Il y a aussi un point de vue qui consisterait plutôt à dire « pitié, ne faites pas ça » : https://news.ycombinator.com/item?id=32998091
sticky?Le CodePen rend mieux si on décale
topde l’épaisseur de la bordure. Par exemple, en mettant-1pxau lieu de0, on évite que le corps du tableau transparaisse au-dessus de l’en-tête. Comparaison : https://codepen.io/bradleytaunt/pen/bGZyJBj Version modifiée : https://codepen.io/alokmenghrajani/pen/ExMBQowJe suggère d’utiliser une hauteur de viewport limitée à la place d’un en-tête fixe, afin que l’en-tête soit toujours visible. On peut faire comme DataGridXL(https://datagridxl.com). À noter : c’est moi qui l’ai créé.