Comment puis-je définir une <table>
largeur de 100% et mettre uniquement à l'intérieur du <tbody>
défilement vertical pour une certaine hauteur?
table {
width: 100%;
display:block;
}
thead {
display: inline-block;
width: 100%;
height: 20px;
}
tbody {
height: 200px;
display: inline-block;
width: 100%;
overflow: auto;
}
<table>
<thead>
<tr>
<th>Head 1</th>
<th>Head 2</th>
<th>Head 3</th>
<th>Head 4</th>
<th>Head 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
<td>Content 4</td>
<td>Content 5</td>
</tr>
</tbody>
</table>
Je veux éviter d'ajouter des div supplémentaires, tout ce que je veux, c'est un simple tableau comme celui-ci et lorsque j'essaie de changer l'affichage table-layout
, position
et bien d'autres choses dans le tableau CSS ne fonctionnent pas bien avec une largeur de 100% uniquement avec une largeur fixe en px.
html
css
vertical-scrolling
Marko S
la source
la source
Réponses:
Afin de faire
<tbody>
défiler l'élément, nous devons changer la façon dont il est affiché sur la page, c'est-à-dire utiliserdisplay: block;
pour l'afficher en tant qu'élément de niveau bloc.Puisque nous modifions la
display
propriété detbody
, nous devons également modifier cette propriété pour l'thead
élément afin d'éviter de casser la disposition du tableau.Donc nous avons:
Les navigateurs Web affichent les éléments
thead
ettbody
sous forme de groupe de lignes (table-header-group
ettable-row-group
) par défaut.Une fois que nous avons changé cela, les
tr
éléments intérieurs ne remplissent pas tout l'espace de leur conteneur.Pour résoudre ce problème, nous devons calculer la largeur des
tbody
colonnes et appliquer la valeur correspondante auxthead
colonnes via JavaScript.Colonnes de largeur automatique
Voici la version jQuery de la logique ci-dessus:
Et voici la sortie (sur Windows 7 Chrome 32) :
DÉMO DE TRAVAIL .
Tableau pleine largeur, colonnes de largeur relative
Comme l'affiche originale le nécessitait, nous pourrions étendre le
table
à 100% dewidth
son conteneur, puis utiliser un relatif ( pourcentage )width
pour chaque colonne du tableau.Étant donné que la table a une (sorte de) disposition fluide , nous devons ajuster la largeur des
thead
colonnes lorsque le conteneur est redimensionné.Par conséquent, nous devons définir la largeur des colonnes une fois la fenêtre redimensionnée:
La sortie serait:
DÉMO DE TRAVAIL .
Prise en charge du navigateur et alternatives
J'ai testé les deux méthodes ci-dessus sur Windows 7 via les nouvelles versions des principaux navigateurs Web (y compris IE10 +) et cela a fonctionné.
Cependant, cela ne fonctionne pas correctement sur IE9 et les versions antérieures .
En effet, dans une disposition de table , tous les éléments doivent suivre les mêmes propriétés structurelles.
En utilisant
display: block;
les éléments<thead>
et<tbody>
, nous avons rompu la structure de la table.Refonte de la mise en page via JavaScript
Une approche consiste à repenser la disposition (entière) du tableau. Utiliser JavaScript pour créer une nouvelle mise en page à la volée et gérer et / ou ajuster dynamiquement les largeurs / hauteurs des cellules.
Par exemple, jetez un œil aux exemples suivants:
Tables gigognes
Cette approche utilise deux tables imbriquées avec un div contenant. La première
table
n'a qu'une seule cellule qui a undiv
, et le second tableau est placé à l'intérieur de cetdiv
élément.Vérifiez les tables de défilement vertical sur CSS Play .
Cela fonctionne sur la plupart des navigateurs Web. Nous pouvons également faire la logique ci-dessus dynamiquement via JavaScript.
Tableau avec en-tête fixe sur défilement
Étant donné que le but d'ajouter une barre de défilement verticale à l'
<tbody>
affichage de l'en- tête du tableau en haut de chaque ligne, nous pourrions positionner l'thead
élément pour qu'il restefixed
en haut de l'écran.Voici une démonstration de travail de cette approche réalisée par Julien .
Il a un support de navigateur Web prometteur.
Et voici une implémentation CSS pure par Willem Van Bockstal .
La solution Pure CSS
Voici l'ancienne réponse. Bien sûr, j'ai ajouté une nouvelle méthode et affiné les déclarations CSS.
Table à largeur fixe
Dans ce cas, le
table
devrait avoir un fixewidth
(y compris la somme des largeurs des colonnes et la largeur de la barre de défilement verticale) .Chaque colonne doit avoir une largeur spécifique et la dernière colonne de l'
thead
élément a besoin d'une plus grande largeur qui est égale à la largeur des autres + la largeur de la barre de défilement verticale.Par conséquent, le CSS serait:
Voici la sortie:
DÉMO DE TRAVAIL .
Table avec 100% de largeur
Dans cette approche, le
table
a une largeur de100%
et pour chacunth
ettd
, la valeur de lawidth
propriété doit être inférieure à100% / number of cols
.De plus, nous devons réduire la largeur de
thead
as comme valeur de la largeur de la barre de défilement verticale.Pour ce faire, nous devons utiliser la
calc()
fonction CSS3 , comme suit:Voici la démo en ligne .
Remarque: Cette approche échouera si le contenu de chaque colonne rompt la ligne, c'est -à- dire que le contenu de chaque cellule doit être suffisamment court .
Dans ce qui suit, il existe deux exemples simples de solution CSS pure que j'ai créés au moment où j'ai répondu à cette question.
Voici la démo jsFiddle v2 .
Ancienne version: jsFiddle Demo v1
la source
display: block
vous perdez les propriétés de la table comme largeur de colonne partagée entre la tête et le corps. Je sais que vous avez corrigé cela en définissantwidth: 19.2%
mais au cas où nous ne connaissions pas la largeur de chaque colonne à l'avance, cela ne fonctionnera pas.height: 100%
(lorsque vous souhaitez que le tableau se développe en bas de la page).ng-repeat
tables AngularJS . Je ne sais pas pourquoi il y a toutes ces bibliothèques avec des en-têtes de table fixes et quoi pas quand il y a cette solution.box-sizing
propriété afin que le fait d'avoir des bordures de deux épaisseurs différentes ne perturbe pas l'alignement de la colonne.Dans la solution suivante, la table occupe 100% du conteneur parent, aucune taille absolue requise. C'est du CSS pur, une mise en page flexible est utilisée.
Voici à quoi ça ressemble:
Inconvénients possibles:
HTML (raccourci):
CSS, avec quelques décorations omises pour plus de clarté:
code complet sur jsfiddle
Même code en MOINS pour pouvoir le mélanger:
la source
td
devrait aiderDans les navigateurs modernes, vous pouvez simplement utiliser css:
la source
<table>
avec<div>
ce qui aoverflow-y: auto;
et certainsmax-height
. Par exemple:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
J'utilise
display:block
pourthead
ettbody
. Pour cette raison, la largeur desthead
colonnes est différente de la largeur destbody
colonnes.Pour résoudre ce problème, j'utilise un petit
jQuery
code, mais cela ne peut être faitJavaScript
qu'en.Voici ma démo de travail: http://jsfiddle.net/gavroche/N7LEF/
Ne fonctionne pas dans IE 8
Afficher l'extrait de code
la source
colNumber
variable pourrait être remplacée par du code qui itère à travers les cellules réelles trouvées à la place, et notez qu'elle ne fonctionne pas correctement s'il y a descolspan
s (pourrait également être améliorée dans le code, si nécessaire, mais peu probable sur le type de table susceptible de vouloir cette fonction de défilement).CSS uniquement
pour Chrome, Firefox, Edge (et autres navigateurs à feuilles persistantes )
Simplement
position: sticky; top: 0;
vosth
éléments:PS: si vous avez besoin de bordures pour les éléments TH,
th {box-shadow: 1px 1px 0 #000; border-top: 0;}
cela vous aidera (car les bordures par défaut ne sont pas peintes correctement lors du défilement).Pour une variante de ce qui précède qui utilise juste un peu de JS afin de s'adapter à IE11, voir cette réponse https://stackoverflow.com/a/47923622/383904
la source
separate
vous ajoutez de l'huile au feu. jsfiddle.net/RokoCB/o0zL4xyw et voir une solution ICI: ajoutez des bordures au TH fixe - Je suis le bienvenu pour des suggestions OFC si j'ai raté quelque chose.Créez deux tables l'une après l'autre, placez la deuxième table dans un div de hauteur fixe et définissez la propriété overflow sur auto. Gardez également tous les td à l'intérieur de la tête dans la deuxième table vides.
la source
Je l'ai finalement bien compris avec du CSS pur en suivant ces instructions:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
La première étape consiste à définir le
<tbody>
bloc à afficher pour qu'un débordement et une hauteur puissent être appliqués. À partir de là, les lignes dans le<thead>
besoin doivent être définies sur position: relative et display: block afin qu'elles se placent au-dessus du maintenant défilable<tbody>
.tbody, thead { display: block; overflow-y: auto; }
Parce que le
<thead>
est relativement positionné, chaque cellule du tableau a besoin d'une largeur expliciteMais malheureusement, cela ne suffit pas. Lorsqu'une barre de défilement est présente, les navigateurs lui allouent de l'espace, donc,
<tbody>
finit par avoir moins d'espace disponible que le<thead>
. Remarquez le léger désalignement que cela crée ...La seule solution de contournement que j'ai pu trouver était de définir une largeur minimale sur toutes les colonnes sauf la dernière.
Exemple de codepen entier ci-dessous:
CSS:
Html:
EDIT: Solution alternative pour une largeur de table de 100% (ci-dessus est en fait pour une largeur fixe et n'a pas répondu à la question):
HTML:
CSS:
Démo: http://codepen.io/anon/pen/bNJeLO
la source
Solution de contournement CSS pour forcer les colonnes à s'afficher correctement avec un corps de bloc
Cette solution nécessite toujours que les
th
largeurs soient calculées et définies par jQueryEt le Jquery / Javascript
la source
essayez l'approche ci-dessous, très simple, facile à mettre en œuvre
Ci-dessous le lien jsfiddle
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
la source
Ajouter une largeur fixe à td, th après que le bloc d'affichage tbody & thead fonctionne parfaitement et nous pouvons également utiliser le plugin slimscroll pour rendre la barre de défilement belle.
la source
Voici le code qui fonctionne pour moi pour créer une tête collante sur une table avec un corps défilant:
la source
Pour utiliser "overflow: scroll", vous devez définir "display: block" sur la tête et le corps. Et cela gâche la largeur des colonnes entre eux. Mais ensuite, vous pouvez cloner la ligne de tête avec Javascript et la coller dans le corps comme une ligne cachée pour conserver les largeurs de col exactes.
http://jsfiddle.net/Julesezaar/mup0c5hk/
Le css:
la source
Essayez ce jsfiddle . Ceci utilise jQuery et fait à partir de la réponse de Hashem Qolami. Dans un premier temps, créez un tableau régulier puis faites-le défiler.
la source