J'ai essayé de créer une table dans AngularJS avec un en-tête et un pied de page collants. J'ai réussi à le faire; voici une démo Plunker et code:
<body ng-controller="MainCtrl as ctrl">
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>
Column1
</th>
<th>
Column2
</th>
<th>
Column3
</th>
<th>
Column4
</th>
<th>
Column5
</th>
</tr>
</thead>
<tbody>
<tr class="info" ng-repeat="item in items">
<td>
{{item.name}}
</td>
<td>
{{item.type}}
</td>
<td>
{{item.value}}
</td>
<td>
{{item.code}}
</td>
<td>
{{item.id}}
</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>
Column1
</th>
<th>
Column2
</th>
<th>
Column3
</th>
<th>
Column4
</th>
<th>
Column5
</th>
</tr>
</tfoot>
</table>
</body>
Mais les seuls problèmes sont:
Une idée comment résoudre ce problème?
Les critères de succès de cette question sont:
Ce que tu veux est impossible.
La raison pour laquelle les cellules sont presque _ est correcte, car le tableau est semi-présent, mais le document contient en fait plusieurs tableaux. En redéfinissant le type d'affichage des éléments <table>
sur flex
, vous avez rendu la page en plusieurs groupes différents. Le <thead>
et le <tfoot>
sont leur propre table et leur <tbody>
est sa propre table. Ils ne se dimensionnent pas les uns aux autres, mais plutôt aux autres cellules du même groupe.
D'autres guides CSS sur ce sujet nécessitent une largeur fixe. http://joshondesign.com/2015/05/23/csstable
Après avoir joué avec cela (en particulier, en essayant de déplacer thead et tfoot à des positions fixes), j'ai décidé que toute tentative d'attribution de règles spécifiques à l'en-tête/au pied de page casse la présentation du tableau et dimensionnement pour travailler différemment, ce qui explique pourquoi une largeur fixe est requise sur les cellules. Même dans les exemples, ils sont cassés de cette façon, mais la largeur fixe annule le problème.
Votre solution absolue la plus simple consiste à corriger les largeurs et à leur donner les propriétés overflow-x.
L'alternative consiste à utiliser JavaScript. Avec JS, tous les paris sont ouverts et vous pouvez faire tout ce que vous imaginez. Plus précisément, vous pouvez utiliser JS pour redimensionner automatiquement les cellules. Je me souviens d’avoir eu du succès avec un plugin jQuery qui a réussi cela.
https://www.datatables.net/
Sinon, non. Je ne trouve aucun exemple en ligne qui fasse ce dont vous avez besoin. Toute tentative visant à faire fonctionner cette présentation spécifique est un hack et il est préférable de créer une version sans JS avec des cellules de débordement x et des largeurs fixes, ainsi qu'une version compatible JS qui redimensionne automatiquement les cellules.
Comme vous le savez déjà dans les autres réponses, vous devriez supprimer white-space: nowrap;
, mais vous pouvez également faire quelque chose à propos dubarre de défilement:
table thead, table tfoot {
width: calc(100% - 17px);
}
cela semble parfait sur mon PC car les barres de défilement Windows ont une largeur de 17px. Si vous voulez être en sécurité et vérifier la largeur de la barre de défilement, utilisez ceci:
window.onload = function() {
var tr = document.getElementById("__tbody").children[0];
var scrWidth = window.innerWidth - tr.clientWidth - 3;
var width = "calc(100% - " + scrWidth + "px)";
document.getElementById("__thead").style.width = width;
document.getElementById("__tfoot").style.width = width;
}
Ceci calcule la largeur des barres de défilement, puis ajuste thead et tfoot. Bien entendu, vous devez définir les identifiants <thead id="__thead">
, <tbody id="__tbody">
et <tfoot id="__tfoot">
.
Afin de ramener la table à son état normal, avec un redimensionnement dynamique, vous devez suivre quelques étapes. Chaque étape mentionnée donnera la liberté à ses éléments de table respectifs, leur rendant la vie beaucoup plus simple.
Tout d'abord, supprimez toutes les instances de flex. Vous voulez que la table se comporte comme une table, non? Ensuite, laissez votre thead
, tr
et tfoot
être également eux-mêmes. Pourquoi les afficher sous forme de tableau? Enfin, votre tbody
est configurée pour s’afficher en tant que bloc. En un sens, cela le distingue de ses autres amis de la table, à savoir thead
et tfoot
. Cela crée une situation de solitude pour toutes les personnes impliquées.
Votre code final ressemblera à ceci:
table {
table-layout: auto;
max-height: 300px;
}
table thead, table tfoot,
table tbody tr {
table-layout: fixed;
}
tbody td,
thead th,
tfoot td{
border-right: 1px solid transparent;
vertical-align: middle;
white-space: nowrap;
}
table thead {
width: 100%;
}
table tfoot {
width: 100%;
}
table tbody {
overflow-y: auto;
}
table tbody tr {
width: 100%;
}
Cela permettra à vos cellules de tableau d'être elles-mêmes - en les redimensionnant dynamiquement à leur guise.
Retirer
white-space: nowrap;
et ajouter
Word-wrap: break-Word;
tfoot td{
border-right: 1px solid transparent;
vertical-align: middle;
Word-wrap: break-Word;
}
1ère réponse: ajouter l'élément css à td ci-dessous
td{
white-space: normal;
Word-wrap: break-Word;
}
2ème réponse: vous devez créer un tableau séparé pour l'en-tête et le pied de page et attribuer 20% de largeur à chaque td et th. Ça devrait marcher.
Réponse de la première question:
td {
text-overflow: Ellipsis !important;
overflow: hidden !important;
}
text-overflow: Ellipsis est très utile car l'utilisateur peut copier la valeur entière.
Réponse de la deuxième question:
Regardez la réponse à cette question: Table scroll with HTML and CSS
Il semble que vous ayez besoin de javascript ou d'une solution de table interne.
UPDATED pour la deuxième réponse:
Utilisez les styles suivants sur votre table et votre table (en utilisant Chrome):
table {
overflow-y: visible !important;
}
tbody {
overflow-y: overlay !important;
}
Utilisez des classes bootstrap à des fins de style. Votre style personnalisé (style.css) crée le problème. De plus, la balise <table>
fournit par défaut la largeur dynamique des colonnes. Un extrait de Comment créer une colonne de largeur dynamique dans Twitter Bootstrap answer:
<table class="table">
<tr><th>Id</th> <th>Name</th> <th>Email address</th></tr>
<tr><td>100001</td> <td>Joe</td> <td>[email protected]</td></tr>
<tr><td>100</td> <td>Christine</td> <td>[email protected]</td></tr>
<tr><td>1001</td> <td>John</td> <td>[email protected]</td></tr>
Cela vous donnera la sortie souhaitée
https://plnkr.co/edit/3hYms9hRqzF2DV9yTBCG?p=preview
Ajouté ceci dans votre css:
tr.info td {Word-wrap: break-Word; white-space: normal;}
Votre désalignement vient à cause de ce qui suit
solution:
faites votre last th plus grand que les autres comme la largeur de votre barre de défilement.
pour une meilleure apparence des barres de défilement, mettez des CSS personnalisés pour la barre de défilement
Ajoutez les fichiers css suivants à votre page et profitez de plunkerLink
th,td {
width: 20%!important;
overflow-x: auto;
padding: 10px;
}
th:last-of-type {
width: calc(20% + 6px)!important;
}
::-webkit-scrollbar {
width: 3px!important;
height: 6px!important;
}
::-webkit-scrollbar-button {
width: 0;
height: 0;
}
::-webkit-scrollbar-thumb {
border: 2px solid #ccc;
background: #ccc;
border-radius: 8px;
}
::-webkit-scrollbar-track-piece {
width: 3px!important;
border: 1px solid #fff;
}
Voici votre réponse: https://plnkr.co/edit/cyN0qDuxIs8LjkxIhur5?p=preview
tbody td,
thead th,
tfoot td{
Word-wrap:break-Word;
table-layout:fixed;
white-space:normal;
}
J'ai simplement modifié votre style.css dans démo Plunker comme suit
/* Put your css in here */
table {
table-layout: auto;
display: flex;
flex-flow: column;
max-height: 300px;
}
table thead, table tfoot,
table tbody tr {
display: table;
table-layout: fixed;
}
tbody td,
thead th,
tfoot td{
border-right: 1px solid transparent;
vertical-align: middle;
text-align: center;
white-space: normal;
Word-wrap: break-Word;
text-wrap: normal;
}
table thead {
/*flex: 0 0 auto;*/
width: 100%;
}
table tfoot {
/*flex: 0 0 auto;*/
width: 100%;
}
table tbody {
flex: 1 1 auto;
display: block;
overflow-y: auto;
}
table tbody tr {
width: 100%;
}