Wie kann ich eine <table>
Breite von 100% einstellen und <tbody>
für eine gewisse Höhe nur eine vertikale Schriftrolle verwenden?
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>
Ich möchte vermeiden, zusätzliche Divs hinzuzufügen. Alles, was ich möchte, ist eine einfache Tabelle wie diese und wenn ich versuche, die Anzeige zu ändern table-layout
, position
und vieles mehr in der CSS-Tabelle, die mit 100% Breite nicht gut funktioniert, nur mit fester Breite in px.
html
css
vertical-scrolling
Marko S.
quelle
quelle
Antworten:
Um das
<tbody>
Element scrollbar zu machen , müssen wir die Art und Weise ändern, wie es auf der Seite angezeigt wird, dhdisplay: block;
um es als Element auf Blockebene anzuzeigen.Da wir die
display
Eigenschaft vontbody
ändern, sollten wir diese Eigenschaft auch für dasthead
Element ändern, um zu verhindern, dass das Tabellenlayout beschädigt wird.Also haben wir:
Web - Browser angezeigt werden, das
thead
undtbody
Elemente als Zeilengruppe (table-header-group
undtable-row-group
) standardmäßig.Sobald wir das ändern,
tr
füllen die inneren Elemente nicht den gesamten Raum ihres Containers aus.Um dies zu beheben, müssen wir die Breite der
tbody
Spalten berechnen und den entsprechenden Wertthead
über JavaScript auf die Spalten anwenden .Spalten mit automatischer Breite
Hier ist die jQuery-Version der obigen Logik:
Und hier ist die Ausgabe (unter Windows 7 Chrome 32) :
ARBEITSDEMO .
Tabelle mit voller Breite, Spalten mit relativer Breite
Wenn das Originalposter benötigt wird, können wir den Container
table
auf 100% erweiternwidth
und dann für jede Spalte der Tabelle einen relativen Wert ( Prozentsatz ) verwendenwidth
.Da die Tabelle ein (Art) flüssiges Layout hat , sollten wir die Breite der
thead
Spalten anpassen , wenn die Größe des Containers geändert wird.Daher sollten wir die Breite der Spalten festlegen, sobald die Fenstergröße geändert wird:
Die Ausgabe wäre:
ARBEITSDEMO .
Browser-Unterstützung und Alternativen
Ich habe die beiden oben genannten Methoden unter Windows 7 über die neuen Versionen der wichtigsten Webbrowser (einschließlich IE10 +) getestet und es hat funktioniert.
Es ist jedoch nicht funktioniert richtig auf IE9 und unten.
Dies liegt daran, dass in einem Tabellenlayout alle Elemente denselben strukturellen Eigenschaften folgen sollten.
Durch die Verwendung von
display: block;
for<thead>
und<tbody>
Elementen haben wir die Tabellenstruktur gebrochen.Layout über JavaScript neu gestalten
Ein Ansatz besteht darin, das (gesamte) Tabellenlayout neu zu gestalten. Verwenden Sie JavaScript, um im laufenden Betrieb ein neues Layout zu erstellen und die Breiten / Höhen der Zellen dynamisch zu handhaben und / oder anzupassen.
Schauen Sie sich zum Beispiel die folgenden Beispiele an:
Satztische
Dieser Ansatz verwendet zwei verschachtelte Tabellen mit einem enthaltenden div. Die erste
table
hat nur eine Zelle mit einemdiv
, und die zweite Tabelle befindet sich in diesemdiv
Element.Überprüfen Sie die vertikalen Bildlauftabellen bei CSS Play .
Dies funktioniert in den meisten Webbrowsern. Wir können die obige Logik auch dynamisch über JavaScript ausführen.
Tabelle mit fester Überschrift auf Bildlauf
Da der Zweck der vertikale Bildlaufleiste der Zugabe
<tbody>
wird die Tabelle anzeigt Header am Anfang jeder Zeile, könnten wir die Position desthead
Elements zu bleibenfixed
am oberen Rand des Bildschirms statt.Hier ist eine Arbeitsdemo dieses Ansatzes von Julien .
Es hat eine vielversprechende Webbrowser-Unterstützung.
Und hier eine reine CSS- Implementierung von Willem Van Bockstal .
Die reine CSS-Lösung
Hier ist die alte Antwort. Natürlich habe ich eine neue Methode hinzugefügt und die CSS-Deklarationen verfeinert.
Tabelle mit fester Breite
In diesem Fall
table
sollte der Wert fest seinwidth
(einschließlich der Summe der Spaltenbreiten und der Breite der vertikalen Bildlaufleiste). .Jede Spalte sollte eine bestimmte haben Breite und die letzte Spalte des
thead
Elements eine größere braucht Breite , die zu den anderen gleich Breite + die Breite der vertikalen Scroll-Leiste.Daher wäre das CSS:
Hier ist die Ausgabe:
ARBEITSDEMO .
Tisch mit 100% Breite
Bei diesem Ansatz wird die
table
eine Breite von100%
und für jedesth
undtd
der Wert derwidth
Eigenschaft sollte kleiner als sein100% / number of cols
.Außerdem müssen wir die reduzieren Breite von
thead
als Wert der Breite der vertikalen Scroll-Leiste.Dazu müssen wir CSS3 verwenden
calc()
Funktion wie folgt verwenden:Hier ist die Online-Demo .
Hinweis: Dieser Ansatz schlägt fehl schlägt wenn der Inhalt jeder Spalte die Zeile durchbricht, dh der Inhalt jeder Zelle sollte kurz genug sein .
Im Folgenden gibt es zwei einfache Beispiele für reine CSS-Lösungen, die ich zum Zeitpunkt der Beantwortung dieser Frage erstellt habe.
Hier ist das jsFiddle Demo v2 .
Alte Version: jsFiddle Demo v1
quelle
display: block
Ihnen Eigenschaften lösen Tabelle als Spaltenbreite zwischen thead und tbody geteilt. Ich weiß, dass Sie dies durch Einstellen behoben haben,width: 19.2%
aber falls wir die Breite jeder Spalte nicht im Voraus kennen, funktioniert dies nicht.height: 100%
(wenn die Tabelle bis zum Ende der Seite erweitert werden soll).ng-repeat
Tabellen. Ich bin mir nicht sicher, warum es all diese Bibliotheken mit festen Tabellenüberschriften gibt und was nicht, wenn es diese Lösung gibt.box-sizing
Eigenschaft etwas weiter verbessern , damit Ränder mit zwei unterschiedlichen Dicken die Spaltenausrichtung nicht beeinträchtigen.In der folgenden Lösung belegt die Tabelle 100% des übergeordneten Containers, ohne dass absolute Größen erforderlich sind. Es ist reines CSS, es wird ein flexibles Layout verwendet.
So sieht es aus:
Mögliche Nachteile:
HTML (gekürzt):
CSS, wobei einige Dekorationen aus Gründen der Übersichtlichkeit weggelassen wurden:
vollständiger Code auf jsfiddle
Gleicher Code in WENIGER, damit Sie ihn einmischen können:
quelle
td
sollte helfenIn modernen Browsern können Sie einfach CSS verwenden:
quelle
<table>
mit<div>
was hatoverflow-y: auto;
und einige wickelnmax-height
. Zum Beispiel:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Ich benutze
display:block
fürthead
undtbody
. Aus diesem Grundthead
unterscheidet sich die Breite dertbody
Spalten von der Breite der Spalten.Um dies zu beheben, verwende ich kleinen
jQuery
Code, der jedochJavaScript
nur in ausgeführt werden kann.Hier ist meine Arbeitsdemo: http://jsfiddle.net/gavroche/N7LEF/
Funktioniert nicht in IE 8
Code-Snippet anzeigen
quelle
colNumber
könnte die Variable durch Code ersetzt werden, der stattdessen durch tatsächlich gefundene Zellen iteriert, und beachten Sie, dass sie nicht korrekt verarbeitet wird, wenncolspan
s vorhanden sind (könnte bei Bedarf auch im Code verbessert werden, ist jedoch in Bezug auf die Art unwahrscheinlich Tabelle, die diese Bildlauffunktion wahrscheinlich haben möchte).Nur CSS
für Chrome, Firefox, Edge (und andere immergrüne Browser)
Einfach
position: sticky; top: 0;
deineth
Elemente:PS: wenn Sie brauchen Grenzen für TH - Elemente
th {box-shadow: 1px 1px 0 #000; border-top: 0;}
helfen wird (da die Standardgrenzen nicht korrekt auf Scroll gemalt werden).Eine Variante des oben genannten, die nur ein wenig JS verwendet, um IE11 zu berücksichtigen, finden Sie in dieser Antwort unter https://stackoverflow.com/a/47923622/383904
quelle
separate
Sie verwenden, fügen Sie dem Feuer Öl hinzu. jsfiddle.net/RokoCB/o0zL4xyw und sehen Sie HIER eine Lösung : Fügen Sie dem festen TH Rahmen hinzu - ich freue mich über Vorschläge von OFC, wenn ich etwas verpasst habe.Erstellen Sie zwei Tabellen nacheinander, setzen Sie die zweite Tabelle in ein Div mit fester Höhe und setzen Sie die Überlaufeigenschaft auf auto. Halten Sie auch alle td's im Kopf in der zweiten Tabelle leer.
quelle
Ich habe es mit reinem CSS endlich richtig gemacht, indem ich diese Anweisungen befolgt habe:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
Der erste Schritt besteht darin, den
<tbody>
anzuzeigenden Block so einzustellen , dass ein Überlauf und eine Höhe angewendet werden können. Von dort aus müssen die Zeilen in der<thead>
Position positioniert werden: relativ und Anzeige: blockieren, damit sie oben auf dem jetzt scrollbaren sitzen<tbody>
.tbody, thead { display: block; overflow-y: auto; }
Da die
<thead>
relativ positioniert ist, benötigt jede Tabellenzelle eine explizite BreiteDas reicht aber leider nicht aus. Wenn eine Bildlaufleiste vorhanden ist, weisen die Browser ihr Speicherplatz zu. Daher steht dem Browser
<tbody>
weniger Speicherplatz zur Verfügung als dem<thead>
. Beachten Sie die leichte Fehlausrichtung, die dadurch entsteht ...Die einzige Problemumgehung, die ich finden konnte, bestand darin, für alle Spalten außer der letzten eine Mindestbreite festzulegen.
Beispiel für einen ganzen Codepen unten:
CSS:
Html:
EDIT: Alternative Lösung für Tabellenbreite 100% (oben ist eigentlich für feste Breite und hat die Frage nicht beantwortet):
HTML:
CSS:
Demo: http://codepen.io/anon/pen/bNJeLO
quelle
CSS-Problemumgehung zum Erzwingen der korrekten Anzeige von Spalten mit einem 'Block'-Tbody
Für diese Lösung müssen die
th
Breiten weiterhin von jQuery berechnet und festgelegt werdenUnd das Jquery / Javascript
quelle
Versuchen Sie unten Ansatz, sehr einfach leicht zu implementieren
Unten ist der jsfiddle Link
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
quelle
Das Hinzufügen einer festen Breite zu td, th nach dem Erstellen von tbody & thead display block funktioniert einwandfrei und wir können auch das slimscroll- Plugin verwenden, um die Bildlaufleiste schön zu machen.
quelle
Dies ist der Code, mit dem ich einen klebrigen Kopf auf einem Tisch mit einem scrollbaren Körper erstellen kann:
quelle
Um "overflow: scroll" zu verwenden, müssen Sie "display: block" für thead und tbody einstellen. Und das bringt die Spaltenbreiten zwischen ihnen durcheinander. Dann können Sie die Thead-Zeile mit Javascript klonen und als versteckte Zeile in den tbody einfügen, um die genauen Spaltenbreiten beizubehalten.
http://jsfiddle.net/Julesezaar/mup0c5hk/
Das CSS:
quelle
Versuchen Sie diese jsfiddle . Dies verwendet jQuery und basiert auf der Antwort von Hashem Qolami. Erstellen Sie zunächst eine reguläre Tabelle und machen Sie sie dann scrollbar.
quelle