Ich möchte in der Lage sein, die Präsentation einer HTML-Tabelle zu "optimieren", um eine einzelne Funktion hinzuzufügen: Wenn Sie durch die Seite scrollen, sodass die Tabelle auf dem Bildschirm angezeigt wird, die Kopfzeilen jedoch außerhalb des Bildschirms liegen, möchte ich, dass die Kopfzeilen erhalten bleiben oben im Anzeigebereich sichtbar.
Dies entspricht konzeptionell der Funktion "Fenster einfrieren" in Excel. Eine HTML-Seite kann jedoch mehrere Tabellen enthalten, und ich möchte, dass dies nur für die Tabelle geschieht, die derzeit angezeigt wird, nur während sie angezeigt wird.
Hinweis: Ich habe eine Lösung gesehen, bei der der Tabellendatenbereich scrollbar gemacht wird, während die Überschriften nicht scrollen. Das ist nicht die Lösung, nach der ich suche.
quelle
Antworten:
Schauen Sie sich jQuery.floatThead ( Demos verfügbar ) an, das sehr cool ist, auch mit DataTables funktioniert und sogar in einem
overflow: auto
Container funktioniert .quelle
Ich habe mit jQuery eine Proof-of-Concept-Lösung erstellt .
Beispiel hier ansehen.
Ich habe diesen Code jetzt in einem Mercurial Bitbucket-Repository . Die Hauptdatei ist
tables.html
.Mir ist ein Problem dabei bekannt: Wenn die Tabelle Anker enthält und Sie die URL mit dem angegebenen Anker in einem Browser öffnen, wird die Zeile mit dem Anker beim Laden der Seite wahrscheinlich durch den schwebenden Header verdeckt.
Update 11.12.2017: Ich sehe, dass dies mit dem aktuellen Firefox (57) und Chrome (63) nicht funktioniert. Ich bin mir nicht sicher, wann und warum dies nicht mehr funktioniert oder wie es behoben werden kann. Aber jetzt denke ich, dass die akzeptierte Antwort von Hendy Irawan überlegen ist.
quelle
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
,floatingHeaderRow.css("top", scrollTop + "px");
da mit dem Code, den Sie hatten, der Tabellenkopf weiter nach unten sprang, um schließlich von der Seite zu verschwinden.// Copy cell widths from original header
Teil des Codes). @Craig McQueen, bitte bearbeiten Sie Ihre Antwort, damit niemand diesen Fehler macht.Craig, ich habe deinen Code ein wenig verfeinert (unter anderem verwendet er jetzt position: fixed) und ihn als jQuery-Plugin verpackt.
Probieren Sie es hier aus: http://jsfiddle.net/jmosbech/stFcx/
Die Quelle finden Sie hier: https://github.com/jmosbech/StickyTableHeaders
quelle
Wenn Sie auf moderne CSS3-kompatible Browser abzielen (Browserunterstützung : https://caniuse.com/#feat=css-sticky ), können Sie verwenden
position:sticky
, für die kein JS erforderlich ist und das Tabellenlayout nicht fehlerhaft ausgerichtet wird und td derselben Spalte. Es ist auch keine feste Spaltenbreite erforderlich, um ordnungsgemäß zu funktionieren.Beispiel für eine einzelne Kopfzeile:
Für Köpfe mit 1 oder 2 Reihen können Sie Folgendes verwenden:
Möglicherweise müssen Sie ein wenig mit der Top- Eigenschaft des letzten untergeordneten Elements spielen und die Anzahl der Pixel ändern, um sie an die Höhe der ersten Zeile anzupassen (+ Rand + Rand + Polsterung, falls vorhanden), damit die zweite Zeile gerade nach unten bleibt unter dem ersten.
Beide Lösungen funktionieren auch dann, wenn Sie mehr als eine Tabelle auf derselben Seite haben: Das
th
Element jeder Tabelle beginnt zu kleben, wenn seine oberste Position die in der CSS-Definition angegebene ist, und verschwindet einfach, wenn alle Tabellen nach unten scrollen. Wenn es also mehr Tische gibt, funktionieren alle auf die gleiche Weise.Warum das letzte Kind vor und das erste Kind danach in der CSS verwenden?
Da CSS-Regeln vom Browser in derselben Reihenfolge gerendert werden, in der Sie sie in die CSS-Datei schreiben, und wenn Sie nur eine Zeile im Thead-Element haben, ist die erste Zeile gleichzeitig auch die letzte Zeile und die Regel für das erste untergeordnete Element erforderlich das letzte Kind zu überschreiben. Wenn nicht, haben Sie einen Versatz der Zeile 30 px vom oberen Rand, den Sie vermutlich nicht möchten.
Ein bekanntes Problem der Position: Sticky ist, dass es nicht für die Kopfelemente oder Tabellenzeilen funktioniert: Sie müssen auf die Elemente abzielen. Das Hopping dieses Problems wird in zukünftigen Browserversionen behoben.
quelle
thead tr+tr th
, um die zweite Reihe zu zielen.Mögliche Alternativen
js-float-table-headers
js-float-table-headers (Google Code)
In Drupal
Ich habe eine Drupal 6-Site. Ich war auf der Seite "Module" des Administrators und bemerkte, dass die Tabellen genau diese Funktion hatten!
Wenn man sich den Code ansieht, scheint er von einer aufgerufenen Datei implementiert zu werden
tableheader.js
. Es wendet die Funktion auf alle Tabellen mit der Klasse ansticky-enabled
.Für eine Drupal-Site möchte ich dieses
tableheader.js
Modul unverändert für Benutzerinhalte verwenden können.tableheader.js
scheint auf Benutzerinhaltsseiten in Drupal nicht vorhanden zu sein. Ich habe eine Forumsnachricht gepostet, in der ich gefragt werde, wie das Drupal-Thema so geändert werden kann, dass es verfügbar ist. Nach einer Antworttableheader.js
auf ein Drupal Thema mit hinzugefügt werden ,drupal_add_js()
in dem Thema isttemplate.php
wie folgt:quelle
Ich bin vor kurzem auf dieses Problem gestoßen. Leider musste ich 2 Tabellen erstellen, eine für den Header und eine für den Body. Es ist wahrscheinlich nicht der beste Ansatz aller Zeiten, aber hier ist:
Das hat bei mir funktioniert, es ist wahrscheinlich nicht die elegante Art, aber es funktioniert. Ich werde untersuchen, ob ich etwas besser machen kann, aber es erlaubt mehrere Tabellen.
Lesen Sie die Überlauf- Eigenschaften, um festzustellen, ob sie Ihren Anforderungen entsprechen
quelle
Dies ist wirklich eine schwierige Sache, um einen klebrigen Header auf Ihrem Tisch zu haben. Ich hatte die gleiche Anforderung, aber mit asp: GridView und dann fand ich, dass es wirklich gedacht war, einen klebrigen Header in Gridview zu haben. Es gibt viele Lösungen und ich habe 3 Tage gebraucht, um die gesamte Lösung auszuprobieren, aber keine davon konnte mich befriedigen.
Das Hauptproblem, mit dem ich bei den meisten dieser Lösungen konfrontiert war, war das Ausrichtungsproblem. Wenn Sie versuchen, den Header schwebend zu machen, gerät die Ausrichtung von Header- und Körperzellen irgendwie aus der Bahn.
Bei einigen Lösungen trat auch das Problem auf, dass Header mit den ersten Zeilen des Körpers überlappt wurden, was dazu führte, dass Körperzeilen hinter dem schwebenden Header versteckt wurden.
Also musste ich jetzt meine eigene Logik implementieren, um dies zu erreichen, obwohl ich dies auch nicht als perfekte Lösung betrachte, aber dies könnte auch für jemanden hilfreich sein,
Unten ist die Beispieltabelle.
Hinweis : Die Tabelle wird in ein DIV mit dem Klassenattribut 'Tabellenhalter' eingeschlossen.
Unten finden Sie das JQuery-Skript, das ich in meinem HTML-Seitenkopf hinzugefügt habe.
und zuletzt unten ist die CSS-Klasse für ein bisschen Farbzweck.
Die ganze Idee dieser Logik besteht also darin, die Tabelle in einem Div für Tabellenhalter zu platzieren und beim Laden der Seite einen Klon dieses Halters auf der Clientseite zu erstellen. Verstecken Sie nun den Tischkörper im Klonhalter und positionieren Sie den verbleibenden Headerteil über dem ursprünglichen Header.
Dieselbe Lösung funktioniert auch für asp: gridview. Sie müssen zwei weitere Schritte hinzufügen, um dies in gridview zu erreichen.
Setzen Sie im OnPrerender-Ereignis des Gridview-Objekts auf Ihrer Webseite den Tabellenabschnitt der Kopfzeile auf TableHeader.
Und wickeln Sie Ihr Gitter in
<div class="table-holder"></div>
.Hinweis : Wenn Ihr Header über anklickbare Steuerelemente verfügt, müssen Sie möglicherweise ein weiteres jQuery-Skript hinzufügen, um die im geklonten Header ausgelösten Ereignisse an den ursprünglichen Header zu übergeben. Dieser Code ist bereits im von jmosbech erstellten jQuery-Plugin für Sticky-Header verfügbar
quelle
Die Verwendung
display: fixed
desthead
Abschnitts sollte funktionieren, aber nur für die aktuelle Tabelle in der Ansicht, benötigen Sie die Hilfe von JavaScript. Und es wird schwierig, weil es die Bildlaufpositionen und die Position von Elementen relativ zum Ansichtsfenster herausfinden muss, was einer der Hauptbereiche der Browser-Inkompatibilität ist.Schauen Sie sich die gängigen JavaScript-Frameworks (jQuery, MooTools, YUI usw. usw.) an, um festzustellen, ob sie entweder das tun können, was Sie wollen, oder es einfacher machen, das zu tun, was Sie wollen.
quelle
position: fixed
. Entschuldigung, es hat in Chrome nicht funktioniert.Wenn Sie eine Vollbildtabelle verwenden, möchten Sie möglicherweise Folgendes für die Anzeige einstellen: behoben; und oben: 0; oder versuchen Sie einen sehr ähnlichen Ansatz über CSS.
Aktualisieren
Erstellen Sie einfach schnell eine funktionierende Lösung mit iframes (html4.0). Dieses Beispiel ist NICHT standardkonform, Sie können es jedoch problemlos beheben:
Outer.html
test.html
quelle
Die einfachste Antwort nur mit CSS: D !!!
quelle
Der von Ihnen erstellte Proof of Concept war großartig! Allerdings habe ich auch dieses jQuery-Plugin gefunden, das sehr gut zu funktionieren scheint. Ich hoffe es hilft!
quelle
Es ist frustrierend, dass das, was in einem Browser gut funktioniert, in anderen nicht funktioniert. Folgendes funktioniert in Firefox, jedoch nicht in Chrome oder IE:
quelle
px
? Ist es diese Legacy-Einheit, die von Menschen in den 90ern verwendet wurde, als ein Anzeigegerät mit 72 dpi verwendet wurde?