Ich muss eine HTML-Tabelle (oder etwas ähnlich aussehendes) mit einem festen Header und einer festen ersten Spalte erstellen.
Jede Lösung, die ich bisher gesehen habe, verwendet Javascript oder jQuery
zum Festlegen von scrollTop / scrollLeft, funktioniert jedoch in mobilen Browsern nicht reibungslos. Daher suche ich nach einer reinen CSS-Lösung.
Ich habe hier eine Lösung für eine feste Spalte gefunden: jsfiddle.net/C8Dtf/20/, aber ich weiß nicht, wie ich sie verbessern kann, um auch den Header zu reparieren .
Ich möchte, dass es in Webkit-Browsern funktioniert oder einige css3
Funktionen verwendet, aber ich wiederhole, ich möchte es nicht Javascript
zum Scrollen verwenden.
BEARBEITEN: Dies ist ein Beispiel für das Verhalten, das ich erreichen möchte: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/FixedColumns/css_size.html
quelle
position
Verhalten auf Zeilen und Zellen anzuwenden , aber ich verstehe nicht ganz, wo es anwendbar ist oder nicht.Antworten:
Eine echte reine CSS-Lösung mit einer festen Kopfzeile und einer ersten Spalte
Ich musste eine Tabelle mit einem festen Header und einer festen ersten Spalte mit reinem CSS erstellen, und keine der Antworten hier war genau das, was ich wollte.
Die
position: sticky
Eigenschaft unterstützt sowohl das Festhalten an der Oberseite (wie ich am häufigsten gesehen habe) als auch an der Seite in modernen Versionen von Chrome, Firefox und Edge. Dies kann mit einem kombiniert werdendiv
, das dieoverflow: scroll
Eigenschaft hat, Ihnen eine Tabelle mit festen Überschriften zu geben, die an einer beliebigen Stelle auf Ihrer Seite platziert werden kann:Stellen Sie Ihren Tisch in einen Behälter:
Verwenden Sie
overflow: scroll
auf Ihrem Container, um das Scrollen zu aktivieren:Wie Dagmar in den Kommentaren betonte, benötigt der Container auch a
max-width
und amax-height
.Verwenden
position: sticky
Tabelle Zellen kleben an der Kante undtop
,right
oderleft
zu wählen , die Kante zu Stick:Wie MarredCheese in den Kommentaren erwähnt hat, können Sie, wenn Ihre erste Spalte
<td>
Elemente anstelle von<th>
Elementen enthält, diesetbody td:first-child
in Ihrem CSS anstelle von verwendentbody th
Verwenden Sie Folgendes, damit die Überschrift in der ersten Spalte links bleibt:
Code-Snippet anzeigen
https://jsfiddle.net/qwubvg9m/1/
quelle
width
Ihrer ersten Spalte kennen, können Sie sieposition: sticky
für die Zellen in Ihrer zweiten Spalte mit einemleft
Wert verwenden, der dem Ihrer ersten Spalte entsprichtwidth
: jsfiddle.net/wvypo83c/794<td>
Elemente anstelle von<th>
Elementen enthält, diesetbody td:first-child
in Ihrem CSS anstelle von verwenden könnentbody th
.Heutzutage ist dies nur mit Eigenschaft mit CSS möglich .
position: sticky
Hier geht ein Ausschnitt:
(jsFiddle: https://jsfiddle.net/hbqzdzdt/5/ )
In Bezug auf die Kompatibilität. Es funktioniert in allen gängigen Browsern, jedoch nicht im IE. Es gibt eine Polyfüllung für,
position: sticky
aber ich habe es nie versucht.quelle
Das ist keine leichte Aufgabe.
Der folgende Link führt zu einer funktionierenden Demo:
Link Aktualisiert gemäß dem Kommentar von lanoxx
http://jsfiddle.net/C8Dtf/366/
Denken Sie daran, diese hinzuzufügen:
Ich sehe keinen anderen Weg, dies zu erreichen. Vor allem nicht nur mit CSS.
Das ist viel zu durchmachen. Hoffe das hilft :)
quelle
"bFilter": false
"bInfo" : false
in den.dataTable()
Aufruf einthead
befindet sich in einer eigenen Tabelle, die nicht an Änderungen vontd
Elementen gebunden ist. Wenn also ein Zellentext lang ist, wird dieth
Breite nicht entsprechend angepasst.Alle diese Vorschläge sind großartig und alle, aber sie reparieren entweder nur den Header oder eine Spalte, nicht beide, oder sie verwenden Javascript. Der Grund - es glaubt nicht, dass es in reinem CSS gemacht werden kann. Der Grund:
Wenn dies möglich wäre, müssten Sie mehrere scrollbare Divs ineinander verschachteln, die jeweils einen Scroll in eine andere Richtung aufweisen. Dann müssten Sie Ihre Tabelle in drei Teile aufteilen - den festen Header, die feste Spalte und den Rest der Daten.
Fein. Aber jetzt das Problem - Sie können dafür sorgen, dass einer von ihnen beim Scrollen in Position bleibt, der andere befindet sich jedoch im Bildlaufbereich von first und kann daher selbst außer Sichtweite gescrollt werden, sodass er nicht fixiert werden kann der Bildschirm. "Ah-ha", sagst du, "aber ich kann irgendwie die absolute oder feste Position verwenden, um das zu tun" - nein, das kannst du nicht. Sobald Sie dies tun, verlieren Sie die Fähigkeit, diesen Container zu scrollen. Es ist eine Henne-Ei-Situation - man kann nicht beide haben, sie heben sich gegenseitig auf.
Ich glaube, die einzige Lösung ist Javascript. Sie müssen die drei Elemente vollständig trennen und ihre Positionen durch Javascript synchron halten. Es gibt gute Beispiele in anderen Beiträgen auf dieser Seite. Dieser ist auch einen Blick wert:
http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/
quelle
Ich habe einige Änderungen in jsfiddle vorgenommen. Dies könnte das sein, was Sie versuchen zu tun.
Ich habe die Titel so fest codiert:
Und ich habe auch einige Stile hinzugefügt.
Hoffe das ist was du willst :)
quelle
Ein Beispiel, das nur CSS verwendet:
quelle
div
. Es ist diediv
, die die Zeilen Scrollen während des Header bleibt an der gleichen Stelle erlaubt. Dieser Ansatz funktionierte für meine Bedürfnisse.Um sowohl Kopfzeilen als auch Spalten zu reparieren, können Sie das folgende Plugin verwenden:
Aktualisiert im Juli 2019
Kürzlich wurde auch eine reine CSS-Lösung entwickelt , die auf der CSS-Eigenschaft
position: sticky;
( hier für weitere Details) basiert und auf jedesTH
Element (anstelle des übergeordneten Containers) angewendet wird.quelle
Ich habe eine ausgezeichnete Lösung von Paul O'Brien für das Problem gefunden und möchte den Link teilen: https://codepen.io/paulobrien/pen/LBrMxa
Ich habe den Stil für die Fußzeile entfernt:
quelle
Ich musste kürzlich eine Lösung mit einer festen Kopfgruppe und einer festen ersten Spalte erstellen. Ich teilte meine Tabelle in divs auf und verwendete jquery, um das Scrollen im Fenster zu erfassen.
http://jsfiddle.net/TinT/EzXub/2346/
quelle
Ein Mitarbeiter und ich haben gerade ein neues GitHub-Projekt veröffentlicht, das eine Angular-Direktive enthält, mit der Sie Ihre Tabelle mit festen Überschriften dekorieren können: https://github.com/objectcomputing/FixedHeader
Es basiert nur auf CSS und Angular, mit einer Direktive, die einige Divs hinzufügt. Es ist keine jQuery erforderlich.
Diese Implementierung ist nicht so umfassend wie einige andere Implementierungen. Wenn Sie jedoch lediglich feste Tabellen hinzufügen möchten, ist dies möglicherweise eine gute Option.
quelle
Nach zwei Tagen Kampf mit Internet Explorer 9 + Chrome + Firefox (Windows) und Safari (Mac) habe ich ein System gefunden, das ist
Ergebnis:
HTML:
CSS:
quelle
div.cost_center table{border-collapse: collapse;}
und die dritte Beschriftung muss etwas sein, das in die 60px (in diesem Beispiel) passtDie vorhandenen Antworten passen zu den meisten Menschen, aber für diejenigen, die Schatten unter der festen Überschrift und rechts von der ersten (festen) Spalte hinzufügen möchten , ist hier ein Arbeitsbeispiel (reines CSS):
http://jsbin.com/nayifepaxo/1/edit?html,output
Der wichtigste Trick dies zu Arbeit in immer wird mit
::after
Schatten rechts von jedem der ersten hinzuzufügentd
in jedemtr
:Ich habe eine Weile gebraucht (zu lange ...), um alles zum Laufen zu bringen, also dachte ich mir, ich würde es für diejenigen teilen, die sich in einer ähnlichen Situation befinden.
quelle
Code-Snippet anzeigen
Kopfzeile müssen korrigiert werden
quelle
So etwas könnte für Sie funktionieren ... Es wird wahrscheinlich erforderlich sein, dass Sie Spaltenbreiten für Ihre Kopfzeile festgelegt haben.
http://jsfiddle.net/vkhNC/
Aktualisieren:
Ich bin nicht davon überzeugt, dass das von Ihnen gegebene Beispiel nur mit CSS möglich ist. Ich würde es lieben, wenn jemand mir das Gegenteil beweisen würde. Folgendes habe ich bisher . Es ist nicht das fertige Produkt, aber es könnte ein Anfang für Sie sein. Ich hoffe, dies weist Sie in eine hilfreiche Richtung, wo immer das auch sein mag.
quelle
Eine andere Lösung ist die Verwendung von AngularJS. Das AngularUI-Modul verfügt über eine Direktive namens
ng-grid
, die eine Funktion namens Column Pinning unterstützt. Es ist kein 100% reines CSS, aber auch nicht die anderen Lösungen.http://angular-ui.github.io/ng-grid/#columnPinning
quelle
Beispiel für reines CSS:
http://jsfiddle.net/cCarlson/L98m854d/
Nachteil: Die feste Header-Struktur / Logik hängt ziemlich stark von bestimmten Dimensionen ab, sodass Abstraktion wahrscheinlich keine praktikable Option ist .
quelle
Position: Sticky funktioniert nicht für einige Elemente wie (Thead) in Chrome und andere Webkit-Browser wie Safari.
Aber es funktioniert gut mit (th)
Oder besuchen Sie mein Codepen-Beispiel :
quelle
Ich denke, das wird Ihnen helfen: https://datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html
Kurz gesagt, wenn Sie wissen, wie eine Datentabelle erstellt wird, müssen Sie nur diese jQuery-Zeile ganz unten hinzufügen:
bottom: true // dient dazu, den Bottom-Header ebenfalls zu fixieren.
quelle
Wenn Sie nur reines HTML und CSS verwenden möchten, habe ich eine Lösung für Ihr Problem:
In dieser jsFiddle sehen Sie eine Nicht-Skript-Lösung, die eine Tabelle mit einem festen Header bereitstellt. Es sollte kein Problem sein, das Markup auch für eine feste erste Spalte anzupassen. Sie müssten nur eine absolut positionierte Tabelle für die erste Spalte innerhalb von
hWrapper
-div erstellen und -div neuvWrapper
positionieren.Das Bereitstellen von dynamischem Inhalt sollte mit serverseitigen oder browser-seitigen Versuchungsmodulen kein Problem darstellen. Meine Lösung funktioniert in allen modernen Browsern und älteren Browsern ab IE8 gut.
quelle
Müssen nur den Stil ändern als
Demo: https://plnkr.co/edit/Qxy5RMJBXmkaJAOjBtQn?p=preview
quelle