Fixe-tête du tableau avec la barre de défilement horizontale et verticale de la barre de défilement sur
J'ai été à essayer de comprendre ce problème que j'ai avec le html/css collant en-tête + barres de défilement. Nous créons un programme qui nécessite des barres de défilement pour afficher une fois la containersize atteint un certain point(en fonction de la résolution de l'utilisateur).
Je suis forcer un min-width sur la deuxième colonne de la table, de sorte que le tableau s'arrête à la baisse à un certain point, et les forces de l'conteneur de rester à une certaine largeur. Le débordement sur le conteneur affiche la barre de défilement horizontale. Tout fonctionne très bien. Une fois que j'ajoute une deuxième barre de défilement pour le défilement vertical, les choses sont plus foiré. Quelqu'un a une solution pour ce problème? Je veux avoir une barre de défilement verticale sur le .table-corps, mais la barre de défilement doit être visible sur le outercontainer.
Est-il un bon html/css solution pour l'en-tête fixe les tables? J'ai été à la recherche pour une semaine, mais ne peut trouver les plugins jQuery pour ce genre de comportement.
C'est mon HTML:
<!DOCTYPE html>
<html>
<head>
<title>fixed header prototyping</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="outer-container"> <!-- absolute positioned container -->
<div class="inner-container">
<div class="table-header">
<table id="headertable" width="100%" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="header-cell col1">One</th>
<th class="header-cell col2">Two</th>
<th class="header-cell col3">Three</th>
<th class="header-cell col4">Four</th>
<th class="header-cell col5">Five</th>
</tr>
</thead>
</table>
</div>
<div class="table-body">
<table id="bodytable" width="100%" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
<tr>
<td class="body-cell col1">body row1</td>
<td class="body-cell col2">body row2</td>
<td class="body-cell col3">body row2</td>
<td class="body-cell col4">body row2</td>
<td class="body-cell col5">body row2 en nog meer</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
Et mon CSS ressemble à ceci:
body {
margin:0;
padding:0;
height: 100%;
width: 100%;
}
table {
border-collapse: collapse; /* make simple 1px lines borders if border defined */
}
tr {
width: 100%;
}
.outer-container {
background-color: #ccc;
position: absolute;
top:0;
left: 0;
right: 300px;
bottom:40px;
overflow: hidden;
}
.inner-container {
width: 100%;
height: 100%;
position: relative;
overflow-x: scroll;
overflow-y:hidden;
}
.table-header {
float:left;
width: 100%;
}
.table-body {
float:left;
height: 100%;
width: inherit;
overflow-y: scroll;
}
.header-cell {
background-color: yellow;
text-align: left;
height: 40px;
}
.body-cell {
background-color: blue;
text-align: left;
}
.col1, .col3, .col4, .col5 {
width:120px;
min-width: 120px;
}
.col2 {
min-width: 300px;
}
JSFiddle exemple - http://jsfiddle.net/W8URM/
Merci d'avance les gars!
- avez-vous d'utiliser un
table
? ou pouvez-vous utiliser un tableau commediv
de mise en page? - Veuillez vérifier si la solution s'intègre parfaitement.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas facile.
Je suis venu avec un Script de solution. (Je ne pense pas que cela peut être fait en utilisant uniquement CSS)
la HTML reste la même que vous avez posté, le CSS change un peu, JQuery code ajouté.
Travail Violon Testé sur: IE10, IE9, IE8, FF, Chrome
BTW: si vous avez des éléments uniques, pourquoi n'utilisez-vous pas de l'id au lieu de classes?
Je pense que ça donne un meilleur sélecteur de performance.
Explication de la façon dont il fonctionne:
inner-container
s'étendra à l'ensemble de l'espace de laouter-container
(donc, fondamentalement, il n'est pas nécessaire), mais je l'ai laissé là-bas, donc vous n'aurez pas besoin de vous changer les DOM.la
table-header
est en position relative, sans défilement (overflow: hidden
), nous nous occupons de son défilement plus tard.la
table-body
ont étendre sur le reste de lainner-container
hauteur, j'ai donc utilisé un script pour déterminer quelle hauteur fixer lui. (il change de façon dynamique lorsque vous redimensionnez la fenêtre)sans une hauteur fixe, le défilement de la coutume semble, parce que la div ne feront que croître grande place..
notez que cette partie peut être fait sans script, si vous corrigez l'en-tête de la hauteur et de l'utilisation de CSS3 (comme le montre la fin de la réponse)
maintenant, c'est juste une question de déplacement de l'en-tête avec le corps à chaque fois que nous les faire défiler.
cela est réalisé par une fonction attribuée à la
scroll
événement.CSS (certaines ont été copiés à partir de votre style)
JQuery
Si vous ne vous inquiétez pas à propos de la fixation de l'en-tête de la hauteur (j'ai vu que tu fixe la cellule de la hauteur dans votre CSS), un peu de Script peut être skiped si vous utilisez CSS3 :plus Courte Violon (cela ne fonctionne pas sur IE8)
thead
ettbody
, plus enveloppant chacun dans une DIV n'a pas l'air "correct" pour moi.left: -1*this.scrollLeft
parright: -1*this.scrollRight
. post pertinent de violon, et nous allons continuer à partir de là.Tested on: IE10, IE9, IE8, FF, Chrome
violon solution ne fonctionne pas surie8
tout en utilisantjquery-1.7.2
pouvez-vous s'il vous plaît dites-moiVoici une solution qui est encore pas un CSS seule solution. Il est semblable à avrahamcool's solution en ce qu'il utilise quelques lignes de jQuery, mais au lieu de changer de hauteurs et de déplacement de la tête le long, il n'est de changer la largeur de
tbody
basé sur la façon dont la mesure de son parenttable
défile le long de la droite.Un bonus supplémentaire avec cette solution, c'est qu'il fonctionne avec un sémantiquement valide tableau HTML.
Il fonctionne très bien sur toutes les récentes versions de navigateur (IE10, Chrome, FF) et c'est elle, la fonctionnalité de défilement des pauses sur les anciennes versions.
Mais alors le fait que vous utilisez un point de vue sémantique HTML valide table sauvera le jour et de s'assurer de la table est toujours affichée correctement, il est seulement la fonctionnalité de défilement qui ne fonctionnent pas sur les anciens navigateurs.
Voici un jsFiddle pour les besoins de la démonstration.
CSS
JS
J'avais besoin d'une version qui se dégrade bien dans IE9 (pas de défilement, juste une table normale). Affichage du violon ici que c'est une version améliorée. Tout ce que vous devez faire est de définir une hauteur sur le
tr
.Supplémentaires CSS pour rendre cette solution se dégrader bien dans IE9
Voici un jsFiddle démontrer le bien dégradants dans IE9 version de cette solution.
Modifier: mise à Jour de tripoter les liens pour accéder à une version du violon qui contient des correctifs pour les problèmes mentionnés dans les commentaires. Juste l'ajout d'un extrait avec la dernière et meilleure version pendant que j'y suis:
JS:
CSS:
HTML:
$(window).load(function(){ $('table').on('scroll', function () { $(this).find(" > *").width($(this).width() + $(this).scrollLeft()); }); });
Merci beaucoup Mathijs pour l'idée.Voici un code HTML /CSS seule solution (avec un peu de javascript).
Excuses pour répondre à la question après cette longue, mais la solution ne me convenait pas et j'ai trouvé mieux. Ici est la façon la plus simple de le faire avec le HTML (pas de jquery):
Avant que, la solution de violon à la question. https://jsfiddle.net/3vzrunkt/
Et pour expliquer la solution:
vous avez besoin et en joignant div aucun débordement/défilement nécessaire
un en-tête div contenant l'en-tête de la table avec overflow:hidden pour s'assurer que la barre de défilement ne s'affiche pas. Ajouter margin-right:16px pour s'assurer que la barre de défilement est laissé à l'extérieur pendant la synchronisation.
un autre div contenant les enregistrements de la table et overflow-y:scroll. Remarque le rembourrage est nécessaire pour obtenir la barre de défilement vers la droite de l'en-tête.
Et la chose la plus importante magique js pour synchroniser l'en-tête et les données de la table:
onscroll
qui est en JavaScript.exemple de travail en jsFiddle
Ceci peut être réalisé à l'aide de div. Il peut être fait avec table aussi. Mais je préfère toujours div.
Javascript:
veuillez vous référer jsFiddle pour cette partie. Le reste de cette réponse devient très long.
Cela a été me rend fou pour quelques semaines. J'ai trouvé une solution qui fonctionne pour moi qui comprend:
...mais il ya un couple de mises en garde:
La barre de défilement verticale n'est pas visible jusqu'à ce que vous faites défiler tout le chemin vers la droite. Étant donné que la plupart des gens ont des molettes de défilement, ce fut un sacrifice acceptable.
La largeur de la barre de défilement doit être connue. Sur mon site, j'ai mis la barre de défilement largeurs (je ne suis pas trop préoccupé par les plus âgés, de l'incompatibilité des navigateurs), donc, je peux alors calculer
div
ettable
largeurs régler à partir de la barre de défilement.Au lieu de poster mon code ici, je vais poster un lien vers la jsFiddle.
En-tête fixe de table + touche de défilement gauche/droite.
vous pouvez utiliser le code CSS suivant..
La solution est d'utiliser JS pour défiler horizontalement en haut de la div, de sorte qu'il corresponde au bas de la div.
Vous devez être très prudent assurez-vous que le haut et le bas sont exactement les mêmes dimensions, par exemple, vous pourriez avoir besoin de faire de la banque TD et TH utiliser des largeurs fixes.
Ici est un violon https://jsfiddle.net/jdhenckel/yzjhk08h/5/
Les parties importantes: CSS utilisation
Avis
overflow-y
doit être le même sur les deux tête et le bas.Et le Javascript...