2016-03-26 15 views
1

Ich habe eine HTML-Tabelle mit einer großen Anzahl von Zeilen. Ich möchte immer eine bestimmte Zeile auf dem Bildschirm sehen, die am unteren Rand der Seite gesperrt ist, wenn die aktuelle Position der Zeile gerade vom unteren Bildschirmrand gescrollt und am oberen Rand der Seite gesperrt ist, wenn sie tatsächlich positioniert ist scrollt gerade oben auf dem Bildschirm. Während die aktuelle Position der Zeile auf dem Bildschirm sichtbar ist, sollte sie normal als Teil der Tabelle durchlaufen.Halten Sie eine HTML-Tabellenzeile auf dem Bildschirm dauerhaft sichtbar

Wie kann ich dies mit CSS und JavaScript erreichen?

+0

Haben Sie Scrollspy oder ähnliche Plugins ausprobiert? – mmgross

+0

Was Sie wollen, ist wahrscheinlich eine eingefrorene/gesperrte Tabellenzeile. [Hier] (http://brentmuir.com/projects/freezeheader/demo.html) und [hier] (http://kjell.haxx.se/tablelock/) sind Demos solcher Effekte – zgood

+0

@zgood Ja, das ist die Art der Wirkung bin ich nach aber für eine Reihe in der Mitte des Tisches und nicht den Kopf. –

Antwort

1

Dieses Beispiel ist etwas grob, aber sollte Ihnen etwas geben, was Sie suchen. Sie müssten <tr> angeben, dass Sie die Klasse "sticky" einfrieren/sperren und ein Ereignis an das Dokument-Scroll-Ereignis anhängen möchten, um zu überwachen, wann das sticky-Element in Sicht kommt und die Position umgestellt wird.

Sehen Sie diese fiddle

JS

$(function() { 

    $(document).scroll(function() { 
    var $stickyRow = $('tr.sticky'), 
     $anchor = $stickyRow.next(); 

    $stickyRow.removeClass('fixed top bottom'); 

    if (!isScrolledIntoView($anchor)) { 
     var orientation = ($anchor.offset().top < $(window).scrollTop()) ? 'top' : 'bottom'; 
     $stickyRow.addClass('fixed ' + orientation); 
    } 
    }); 

}); 

function isScrolledIntoView($elem) { 
    var $window = $(window); 

    var docViewTop = $window.scrollTop(); 
    var docViewBottom = docViewTop + $window.height(); 

    var elemTop = $elem.offset().top; 
    var elemBottom = elemTop + $elem.height(); 

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); 
} 

CSS

tr.fixed { 
    position: fixed; 
    bottom: 0; 
} 

tr.fixed.bottom { 
    bottom: 0; 
} 

tr.fixed.top { 
    top: 0; 
} 

Die Funktion isScrolledIntoView von this StackOverflow answer kommt. Beachten Sie auch, dass ich überprüfe, ob die klebrigsten Zeilen, die am nächsten sind ($stickyRow.next()), angezeigt werden, weil ich sie als Ankerpunkt verwende.

0

Wenn die Tabelle immer größer als der Bildschirm ist, tun Sie dies mit nur CSS. In einer Tabelle wie:

<table> 
     <tr> 
      <td>one</td> 
      <td>two</td> 
      <td>three</td> 
      <td>four</td> 
      <td>five</td> 
     </tr> 
     <tr style="position: fixed; bottom: 0;"> 
      <td>sticky one</td> 
      <td>sticky two</td> 
      <td>sticky three</td> 
      <td>sticky four</td> 
      <td>sticky five</td> 
     </tr> 
</table> 

Der Stil in der letzten Zeile wird es am Ende der Seite bleiben.

EDIT:

Um diesen nur Stick an den unteren Rand des Bildschirms zu machen, wenn die Tabelle größer als der Bildschirm ist, anstelle des Inline-Stil (oder expliziten CSS) können einfache Javascript verwendet werden diese Stile hinzufügen :

Dies ist nicht dynamisch, könnte aber leicht gemacht werden, indem die Höhe eines Ereignisses erneut überprüft wird.

+0

_ "Während die aktuelle Position der Zeile auf dem Bildschirm sichtbar ist, sollte sie normal als Teil der Tabelle durchlaufen." _ Wenn sie dauerhaft am unteren Rand der Seite fixiert ist, wie kann sie dies erreichen? – zgood

+0

Sie benötigen Javascript, um den Offset der Zeile zu berechnen, wenn Sie scrollen, um festzustellen, ob sie sichtbar ist oder nicht, und dann "Position: Fest;" entsprechend ein- oder ausschalten. – zgood

Verwandte Themen