kkapsner
Super Moderator
Ich hab' mich mal auch ein bisschen hingesetzt - da machen die Browser echt manchmal seltsame Dinge, aber so könnte man damit arbeiten... ist zwar noch nicht perfekt, aber was soll's: Table with scrolling thead
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature currently requires accessing the site using the built-in Safari browser.
Das ist effektmäßig schon ziemlich geil! Seltsamerweise ist das Scrollen mittels Bewegung des Scrollbalkens mit der Maus bei mir auf einem schwachbrüstigen Laptop mit IE9 etwas hakelig, wenn der Browser im Vollbild läuft. Reduziere ich den Browser nur geringfügig läuft es flüssig. Obwohl die CPU laut Taskmanager nicht wesentlich in die Höhe geht.Ich hab' mich mal auch ein bisschen hingesetzt - da machen die Browser echt manchmal seltsame Dinge, aber so könnte man damit arbeiten... ist zwar noch nicht perfekt, aber was soll's: Table with scrolling thead
Die Anmerkung verstehe ich jetzt nicht so ganz. Was meinst du mit maximum Breite?Und noch eine Anmerkung: In dem Beispiel sind alle Spalten bereits auf Maximum Breite. Meine Tabellen stehen immer auf 100 % Breite und die Spalten sind häufig nicht auf Maximum, wenn die Anzeigebreite größer ist.
Dito.Die Anmerkung verstehe ich jetzt nicht so ganz. Was meinst du mit maximum Breite?
In Korbinian's Beispiel hat die Tabelle nicht die Breite 100%, es sind rechts und links Ränder. Dadurch werden alle Spalten zusammen gedrückt.Die Anmerkung verstehe ich jetzt nicht so ganz. Was meinst du mit maximum Breite?
Welcher Breiten ???Die Spalte aller Breiten sind weniger als 100 % der Anzeigebreite, sodass der Browser den restlichen Platz auf die Spalten verteilt.
Auf den ersten Blick HAMMER! Danke dir!Das ganze kann man hier testen
Ich nutze in Tabellen regelmäßig JS, um per Klick aus einem Anzeigefeld ein Eingabefeld zu machen, sende dann die Daten per Ajax zum Server und aktualisiere danach das Feld wieder zum Anzeigefeld. Fällst das auch darunter?Nicht schlecht - hatte auch schon mit dem Gedanken gespielt einfach die komplette Tabelle zu kopieren - aber das war mit nicht dynamisch genug. Wenn sich am Inhalt der Tabelle irgendwas dynamisch ändert läuft das ins Leere.
...wahrscheinlich ja oder wahrscheinlich nein für was? Ich hatte zwei Teilfragen gestelltWahrscheinlich...
Ausschließen kann ich das nicht.Also wenn die dynamischen Änderungen die Spaltenbreiten/-höhen verändern fällt das darunter.
function fixedTableHeader(tID) {
var patch = (new Date()).getTime(),
fixedHeader = false,
scrollTimeout = false,
// Get the original table and sections
jqTable = jQuery('#'+tID),
jqCaption = jqTable.find('caption'),
jqHead = jqTable.find('thead'),
// Placeholders
jqTableClone,
jqHeadClone,
jqTableWrapper,
jqTableCloneWrapper,
// Calculations
startPosLeft,
startPosTop,
endPosTop,
jqTableCloneWrapperHeight,
jqTableCloneScrollEndHeight,
jqTableWrapperCSS = {},
jqTableCloneWrapperCSS = {},
captionHeight = jqCaption.length > 0 ? jqCaption.outerHeight() : 0;
// Wrap the original table
jqTable.wrap('<div id="jqTableWrapper' + patch + '" />');
jqTableWrapper = jQuery('#jqTableWrapper' + patch);
// Validate css properties of jqTableWrapper
jqTableWrapperCSS.width = jqTable.outerWidth();
jqTableWrapperCSS.height = jqTable.outerHeight();
jqTableWrapperCSS.marginTop = jqTable.css('marginTop');
jqTableWrapperCSS.marginRight = jqTable.css('marginRight');
jqTableWrapperCSS.marginBottom = jqTable.css('marginBottom');
jqTableWrapperCSS.marginLeft = jqTable.css('marginLeft');
jqTable.css('margin', 0);
jqTableWrapperCSS.overflow = 'hidden';
switch (jqTable.css('position')) {
case 'fixed':
return;
case 'static':
jqTableWrapperCSS.position = 'relative';
break;
case 'relative':
jqTableWrapperCSS.position = 'relative';
jqTableWrapperCSS.left = jqTable.css('left');
jqTableWrapperCSS.top = jqTable.css('top');
jqTable.css('left', 0);
jqTable.css('top', 0);
break;
case 'absolute':
jqTableWrapperCSS.position = 'absolute';
jqTableWrapperCSS.left = jqTable.css('left');
jqTableWrapperCSS.top = jqTable.css('top');
jqTable.css('left', 0);
jqTable.css('top', 0);
break;
}
jqTableWrapper.css(jqTableWrapperCSS);
// Clone original table and original thead
jqTableClone = jqTable.clone();
jqHeadClone = jqHead.clone();
// Prevent double id and remove caption if one exists
jqTableClone[0].id = 'jqTableClone' + patch;
jqTableClone.find('caption').remove();
// Get needed height to show only until thead bottom
jqTableCloneWrapper = jqTableClone.clone();
jqTableCloneWrapper.find('tbody').find('tr:not(:last)').remove();
jqTableWrapper.after(jqTableCloneWrapper);
jqTableCloneScrollEndHeight = jqTableCloneWrapper.outerHeight();
jqTableCloneWrapper.find('caption').remove();
jqTableCloneWrapper.find('tfoot').remove();
jqTableCloneWrapper.find('tbody').remove();
jqTableCloneWrapper.css('borderBottom', 0);
jqTableCloneWrapperHeight = jqTableCloneWrapper.outerHeight();
jqTableCloneScrollEndHeight += captionHeight;
jqTableCloneWrapper.remove();
// Append jqTableCloneWrapper after original table
jqTable.after('<div id="jqTableCloneWrapper' + patch + '" />'
);
jqTableCloneWrapper = jQuery('#jqTableCloneWrapper' + patch);
// Validate css properties of jqTableCloneWrapper
jqTableCloneWrapperCSS.width = '100%';
jqTableCloneWrapperCSS.overflow = 'hidden';
jqTableCloneWrapperCSS.position = jqTableWrapperCSS.position === 'relative' ? 'absolute' : 'relative';
jqTableCloneWrapperCSS.left = 0;
jqTableCloneWrapperCSS.top = 0;
jqTableCloneWrapper.css(jqTableCloneWrapperCSS);
// Set jqTableCloneWrapper css properties and insert jqTableClone
jqTableCloneWrapper.css({
height: jqTableCloneWrapperHeight,
top: captionHeight
}).append(jqTableClone);
// Exchange the headers for event handling
jqTableClone.find('thead').remove();
jqTableClone.prepend(jqHead);
jqTable.prepend(jqHeadClone);
// Set values for scrolling
startPosLeft = jqTableWrapper.offset().left || jqTableWrapperCSS.left;
startPosTop = jqTableWrapper.offset().top + captionHeight || jqTableWrapperCSS.top + captionHeight;
endPosTop = startPosTop + jqTableWrapper.height() - jqTableCloneScrollEndHeight;
// Let it scroll...
jQuery(window).scroll(function () {
var animatePosition,
moveTop,
scrollPosTop = jQuery(window).scrollTop();
if (scrollTimeout) {
clearTimeout(scrollTimeout);
scrollTimeout = false;
}
animatePosition = function () {
scrollTimeout = false;
jqTableCloneWrapper.stop().animate({top: moveTop}, 400);
};
if (scrollPosTop > startPosTop) {
if (!fixedHeader) {
fixedHeader = true;
}
if (scrollPosTop < endPosTop) {
moveTop = scrollPosTop + captionHeight - startPosTop;
scrollTimeout = setTimeout(animatePosition, 50);
} else {
jqTableCloneWrapper.stop().css('top', endPosTop + captionHeight - startPosTop);
}
} else {
scrollTimeout = false;
jqTableCloneWrapper.stop().css('top', captionHeight);
fixedHeader = false;
}
});
}
Hab mal versucht über ein Debugging der Variable jqHead dahinter zu steigen. Aber das ist ein mehrfach verschachteltes Objekt, soviel JS hab ich nicht drauf.2. Der Code ermittelt in meiner Tabelle die Höhe der Kopfzeile nicht korrekt.
Nein das ist es nicht. Habe es nur zum Testen drinnen gehabt. Das Script berücksichtigt, ob ein <caption>-Tag vorhanden ist oder nicht.1. Brauche ich zwingend das <caption> Tag? Welchen Zweck erfüllt es? Ich sehe im Code, dass dessen captionHeight ermittelt wird und später ganz häufig benötigt wird.
Sollte eigentlich passen. Hast du mal ein Screenshot davon? Kannst du die Struktur der Tabelle posten? Welche Art Sortierung verwendest du (welches Script etc.)? Werden nur Zeilen im <tbody> hinzugefügt? Oder werden auch Spalten hinzugefügt?2. Der Code ermittelt in meiner Tabelle die Höhe der Kopfzeile nicht korrekt. Es wird nur ein ganz schmaler Streifen verwendet. Ich muss dazu sagen, dass ich die gelieferten CSS Definitionen nicht verwende, weil die nicht passen. Meine Frage nun, was ist ausschlaggebend für die korrekte Erkennung der Kopfzeile? <thead> und </thead> habe ich drin. Meine Kopfzeile besteht derzeit aus 8 Spalten und in jeder Zelle befindet sich eine zweizeilige <table> mit den Steuerelementen für die Sortierung. Worauf muss ich achten, dass die Kopfzeile richtig gegriffen werden kann?
Ja, siehe hier. Oben die Original Kopfzeile (Texte habe ich übermalt) und darunter sieht man den schmalen Streifen der beim Scrollen übrig istSollte eigentlich passen. Hast du mal ein Screenshot davon?
Ja, ist wie folgt (ich stelle hier im thead und tbody je nur eine Spalte dar, es sind natürlich mehr)Kannst du die Struktur der Tabelle posten?
<table>
<thead>
<tr>
<td>
<table>
<tr>
<td>
<table>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</td>
</tr>
<tr>
<td></td>
</tr>
</table>
</td>
</tr>
</thead>
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
Serverseitig. Habe Buttons in der Kopfzeile die ein <form> mit den nötigen Parametern absenden. Serverscript gibt das HTML mit sortierter Tabelle komplett fertig aus.Welche Art Sortierung verwendest du (welches Script etc.)?
Du meinst dynamisch? Keins von beidem Wenn überhaupt ändere ich nur Zelleninhalte. Zeilen oder Spalten werden nicht geändert.Werden nur Zeilen im <tbody> hinzugefügt? Oder werden auch Spalten hinzugefügt?