Existe-t-il une technique CSS / JavaScript multi-navigateur pour afficher un long tableau HTML de sorte que les en-têtes de colonne restent fixes à l'écran et ne défilent pas avec le corps du tableau. Pensez à l'effet «figer les volets» dans Microsoft Excel.
Je veux pouvoir faire défiler le contenu du tableau, mais toujours voir les en-têtes de colonne en haut.
javascript
css
html-table
Cheekysoft
la source
la source
thead th { position: sticky; top: 0; }
. Safari a besoin d'un préfixe de fournisseur:-webkit-sticky
Réponses:
Je cherchais une solution pour cela depuis un certain temps et j'ai trouvé que la plupart des réponses ne fonctionnaient pas ou ne convenaient pas à ma situation, j'ai donc écrit une solution simple avec jQuery.
Voici le contour de la solution:
Vous trouverez ci-dessous le code d'une démonstration exécutable.
Cette solution fonctionne dans Chrome et IE. Comme il est basé sur jQuery, cela devrait également fonctionner dans d'autres navigateurs pris en charge par jQuery.
la source
Cela peut être résolu proprement en quatre lignes de code.
Si vous vous souciez uniquement des navigateurs modernes, un en-tête fixe peut être obtenu beaucoup plus facilement en utilisant des transformations CSS. Cela semble étrange, mais fonctionne très bien:
La prise en charge des transformations CSS est largement disponible, à l' exception d'Internet Explorer 8-.
Voici l'exemple complet pour référence:
Afficher l'extrait de code
la source
$(this).addClass('border')
change le reste du tableau présente les polices, la taille, la couleur que je passe dans la classe de bordure. Mais, n'ajoute pas de lignes à l'en-tête fixe. Appréciez, toute entrée sur la façon de résoudre ce problèmeJe viens de terminer la création d'un plugin jQuery qui prendra une table unique valide en utilisant du HTML valide (doit avoir une tête et un corps) et produira une table qui a des en-têtes fixes, un pied de page fixe facultatif qui peut être soit un en-tête cloné, soit le contenu que vous avez choisi (pagination, etc.). Si vous souhaitez profiter de moniteurs plus grands, il redimensionnera également le tableau lorsque le navigateur sera redimensionné. Une autre fonctionnalité ajoutée est la possibilité de faire défiler le côté si les colonnes du tableau ne peuvent pas toutes tenir en vue.
http://fixedheadertable.com/
sur github: http://markmalek.github.com/Fixed-Header-Table/
Il est extrêmement facile à configurer et vous pouvez créer vos propres styles personnalisés pour cela. Il utilise également des coins arrondis dans tous les navigateurs. Gardez à l'esprit que je viens de le publier, donc c'est toujours techniquement bêta et il y a très peu de problèmes mineurs que je résous.
Il fonctionne dans Internet Explorer 7, Internet Explorer 8, Safari, Firefox et Chrome.
la source
J'ai également créé un plugin qui résout ce problème. Mon projet - jQuery.floatThead existe depuis plus de 4 ans maintenant et est très mature.
Il ne nécessite aucun style externe et ne s'attend pas à ce que votre table soit stylisée d'une manière particulière. Il prend en charge Internet Explorer9 + et Firefox / Chrome.
Actuellement (2018-05), il a:
Beaucoup (pas toutes) des réponses ici sont des hacks rapides qui peuvent avoir résolu le problème d'une personne, mais ne fonctionneront pas pour chaque table.
Certains des autres plugins sont anciens et fonctionnent probablement très bien avec Internet Explorer, mais ils tomberont en panne sur Firefox et Chrome.
la source
TL; DR
Si vous ciblez des navigateurs modernes et n'avez pas de besoins de style extravagants: http://jsfiddle.net/dPixie/byB9d/3/ ... Bien que la grande version quatre soit assez douce, cette version gère beaucoup mieux la largeur du fluide.
Bonnes nouvelles tout le monde!
Avec les avancées de HTML5 et CSS3, cela est désormais possible, du moins pour les navigateurs modernes. L'implémentation légèrement hackeuse que j'ai trouvée peut être trouvée ici: http://jsfiddle.net/dPixie/byB9d/3/ . Je l'ai testé dans FX 25, Chrome 31 et IE 10 ...
HTML pertinent (insérez un doctype HTML5 en haut de votre document):
Mais comment?!
Autrement dit, vous avez un en-tête de table, que vous masquez visuellement en le faisant à 0px de haut, qui contient également des divs utilisés comme en-tête fixe. Le conteneur de la table laisse suffisamment d'espace en haut pour permettre l'en-tête absolument positionné, et la table avec des barres de défilement apparaît comme vous vous y attendez.
Le code ci-dessus utilise la classe positionnée pour positionner le tableau de manière absolue (je l'utilise dans une boîte de dialogue de style contextuelle) mais vous pouvez également l'utiliser dans le flux du document en supprimant le
positioned
classe du conteneur.Mais ...
Ce n'est pas parfait. Firefox refuse de faire la ligne d'en-tête 0px (au moins je n'ai trouvé aucun moyen) mais la maintient obstinément au minimum 4px ... Ce n'est pas un gros problème, mais en fonction de votre style, il gâchera vos bordures, etc.
Le tableau utilise également une approche de fausses colonnes où la couleur d'arrière-plan du conteneur lui-même est utilisée comme arrière-plan pour les divs d'en-tête, qui sont transparents.
Résumé
Dans l'ensemble, il peut y avoir des problèmes de style en fonction de vos besoins, en particulier des bordures ou des arrière-plans compliqués. Il peut également y avoir des problèmes de calculabilité, je ne l'ai pas encore vérifié dans une grande variété de navigateurs (veuillez commenter avec vos expériences si vous l'essayez), mais je n'ai rien trouvé de tel, alors j'ai pensé que cela valait la peine d'être publié en tous cas ...
la source
<section>
élément, doit être limité en hauteur uniquement pour le forcer à déborder et afficher le défilement. Toute mise en page qui ferait déborder le conteneur fonctionnerait. Si vous trouvez un cas où ce n'est pas le cas, veuillez poster un lien vers un violon.padding-top
valeur codée en dur signifie également que si le texte de l'en-tête du tableau se trouve sur plusieurs lignes, il apparaîtra au-dessus des cellules du tableau. Dommage, car cela fonctionne comme un charme la plupart du temps. Vraiment sympa truc avec l'div
enth
pour contourner le problème de dimensionnement de la colonne la plupart des autres solutions ont.Toutes les tentatives pour résoudre ce problème en dehors de la spécification CSS sont des ombres pâles de ce que nous voulons vraiment: livraison sur la promesse implicite de THEAD.
Ce problème d'en-têtes figés pour une table est une plaie ouverte en HTML / CSS depuis longtemps.
Dans un monde parfait, il y aurait une solution pure CSS pour ce problème. Malheureusement, il ne semble pas y en avoir un bon en place.
Les discussions sur les normes pertinentes sur ce sujet comprennent:
MISE À JOUR : Firefox livré
position:sticky
en version 32. Tout le monde y gagne!la source
thead th { position: sticky; top: 0; }
. Pouvons-nous mettre à jour cette réponse pour l'énoncer clairement?Voici un plugin jQuery pour les en-têtes de table fixes. Il permet à la page entière de défiler, figeant l'en-tête lorsqu'elle atteint le haut. Cela fonctionne bien avec les tables Twitter Bootstrap .
Référentiel GitHub: https://github.com/oma/table-fixed-header
Il ne fait pas défiler uniquement le contenu du tableau. Recherchez d'autres outils pour cela, comme l'une de ces autres réponses. Vous décidez ce qui convient le mieux à votre cas.
la source
La plupart des solutions publiées ici nécessitent jQuery. Si vous recherchez une solution indépendante du framework, essayez Grid: http://www.matts411.com/post/grid/
Il est hébergé sur Github ici: https://github.com/mmurph211/Grid
Non seulement il prend en charge les en-têtes fixes, il prend également en charge, entre autres, les colonnes et les pieds de page fixes.
la source
La propriété CSS
position: sticky
a un grand support dans la plupart des navigateurs modernes (j'ai eu des problèmes avec Edge, voir ci-dessous).Cela nous permet de résoudre assez facilement le problème des en-têtes fixes:
Safari a besoin d' un préfixe fournisseur:
-webkit-sticky
.Pour Firefox, j'ai dû ajouter
min-height: 0
à l'un des éléments parents. J'oublie exactement pourquoi cela était nécessaire.Malheureusement, l'implémentation de Microsoft Edge ne semble que semi-fonctionnelle. Au moins, j'avais des cellules de tableau vacillantes et mal alignées lors de mes tests. La table était toujours utilisable, mais avait des problèmes esthétiques importants.
la source
position: sticky;
de la table dans un div qui aoverflow: scroll;
,overflow-x: scroll;
ouoverflow-y: scroll;
. semble être la solution la meilleure et la plus simple pour les en-têtes et colonnes de table fixes dans les navigateurs modernes. Cette réponse doit être votée en haut.Une table de défilement CSS plus raffinée
Toutes les solutions CSS pures que j'ai vues jusqu'à présent - aussi intelligentes soient-elles - manquent d'un certain niveau de polissage ou ne fonctionnent tout simplement pas correctement dans certaines situations. J'ai donc décidé de créer le mien ...
Fonctionnalités:
Voici quelques violons qui montrent les options de largeur fluide et automatique:
Largeur et hauteur du fluide (s'adapte à la taille de l'écran): jsFiddle (Notez que la barre de défilement n'apparaît que lorsque cela est nécessaire dans cette configuration, vous devrez donc peut-être rétrécir le cadre pour le voir)
Largeur automatique, hauteur fixe (plus facile à intégrer avec d'autres contenus): jsFiddle
La configuration Auto Width, Fixed Height a probablement plus de cas d'utilisation, donc je posterai le code ci-dessous.
La méthode que j'ai utilisée pour figer la ligne d'en-tête est similaire à celle de d-Pixie, alors référez-vous à son article pour une explication. Il y avait une multitude de bogues et de limitations avec cette technique qui ne pouvaient être corrigés qu'avec des tas de CSS supplémentaires et un ou deux conteneurs de div supplémentaires.
la source
Un simple plugin jQuery
Il s'agit d'une variante de la solution de Mahes. Vous pouvez l'appeler comme
$('table#foo').scrollableTable();
L'idée est:
thead
ettbody
entable
éléments séparéstable
dans undiv.scrollable
div.scrollable
défilerLe CSS pourrait être:
Avertissements
Cela dit, cela fonctionne pour mes besoins et vous êtes libre de le prendre et de le modifier.
Voici le plugin:
la source
:)
Solution pas si propre, mais pure HTML / CSS.
Mis à jour pour l' exemple IE8 + JSFiddle
la source
Prise en charge du pied de page fixe
J'ai étendu la fonction de Nathan pour prendre également en charge un pied de page fixe et une hauteur maximale. De plus, la fonction définira le CSS lui-même et vous n'aurez qu'à prendre en charge une largeur.
Usage:
Hauteur fixe:
Hauteur maximale (si le navigateur prend en charge l'option CSS «max-height»):
Scénario:
la source
D'une certaine manière, j'ai fini par
Position:Sticky
bien travailler sur mon cas:la source
Deux divs, un pour l'en-tête, un pour les données. Faites défiler la div des données et utilisez JavaScript pour définir la largeur des colonnes de l'en-tête de la même manière que les largeurs des données. Je pense que les largeurs des colonnes de données doivent être fixes plutôt que dynamiques.
la source
Je me rends compte que la question autorise JavaScript, mais voici une solution CSS pure que j'ai élaborée qui permet également au tableau de se développer horizontalement. Il a été testé avec Internet Explorer 10 et les derniers navigateurs Chrome et Firefox. Un lien vers jsFiddle est en bas.
Le HTML:
Et le CSS:
http://jsfiddle.net/HNHRv/3/
la source
Pour ceux qui ont essayé la belle solution proposée par Maximilian Hils et qui n'ont pas réussi à la faire fonctionner avec Internet Explorer, j'ai eu le même problème (Internet Explorer 11) et j'ai découvert quel était le problème.
Dans Internet Explorer 11, la transformation de style (au moins avec translate) ne fonctionne pas
<THEAD>
. J'ai résolu ce problème en appliquant le style à tous les éléments<TH>
d'une boucle. Ça a marché. Mon code JavaScript ressemble à ceci:Dans mon cas, la table était une GridView dans ASP.NET. J'ai d'abord pensé que c'était parce qu'il n'en avait pas
<THEAD>
, mais même quand je l'ai forcé à en avoir un, cela n'a pas fonctionné. Ensuite, j'ai découvert ce que j'ai écrit ci-dessus.C'est une solution très agréable et simple. Sur Chrome, c'est parfait, sur Firefox un peu saccadé et sur Internet Explorer encore plus saccadé. Mais dans l'ensemble, une bonne solution.
la source
J'aimerais avoir trouvé la solution de @ Mark plus tôt, mais je suis allé écrire la mienne avant de voir cette question SO ...
Le mien est un plugin jQuery très léger qui prend en charge l'en-tête, le pied de page, l'étendue des colonnes (colspan), le redimensionnement, le défilement horizontal et un nombre facultatif de lignes à afficher avant le début du défilement.
jQuery.scrollTableBody (GitHub)
Tant que vous avez une table avec une bonne
<thead>
,<tbody>
et ( en option)<tfoot>
, tout ce que vous devez faire est la suivante:la source
J'ai trouvé cette solution de contournement - déplacer la ligne d'en-tête dans un tableau au-dessus du tableau avec des données:
la source
En appliquant les StickyTableHeaders in jQuery au tableau, les en-têtes de colonne resteront en haut de la fenêtre lorsque vous faites défiler vers le bas.
Exemple:
la source
J'aime la réponse de Maximillian Hils mais j'ai eu quelques problèmes:
Pour se débarrasser du scintillement, j'utilise un délai d'attente pour attendre que l'utilisateur ait terminé le défilement, puis j'applique la transformation - de sorte que l'en-tête n'est pas visible pendant le défilement.
J'ai également écrit ceci en utilisant jQuery, un avantage de cela étant que jQuery devrait gérer les préfixes des fournisseurs pour vous
La table est enveloppée dans un div avec la classe
table-container-fixed
.J'ai défini border-collapse pour se séparer car sinon nous perdons des bordures pendant la traduction, et je supprime la bordure sur la table pour arrêter le contenu apparaissant juste au-dessus de la cellule où se trouvait la bordure pendant le défilement.
Je fais le
th
fond blanc pour couvrir les cellules en dessous, et j'ajoute une bordure qui correspond à la bordure du tableau - qui est stylisée en utilisant Bootstrap et défilée hors de vue.la source
Utilisez la dernière version de jQuery et incluez le code JavaScript suivant.
la source
Ce n'est pas une solution exacte à la ligne d'en-tête fixe, mais j'ai créé une méthode plutôt ingénieuse de répéter la ligne d'en-tête tout au long du long tableau, tout en conservant la possibilité de trier.
Cette petite option soignée nécessite le plugin jQuery
tablesorter
. Voici comment ça fonctionne:HTML
Évidemment, ma table a beaucoup plus de lignes que cela. 193 pour être exact, mais vous pouvez voir où la ligne d'en-tête se répète. La ligne d'en-tête extensible est configurée par cette fonction:
jQuery
la source
Beaucoup de gens semblent chercher cette réponse. Je l'ai trouvé enterré dans une réponse à une autre question ici: Synchronisation de la largeur des colonnes entre les tables dans deux cadres différents, etc.
Parmi les dizaines de méthodes que j'ai essayées, c'est la seule que j'ai trouvée qui fonctionne de manière fiable pour vous permettre d'avoir une table inférieure défilante avec la table d'en-tête ayant les mêmes largeurs.
Voici comment je l'ai fait, j'ai d'abord amélioré le jsfiddle ci-dessus pour créer cette fonction, qui fonctionne sur les deux
td
etth
(dans le cas où cela déclenche d'autres utilisateurs qui utilisentth
pour le style de leurs lignes d'en-tête).Ensuite, vous devez créer deux tables, NOTEZ que la table d'en-tête doit avoir un supplément
TD
pour laisser de la place dans la table supérieure pour la barre de défilement, comme ceci:Ensuite, faites quelque chose comme:
C'est la seule solution que j'ai trouvée sur Stack Overflow qui fonctionne à partir de nombreuses questions similaires qui ont été publiées, qui fonctionne dans tous mes cas.
Par exemple, j'ai essayé le plugin jQuery stickytables qui ne fonctionne pas avec durandal, et le projet Google Code ici https://code.google.com/p/js-scroll-table-header/issues/detail?id=2
D'autres solutions impliquant le clonage des tables, ont de mauvaises performances ou sont nulles et ne fonctionnent pas dans tous les cas.
Il n'y a pas besoin de ces solutions trop complexes. Créez simplement deux tableaux comme les exemples ci-dessous et appelez la fonction setHeaderTableWidth comme décrit ici et boom, vous avez terminé .
Si cela ne fonctionne pas pour vous, vous jouiez probablement avec votre propriété CSS de dimensionnement de boîte et vous devez la définir correctement. Il est facile de foirer votre contenu CSS par accident. Il y a beaucoup de choses qui peuvent mal tourner, alors soyez conscient / prudent de cela. Cette approche fonctionne pour moi .
la source
Voici une solution avec laquelle nous avons fini par travailler (afin de traiter certains cas marginaux et les anciennes versions d'Internet Explorer, nous avons finalement effacé la barre de titre lors du défilement, puis l'avons réintégrée à la fin du défilement, mais dans les navigateurs Firefox et WebKit cette solution fonctionne . Elle suppose border-collapse: collapse.
La clé de cette solution est qu'une fois que vous appliquez border-collapse , les transformations CSS fonctionnent sur l'en-tête, il s'agit donc simplement d'intercepter les événements de défilement et de définir correctement la transformation. Vous n'avez pas besoin de dupliquer quoi que ce soit. À moins que ce comportement soit correctement implémenté dans le navigateur, il est difficile d'imaginer une solution plus légère.
JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/
Il est implémenté comme un simple plugin jQuery. Vous rendez simplement votre tête collante avec un appel comme $ ('thead'). Sticky (), et ils vont traîner. Cela fonctionne pour plusieurs tableaux sur une page et des sections d'en-tête à mi-chemin des grands tableaux.
la source
border: 2px solid red;
àth
, faites défiler et vous verrez le problème. J'ai trouvé moi-même cette solution plus basique: jsfiddle.net/x6pLcor9/19Voici une réponse améliorée à celle publiée par Maximilian Hils .
Celui-ci fonctionne dans Internet Explorer 11 sans aucun scintillement:
la source
J'ai développé un plug-in jQuery léger et simple pour convertir un tableau HTML bien formaté en un tableau déroulant avec un en-tête et des colonnes de tableau fixes.
Le plugin fonctionne bien pour faire correspondre le positionnement pixel à pixel de la section fixe avec la section déroulante. De plus, vous pouvez également figer le nombre de colonnes qui seront toujours visibles lors du défilement horizontal.
Démo et documentation: http://meetselva.github.io/fixed-table-rows-cols/
Référentiel GitHub: https://github.com/meetselva/fixed-table-rows-cols
Vous trouverez ci-dessous l'utilisation d'une table simple avec un en-tête fixe,
la source
la source
Complément à la réponse de @Daniel Waltrip. La table doit être entourée de div
position: relative
pour fonctionner avecposition:sticky
. Je voudrais donc publier mon exemple de code ici.CSS
HTML
Démo
la source