J'ai besoin de créer une table html (ou quelque chose de similaire) avec un en-tête fixe et une première colonne fixe.
Toutes les solutions que j'ai vues jusqu'à présent utilisent Javascript ou jQuery
pour définir scrollTop / scrollLeft, mais cela ne fonctionne pas correctement sur les navigateurs mobiles, donc je recherche une solution CSS pure.
J'ai trouvé une solution pour une colonne fixe ici: jsfiddle.net/C8Dtf/20/ mais je ne sais pas comment je peux l'améliorer pour rendre l'en-tête fixe aussi.
Je veux qu'il fonctionne sur les navigateurs Webkit ou utilise certaines css3
fonctionnalités, mais je le répète, je ne veux pas l'utiliser Javascript
pour le défilement.
EDIT: Ceci est un exemple du comportement que je souhaite atteindre: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/FixedColumns/css_size.html
position
comportement complexe aux lignes et aux cellules, mais je ne comprends pas très bien où cela est applicable ou non.Réponses:
Une véritable solution CSS pure avec une ligne d'en-tête fixe et une première colonne
J'ai dû créer un tableau avec à la fois un en-tête fixe et une première colonne fixe en utilisant du CSS pur et aucune des réponses ici n'était tout à fait ce que je voulais.
La
position: sticky
propriété prend en charge à la fois le maintien en haut (comme je l'ai vu le plus utilisé) et sur le côté dans les versions modernes de Chrome, Firefox et Edge. Cela peut être combiné avec undiv
qui a laoverflow: scroll
propriété de vous donner un tableau avec des en-têtes fixes qui peuvent être placés n'importe où sur votre page:Placez votre table dans un récipient:
Utilisez
overflow: scroll
sur votre conteneur pour activer le défilement:Comme Dagmar l'a souligné dans les commentaires, le conteneur nécessite également un
max-width
et unmax-height
.Utilisez
position: sticky
pour avoir des cellules de table en tenir à bord ettop
,right
ouleft
de choisir le bord de coller à:Comme MarredCheese l'a mentionné dans les commentaires, si votre première colonne contient des
<td>
éléments au lieu d'<th>
éléments, vous pouvez utilisertbody td:first-child
dans votre CSS au lieu detbody th
Pour que l'en-tête de la première colonne reste à gauche, utilisez:
Afficher l'extrait de code
https://jsfiddle.net/qwubvg9m/1/
la source
width
de votre première colonne, vous pouvez utiliserposition: sticky
sur les cellules de votre deuxième colonne avec uneleft
valeur égale à celle de votre première colonnewidth
: jsfiddle.net/wvypo83c/794<td>
éléments au lieu d'<th>
éléments, vous pouvez utilisertbody td:first-child
dans votre CSS au lieu detbody th
.De nos jours, cela est possible en utilisant le CSS uniquement avec la
position: sticky
propriété.Voici un extrait:
(jsFiddle: https://jsfiddle.net/hbqzdzdt/5/ )
Concernant la compatibilité. Cela fonctionne dans tous les principaux navigateurs, mais pas dans IE. Il y a un polyfill pour
position: sticky
mais je ne l'ai jamais essayé.la source
Ce n'est pas un exploit facile.
Le lien suivant est vers une démo fonctionnelle:
Lien mis à jour selon le commentaire de lanoxx
http://jsfiddle.net/C8Dtf/366/
N'oubliez pas d'ajouter ceux-ci:
je ne vois pas d'autre moyen d'y parvenir. Surtout pas en utilisant uniquement css.
C'est beaucoup de choses à traverser. J'espère que cela t'aides :)
la source
"bFilter": false
"bInfo" : false
à l'.dataTable()
appelthead
est dans son propre tableau qui n'est pas lié aux changements d'td
éléments, donc si le texte d'une cellule est long, lath
largeur ne s'ajustera pas en conséquence.Toutes ces suggestions sont excellentes et toutes, mais elles ne corrigent que l'en-tête ou une colonne, pas les deux, ou elles utilisent du javascript. La raison - il ne pense pas que cela puisse être fait en CSS pur. La raison:
S'il était possible de le faire, vous auriez besoin d'imbriquer plusieurs divs scrollables les uns dans les autres, chacun avec un défilement dans une direction différente. Ensuite, vous devrez diviser votre tableau en trois parties: l'en-tête fixe, la colonne fixe et le reste des données.
Bien. Mais maintenant le problème - vous pouvez faire en sorte que l'un d'eux reste en place lorsque vous faites défiler, mais l'autre est imbriqué dans la zone de défilement du premier et est donc sujet au défilement hors de vue lui-même, donc ne peut pas être fixé en place sur l'écran. «Ah-ha» vous dites «mais je peux en quelque sorte utiliser une position absolue ou fixe pour faire ça» - non, vous ne pouvez pas. Dès que vous faites cela, vous perdez la possibilité de faire défiler ce conteneur. C'est une situation de poule et d'oeuf - vous ne pouvez pas avoir les deux, ils s'annulent.
Je pense que la seule solution consiste à utiliser javascript. Vous devez séparer complètement les trois éléments et garder leurs positions synchronisées via javascript. Il y a de bons exemples dans d'autres articles sur cette page. Celui-ci vaut également le coup d'œil:
http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/
la source
J'ai fait quelques changements dans jsfiddle. C'est peut-être ce que vous essayez de faire.
J'ai codé en dur les titres comme ceci:
Et j'ai aussi ajouté quelques styles.
J'espère que c'est ce que tu veux :)
la source
Un exemple utilisant uniquement CSS:
la source
div
. C'est lediv
qui permet le défilement des lignes tandis que l'en-tête reste au même endroit. Cette approche a fonctionné pour mes besoins.J'ai trouvé une excellente solution par Paul O'Brien pour le problème et je voudrais partager le lien: https://codepen.io/paulobrien/pen/LBrMxa
J'ai supprimé le style du pied de page:
la source
Pour corriger à la fois les en-têtes et les colonnes, vous pouvez utiliser le plugin suivant:
Mis à jour en juillet 2019
Récemment, est également apparue une solution CSS pure basée sur la propriété CSS
position: sticky;
( ici pour plus de détails à ce sujet) appliquée sur chaqueTH
élément (au lieu de leur conteneur parent)la source
J'ai récemment dû créer une solution avec un groupe d'en-tête fixe et une première colonne fixe. J'ai divisé ma table en div et utilisé jquery pour capturer le défilement de la fenêtre.
http://jsfiddle.net/TinT/EzXub/2346/
la source
Un collègue et moi venons de publier un nouveau projet GitHub qui fournit une directive Angular que vous pouvez utiliser pour décorer votre table avec des en-têtes fixes: https://github.com/objectcomputing/FixedHeader
Il s'appuie uniquement sur css et angular, avec une directive qui ajoute quelques divs. Il n'y a pas de jQuery requis.
Cette implémentation n'est pas aussi complète que certaines autres implémentations, mais si votre besoin est simplement d'ajouter des tables fixes, nous pensons que cela pourrait être une bonne option.
la source
Après deux jours de combat avec Internet Explorer 9 + Chrome + Firefox (Windows) et Safari (Mac), j'ai trouvé un système qui est
Résultat:
HTML:
CSS:
la source
div.cost_center table{border-collapse: collapse;}
et la troisième légende doit être quelque chose qui rentre dans le 60px (dans cet exemple)Les réponses existantes conviendront à la plupart des gens, mais pour ceux qui cherchent à ajouter des ombres sous l'en-tête fixe et à droite de la première colonne (fixe), voici un exemple fonctionnel (css pur):
http://jsbin.com/nayifepaxo/1/edit?html,output
L'astuce principale pour que cela fonctionne consiste
::after
à ajouter des ombres à droite de chacun des premierstd
de chacuntr
:Il m'a fallu un certain temps (trop de temps ...) pour que tout fonctionne, alors j'ai pensé que je partagerais pour ceux qui sont dans une situation similaire.
la source
Afficher l'extrait de code
besoin de corriger le pied de page d'en-tête
la source
Quelque chose comme cela peut fonctionner pour vous ... Il vous faudra probablement avoir défini des largeurs de colonne pour votre ligne d'en-tête.
http://jsfiddle.net/vkhNC/
Mettre à jour:
Je ne suis pas convaincu que l'exemple que vous avez donné soit possible avec juste CSS. J'aimerais que quelqu'un me prouve le contraire. Voici ce que j'ai jusqu'ici . Ce n'est pas le produit fini mais cela pourrait être un début pour vous. J'espère que cela vous oriente dans une direction utile, où que ce soit.
la source
Une autre solution consiste à utiliser AngularJS. Le module AngularUI a une directive appelée
ng-grid
qui prend en charge une fonctionnalité appelée épinglage de colonne. Ce n'est pas du CSS pur à 100%, mais les autres solutions non plus.http://angular-ui.github.io/ng-grid/#columnPinning
la source
Exemple de CSS pur:
http://jsfiddle.net/cCarlson/L98m854d/
Inconvénient: La structure / logique d' en- tête fixe dépend assez sur les dimensions spécifiques de, de sorte que l' abstraction est probablement pas une option viable .
la source
Position: sticky ne fonctionne pas pour certains éléments comme (thead) dans Chrome et d'autres navigateurs Webkit comme safari.
Mais ça marche bien avec (th)
Ou visitez mon exemple codepen :
la source
Je pense que cela vous aidera: https://datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html
En un mot, si vous savez comment créer un dataTable, il vous suffit d'ajouter cette ligne jQuery en bas:
bottom: true // sert également à fixer l'en-tête Bottom.
la source
Si vous ne souhaitez utiliser que du HTML et du CSS purs, j'ai une solution à votre problème:
dans ce jsFiddle, vous pouvez voir une solution sans script qui fournit un tableau avec un en-tête fixe. L'adaptation du balisage pour une première colonne fixe ne devrait pas poser de problème également. Il vous suffit de créer une table positionnée en absolu pour la première colonne à l'intérieur de
hWrapper
-div et de repositionner lavWrapper
-div.Fournir du contenu dynamique ne devrait pas être un problème en utilisant des moteurs de tentation côté serveur ou côté navigateur, ma solution fonctionne bien dans tous les navigateurs modernes et les navigateurs plus anciens à partir d'IE8.
la source
Juste besoin de changer de style
Démo: https://plnkr.co/edit/Qxy5RMJBXmkaJAOjBtQn?p=preview
la source