Gibt es eine browserübergreifende CSS / JavaScript-Technik zum Anzeigen einer langen HTML-Tabelle, sodass die Spaltenüberschriften auf dem Bildschirm fest bleiben und nicht mit dem Tabellenkörper scrollen. Denken Sie an den Effekt "Fenster einfrieren" in Microsoft Excel.
Ich möchte in der Lage sein, durch den Inhalt der Tabelle zu scrollen, aber immer die Spaltenüberschriften oben sehen zu können.
javascript
css
html-table
Cheekysoft
quelle
quelle
thead th { position: sticky; top: 0; }
. Safari benötigt ein Herstellerpräfix:-webkit-sticky
Antworten:
Ich habe eine Weile nach einer Lösung dafür gesucht und festgestellt, dass die meisten Antworten nicht funktionieren oder nicht für meine Situation geeignet sind. Deshalb habe ich mit jQuery eine einfache Lösung geschrieben.
Dies ist die Lösungsübersicht:
Unten finden Sie den Code in einer ausführbaren Demo.
Diese Lösung funktioniert in Chrome und IE. Da es auf jQuery basiert, sollte dies auch in anderen von jQuery unterstützten Browsern funktionieren.
quelle
Dies kann in vier Codezeilen sauber gelöst werden.
Wenn Sie sich nur für moderne Browser interessieren, kann ein fester Header durch die Verwendung von CSS-Transformationen viel einfacher erreicht werden. Klingt seltsam, funktioniert aber großartig:
Unterstützung für CSS - Transformationen ist weithin verfügbar , außer für den Internet Explorer 8-.
Hier ist das vollständige Beispiel als Referenz:
Code-Snippet anzeigen
quelle
$(this).addClass('border')
ändert sich der Rest der Tabelle mit Schriftarten, Größe und Farbe, die ich in der Rahmenklasse übergebe. Fügt dem festen Header jedoch keine Zeilen hinzu. Schätzen Sie, alle Eingaben, wie man das behebtIch habe gerade ein jQuery-Plugin zusammengestellt, das eine gültige einzelne Tabelle mit gültigem HTML-Code verwendet (muss einen Thead und einen Tbody haben) und eine Tabelle mit festen Kopfzeilen, optionaler fester Fußzeile, die entweder eine geklonte Kopfzeile oder eine beliebige sein kann, ausgeben wird Inhalt, den Sie ausgewählt haben (Paginierung usw.). Wenn Sie größere Monitore nutzen möchten, wird die Größe der Tabelle auch geändert, wenn die Größe des Browsers geändert wird. Eine weitere zusätzliche Funktion ist das seitliche Scrollen, wenn nicht alle Tabellenspalten in die Ansicht passen.
http://fixedheadertable.com/
auf github: http://markmalek.github.com/Fixed-Header-Table/
Es ist extrem einfach einzurichten und Sie können Ihre eigenen benutzerdefinierten Stile dafür erstellen. Außerdem werden in allen Browsern abgerundete Ecken verwendet. Denken Sie daran, dass ich es gerade veröffentlicht habe, es ist also technisch immer noch Beta und es gibt nur sehr wenige kleinere Probleme, die ich ausbügele.
Es funktioniert in Internet Explorer 7, Internet Explorer 8, Safari, Firefox und Chrome.
quelle
Ich habe auch ein Plugin erstellt, das dieses Problem behebt. Mein Projekt - jQuery.floatThead gibt es seit über 4 Jahren und es ist sehr ausgereift.
Es erfordert keine externen Stile und erwartet nicht, dass Ihre Tabelle auf eine bestimmte Weise gestaltet wird. Es unterstützt Internet Explorer9 + und Firefox / Chrome.
Derzeit (2018-05) hat es:
Viele (nicht alle) der Antworten hier sind schnelle Hacks, die möglicherweise das Problem einer Person gelöst haben, aber nicht für jeden Tisch funktionieren.
Einige der anderen Plugins sind alt und funktionieren wahrscheinlich hervorragend mit Internet Explorer, werden aber unter Firefox und Chrome nicht funktionieren.
quelle
TL; DR
Wenn Sie auf moderne Browser abzielen und keine extravaganten Styling-Anforderungen haben: http://jsfiddle.net/dPixie/byB9d/3/ ... Obwohl die Big-Four-Version auch ziemlich süß ist, handhabt diese Version die Flüssigkeitsbreite viel besser.
Gute Neuigkeiten alle zusammen!
Mit den Fortschritten von HTML5 und CSS3 ist dies nun zumindest für moderne Browser möglich. Die leicht hackige Implementierung, die ich mir ausgedacht habe, finden Sie hier: http://jsfiddle.net/dPixie/byB9d/3/ . Ich habe es in FX 25, Chrome 31 und IE 10 getestet ...
Relevantes HTML (fügen Sie jedoch einen HTML5-Doctype oben in Ihr Dokument ein):
Aber wie?!
Einfach ausgedrückt, Sie haben einen Tabellenkopf, den Sie visuell ausblenden, indem Sie ihn auf 0 Pixel hoch machen. Dieser enthält auch Divs, die als fester Kopf verwendet werden. Der Container der Tabelle lässt oben genügend Platz, um die absolut positionierte Kopfzeile zu berücksichtigen, und die Tabelle mit den Bildlaufleisten wird wie erwartet angezeigt.
Der obige Code verwendet die positionierte Klasse, um die Tabelle absolut zu positionieren (ich verwende sie in einem Popup-Dialogfeld), aber Sie können sie auch im Ablauf des Dokuments verwenden, indem Sie die
positioned
Klasse aus dem Container entfernen .Aber ...
Es ist nicht perfekt. Firefox weigert sich, die Kopfzeile auf 0px zu setzen (zumindest habe ich keinen Weg gefunden), hält sie aber hartnäckig auf mindestens 4px ... Es ist kein großes Problem, aber abhängig von Ihrem Stil wird es Ihre Ränder usw. durcheinander bringen.
Die Tabelle verwendet auch einen Faux-Column-Ansatz, bei dem die Hintergrundfarbe des Containers selbst als Hintergrund für die transparenten Header-Divs verwendet wird.
Zusammenfassung
Alles in allem kann es je nach Ihren Anforderungen zu Stylingproblemen kommen, insbesondere bei Rahmen oder komplizierten Hintergründen. Es kann auch Probleme mit der Berechenbarkeit geben. Ich habe es noch nicht in einer Vielzahl von Browsern überprüft (bitte kommentieren Sie Ihre Erfahrungen, wenn Sie es ausprobieren), aber ich habe so etwas nicht gefunden, daher dachte ich, dass es sich lohnt, es zu veröffentlichen wie auch immer ...
quelle
<section>
Element, muss nur höhenbeschränkt sein, um einen Überlauf zu erzwingen und das Scrollen anzuzeigen. Jedes Layout, das den Containerüberlauf verursacht, würde funktionieren. Wenn Sie einen Fall finden, in dem dies nicht der Fall ist, veröffentlichen Sie bitte einen Link zu einer Geige.padding-top
Wert bedeutet auch, dass der Text der Tabellenüberschrift, wenn er sich in mehr als einer Zeile befindet, über den Tabellenzellen angezeigt wird. Schade, denn das funktioniert die meiste Zeit wie ein Zauber. Wirklich schöne Trick mit derdiv
in derth
bekommen um die Spalte Sizing Problem den meisten anderen Lösungen haben.Alle Versuche, dies von außerhalb der CSS-Spezifikation zu lösen, sind blasse Schatten dessen, was wir wirklich wollen: Lieferung an das implizite Versprechen von THEAD.
Dieses Problem mit eingefrorenen Headern für eine Tabelle ist seit langem eine offene Wunde in HTML / CSS.
In einer perfekten Welt gäbe es eine reine CSS-Lösung für dieses Problem. Leider scheint es keinen guten zu geben.
Relevante Standarddiskussionen zu diesem Thema sind:
UPDATE : Firefox wird
position:sticky
in Version 32 ausgeliefert. Jeder gewinnt!quelle
thead th { position: sticky; top: 0; }
. Können wir diese Antwort aktualisieren, um dies klar auszudrücken?Hier ist ein jQuery-Plugin für feste Tabellenüberschriften. Dadurch kann die gesamte Seite gescrollt werden, wodurch die Kopfzeile eingefroren wird, wenn sie oben angekommen ist. Es funktioniert gut mit Twitter Bootstrap- Tabellen.
GitHub-Repository: https://github.com/oma/table-fixed-header
Es wird nicht nur der Tabelleninhalt gescrollt. Schauen Sie sich dazu andere Tools an, als eine dieser anderen Antworten. Sie entscheiden, was am besten zu Ihrem Fall passt.
quelle
Die meisten der hier veröffentlichten Lösungen erfordern jQuery. Wenn Sie nach einer Framework-unabhängigen Lösung suchen, versuchen Sie es mit Grid: http://www.matts411.com/post/grid/
Es wird auf Github hier gehostet: https://github.com/mmurph211/Grid
Es unterstützt nicht nur feste Kopf- und Fußzeilen, sondern unter anderem auch feste linke Spalten und Fußzeilen.
quelle
Die CSS-Eigenschaft
position: sticky
wird in den meisten modernen Browsern hervorragend unterstützt (ich hatte Probleme mit Edge, siehe unten).Auf diese Weise können wir das Problem fester Header ganz einfach lösen:
Safari benötigt ein Herstellerpräfix :
-webkit-sticky
.Für Firefox musste ich
min-height: 0
eines der übergeordneten Elemente hinzufügen . Ich vergesse genau, warum das nötig war.Leider scheint die Microsoft Edge-Implementierung nur teilweise zu funktionieren. Zumindest hatte ich bei meinen Tests einige flackernde und falsch ausgerichtete Tabellenzellen. Der Tisch war noch verwendbar, hatte aber erhebliche ästhetische Probleme.
quelle
position: sticky;
der Tabelle in einem div, der hatoverflow: scroll;
,overflow-x: scroll;
oderoverflow-y: scroll;
. scheint die beste und einfachste Lösung für feste Tabellenüberschriften und -spalten in modernen Browsern zu sein. Diese Antwort muss nach oben gewählt werden.Eine verfeinerte reine CSS-Bildlauftabelle
Allen reinen CSS-Lösungen, die ich bisher gesehen habe - so klug sie auch sein mögen - fehlt ein gewisses Maß an Politur oder sie funktionieren in manchen Situationen einfach nicht richtig. Also habe ich beschlossen, meine eigenen ...
Eigenschaften:
Hier sind ein paar Geigen, die die Optionen für Flüssigkeit und automatische Breite zeigen:
Flüssigkeitsbreite und -höhe (passt sich der Bildschirmgröße an): jsFiddle (Beachten Sie, dass die Bildlaufleiste in dieser Konfiguration nur bei Bedarf angezeigt wird, sodass Sie den Rahmen möglicherweise verkleinern müssen, um ihn anzuzeigen. )
Automatische Breite, feste Höhe (einfacher in andere Inhalte zu integrieren): jsFiddle
Die Konfiguration "Automatische Breite, feste Höhe" hat wahrscheinlich mehr Anwendungsfälle, daher werde ich den folgenden Code veröffentlichen.
Die Methode, mit der ich die Kopfzeile eingefroren habe, ähnelt der von d-Pixie. Eine Erklärung finden Sie in seinem Beitrag. Es gab eine Reihe von Fehlern und Einschränkungen bei dieser Technik, die nur mit Haufen zusätzlichen CSS und ein oder zwei zusätzlichen Div-Containern behoben werden konnten.
quelle
Ein einfaches jQuery-Plugin
Dies ist eine Variation von Mahes 'Lösung. Sie können es so nennen
$('table#foo').scrollableTable();
Die Idee ist:
thead
undtbody
in separatetable
Elementetable
in adiv.scrollable
div.scrollable
tatsächlich zu scrollenDas CSS könnte sein:
Vorsichtsmaßnahmen
Das heißt, es funktioniert für meine Zwecke und Sie können es nehmen und ändern.
Hier ist das Plugin:
quelle
:) :)
Nicht so sauber, aber reine HTML / CSS-Lösung.
Aktualisiert für IE8 + JSFiddle-Beispiel
quelle
Unterstützung für feste Fußzeile
Ich habe Nathans Funktion erweitert, um auch eine feste Fußzeile und maximale Höhe zu unterstützen. Außerdem legt die Funktion das CSS selbst fest, und Sie müssen nur eine Breite unterstützen.
Verwendung:
Feste Höhe:
Maximale Höhe (wenn der Browser die CSS-Option 'max-height' unterstützt):
Skript:
quelle
Irgendwie habe ich
Position:Sticky
gut an meinem Fall gearbeitet:quelle
Zwei Divs, einer für Header, einer für Daten. Machen Sie das Daten-Div scrollbar und verwenden Sie JavaScript, um die Breite der Spalten in der Kopfzeile so einzustellen, dass sie mit den Breiten in den Daten übereinstimmt. Ich denke, die Breite der Datenspalten muss fest und nicht dynamisch sein.
quelle
Mir ist klar, dass die Frage JavaScript zulässt, aber hier ist eine reine CSS-Lösung, die ich ausgearbeitet habe und die es auch ermöglicht, die Tabelle horizontal zu erweitern. Es wurde mit Internet Explorer 10 und den neuesten Chrome- und Firefox-Browsern getestet. Ein Link zu jsFiddle befindet sich unten.
Der HTML:
Und das CSS:
http://jsfiddle.net/HNHRv/3/
quelle
Für diejenigen, die die nette Lösung von Maximilian Hils ausprobiert haben und es nicht geschafft haben, sie mit Internet Explorer zum Laufen zu bringen, hatte ich das gleiche Problem (Internet Explorer 11) und fand heraus, was das Problem war.
In Internet Explorer 11 funktioniert die Stilumwandlung (zumindest mit Übersetzen) nicht
<THEAD>
. Ich habe dies gelöst, indem ich stattdessen den Stil auf alle<TH>
in einer Schleife angewendet habe. Das hat funktioniert. Mein JavaScript-Code sieht folgendermaßen aus:In meinem Fall war die Tabelle eine GridView in ASP.NET. Zuerst dachte ich, es sei, weil es keine hatte
<THEAD>
, aber selbst als ich es zwang, eine zu haben, funktionierte es nicht. Dann habe ich herausgefunden, was ich oben geschrieben habe.Es ist eine sehr schöne und einfache Lösung. Auf Chrome ist es perfekt, auf Firefox etwas ruckelig und auf Internet Explorer noch ruckeliger. Aber alles in allem eine gute Lösung.
quelle
Ich wünschte, ich hätte früher die Lösung von @ Mark gefunden, aber ich habe meine eigene geschrieben, bevor ich diese SO-Frage sah ...
Mine ist ein sehr leichtes jQuery-Plugin, das feste Kopf- und Fußzeilen, Spaltenüberspannungen (Colspan), Größenänderung, horizontales Scrollen und eine optionale Anzahl von Zeilen unterstützt, die angezeigt werden sollen, bevor das Scrollen beginnt.
jQuery.scrollTableBody (GitHub)
Solange Sie mit dem richtigen eine Tabelle
<thead>
,<tbody>
und (optional)<tfoot>
, alles , was Sie tun müssen, ist dies:quelle
Ich habe diese Problemumgehung gefunden - Kopfzeile in einer Tabelle über Tabelle mit Daten verschieben:
quelle
Wenn Sie das jQuery-Plugin von StickyTableHeaders auf die Tabelle anwenden, bleiben die Spaltenüberschriften beim Scrollen am oberen Rand des Ansichtsfensters erhalten.
Beispiel:
quelle
Ich mag die Antwort von Maximillian Hils, aber ich hatte einige Probleme:
Um das Flackern zu beseitigen, warte ich mit einer Zeitüberschreitung, bis der Benutzer den Bildlauf beendet hat, und wende dann die Transformation an, sodass die Kopfzeile beim Bildlauf nicht sichtbar ist.
Ich habe dies auch mit jQuery geschrieben. Ein Vorteil davon ist, dass jQuery Herstellerpräfixe für Sie verarbeiten sollte
Die Tabelle wird mit der Klasse in ein Div eingeschlossen
table-container-fixed
.Ich habe den Rahmenkollaps so eingestellt, dass er getrennt wird, da sonst während der Übersetzung Rahmen verloren gehen, und ich entferne den Rand in der Tabelle, um zu verhindern, dass Inhalte direkt über der Zelle angezeigt werden, in der sich der Rahmen während des Bildlaufs befand.
Ich mache den
th
Hintergrund weiß, um die Zellen darunter zu bedecken, und füge einen Rand hinzu, der dem Tabellenrand entspricht - der mit Bootstrap gestaltet und aus der Ansicht gescrollt wird.quelle
Verwenden Sie die neueste Version von jQuery und fügen Sie den folgenden JavaScript-Code hinzu.
quelle
Dies ist keine exakte Lösung für die feste Kopfzeile, aber ich habe eine ziemlich ausgeklügelte Methode entwickelt, um die Kopfzeile in der langen Tabelle zu wiederholen und dennoch die Sortierfähigkeit beizubehalten.
Diese nette kleine Option erfordert das jQuery-
tablesorter
Plugin . So funktioniert das:HTML
Offensichtlich hat meine Tabelle viel mehr Zeilen als diese. 193 um genau zu sein, aber Sie können sehen, wo sich die Kopfzeile wiederholt. Die sich wiederholende Kopfzeile wird durch diese Funktion eingerichtet:
jQuery
quelle
Viele Leute scheinen nach dieser Antwort zu suchen. Ich fand es in einer Antwort auf eine andere Frage begraben: Synchronisieren der Spaltenbreite zwischen Tabellen in zwei verschiedenen Frames usw.
Von den Dutzenden von Methoden, die ich ausprobiert habe, ist dies die einzige Methode, die ich gefunden habe und die zuverlässig funktioniert, damit Sie eine scrollende untere Tabelle mit derselben Headertabelle haben können.
Hier ist, wie ich es gemacht habe. Zuerst habe ich die obige jsfiddle verbessert, um diese Funktion zu erstellen, die sowohl für
td
als auch fürth
(falls dies andere auslöst, die für die Gestaltungth
ihrer Kopfzeilen verwendet werden) funktioniert .Als Nächstes müssen Sie zwei Tabellen erstellen. HINWEIS: Die Kopfzeilentabelle sollte ein zusätzliches
TD
Element enthalten, um in der oberen Tabelle Platz für die Bildlaufleiste zu lassen.Dann mach so etwas wie:
Dies ist die einzige Lösung, die ich bei Stack Overflow gefunden habe und die sich aus vielen ähnlichen Fragen ergibt, die in allen meinen Fällen gestellt wurden.
Zum Beispiel habe ich das jQuery Stickytables-Plugin ausprobiert, das nicht mit Durandal funktioniert, und das Google Code-Projekt hier https://code.google.com/p/js-scroll-table-header/issues/detail?id=2
Andere Lösungen, bei denen die Tabellen geklont werden, eine schlechte Leistung aufweisen oder saugen und nicht in allen Fällen funktionieren.
Diese übermäßig komplexen Lösungen sind nicht erforderlich. Erstellen Sie einfach zwei Tabellen wie in den folgenden Beispielen und rufen Sie die hier beschriebene Funktion setHeaderTableWidth auf, und schon sind Sie fertig .
Wenn dies bei Ihnen nicht funktioniert, haben Sie wahrscheinlich mit Ihrer CSS-Box-Sizing-Eigenschaft gespielt und müssen sie korrekt einstellen. Es ist leicht, Ihren CSS-Inhalt versehentlich zu vermasseln. Es gibt viele Dinge, die schief gehen können. Seien Sie sich dessen einfach bewusst. Dieser Ansatz funktioniert bei mir .
quelle
Hier ist eine Lösung, mit der wir letztendlich gearbeitet haben (um einige Randfälle und ältere Versionen von Internet Explorer zu behandeln, haben wir schließlich auch die Titelleiste beim Scrollen ausgeblendet und sie dann wieder eingeblendet, wenn der Bildlauf endet, jedoch in Firefox- und WebKit-Browsern Diese Lösung funktioniert einfach . Sie setzt einen Grenzkollaps voraus: Kollaps.
Der Schlüssel zu dieser Lösung ist , dass , sobald Sie gelten border-collapse , CSS - Transformationen auf dem Kopf arbeiten, so ist es nur eine Frage der Scroll - Ereignisse abfangen und die korrekte Transformation zu setzen. Sie müssen nichts duplizieren. Wenn dieses Verhalten nicht ordnungsgemäß im Browser implementiert wird, kann man sich kaum eine leichtere Lösung vorstellen.
JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/
Es ist als einfaches jQuery-Plugin implementiert. Sie machen Ihren Thead einfach mit einem Anruf wie $ ('Thead'). Sticky () klebrig, und sie hängen herum. Es funktioniert für mehrere Tabellen auf einer Seite und Kopfabschnitte auf halber Höhe großer Tabellen.
quelle
border: 2px solid red;
zuth
, blättern, und Sie werden das Problem sehen. Ich habe mir diese grundlegendere Lösung selbst ausgedachtHier ist eine verbesserte Antwort auf die von Maximilian Hils .
Dieser funktioniert in Internet Explorer 11 ohne Flackern:
quelle
Ich habe ein einfaches, leichtes jQuery-Plug-In entwickelt, mit dem eine gut formatierte HTML-Tabelle in eine scrollbare Tabelle mit festem Tabellenkopf und Spalten konvertiert werden kann.
Das Plugin funktioniert gut, um die Pixel-zu-Pixel-Positionierung des festen Abschnitts mit dem scrollbaren Abschnitt abzugleichen. Darüber hinaus können Sie auch die Anzahl der Spalten einfrieren, die beim horizontalen Scrollen immer angezeigt werden.
Demo & Dokumentation: http://meetselva.github.io/fixed-table-rows-cols/
GitHub-Repository: https://github.com/meetselva/fixed-table-rows-cols
Nachfolgend finden Sie die Verwendung für eine einfache Tabelle mit einem festen Header.
quelle
quelle
Zusätzlich zur Antwort von @Daniel Waltrip. Die Tabelle muss mit div eingeschlossen
position: relative
werden, um mit arbeiten zu könnenposition:sticky
. Deshalb möchte ich hier meinen Beispielcode veröffentlichen.CSS
HTML
Demo
quelle