jquery: $ (okno) .scrollTop (), ale nie $ (okno) .scrollBottom ()

86

Chcę umieścić element na dole strony za każdym razem, gdy użytkownik przewinie stronę. To jest jak „fixed position”, ale nie mogę użyć „position: fixed” css, ponieważ wiele przeglądarek moich klientów tego nie obsługuje.

Zauważyłem, że jQuery może uzyskać najwyższą pozycję bieżącej rzutni, ale jak mogę uzyskać dolną część rzutni przewijania?

Więc pytam skąd wiedzieć: $ (okno) .scrollBottom ()

Bin Chen
źródło

Odpowiedzi:

148
var scrollBottom = $(window).scrollTop() + $(window).height();
David Tang
źródło
17
można by pomyśleć, że gdyby to było tak proste, jak to, mogłoby być zawarte w podstawowym frameworku jako .scrollBottom (). Dziwne ...
Curt,
38
scroll Topto liczba pikseli w pionie od dokumentu Topdo widocznego okna Top. W przeciwieństwie do przewijania Top, przewijanie Bottompowinno mierzyć liczbę pikseli w pionie od dokumentu Bottomdo widocznego okna Bottom(tj. Odpowiedź Alfreda poniżej). Co to daje to # pionowych pikseli z dokumentu _top_do widocznego okna Bottom. Jest to na pewno przydatne, choć nie można tego nazwać odwrotnie niż ScrollBottom (wiem, że to zaznaczona odpowiedź, ale dla przyszłych czytelników takich jak ja)
DeepSpace101
1
To rozwiązanie nie zadziała, jeśli odległość od góry może się zmieniać. Na przykład, jeśli mam <div>, który musi znajdować się w pewnej odległości od dołu strony, a strona zawiera elementy rozwijane / zwijane, zmieni to wysokość ciała, a tym samym odległość od dołu.
crash Springfield
@crashspringfield Właściwie to inne pytanie. To pytanie dotyczy umieszczania elementów w dolnej części rzutni, a nie na dole strony.
iPherian
88

Powiedziałbym, że scrollBottom jako bezpośrednie przeciwieństwo scrollTop powinno wyglądać następująco:

var scrollBottom = $(document).height() - $(window).height() - $(window).scrollTop();

Oto mały, brzydki test, który działa dla mnie:

// SCROLLTESTER START //
$('<h1 id="st" style="position: fixed; right: 25px; bottom: 25px;"></h1>').insertAfter('body');

$(window).scroll(function () {
  var st = $(window).scrollTop();
  var scrollBottom = $(document).height() - $(window).height() - $(window).scrollTop();

  $('#st').replaceWith('<h1 id="st" style="position: fixed; right: 25px; bottom: 25px;">scrollTop: ' + st + '<br>scrollBottom: ' + scrollBottom + '</h1>');
});
// SCROLLTESTER END //
Alfred
źródło
2
Idealnie, właśnie tego szukałem ... Dziękuję!
ℛɑƒæĿᴿᴹᴿ
9

Na przyszłość zrobiłem scrollBottom we wtyczkę jquery, której można używać w ten sam sposób co scrollTop (tj. Możesz ustawić liczbę i przewinie tę ilość od dołu strony i zwróci liczbę pikseli od dołu strony lub zwróć liczbę pikseli od dołu strony, jeśli nie podano liczby)

$.fn.scrollBottom = function(scroll){
  if(typeof scroll === 'number'){
    window.scrollTo(0,$(document).height() - $(window).height() - scroll);
    return $(document).height() - $(window).height() - scroll;
  } else {
    return $(document).height() - $(window).height() - $(window).scrollTop();
  }
}
//Basic Usage
$(window).scrollBottom(500);
Zefir
źródło
4
var scrollBottom =
    $(document).height() - $(window).height() - $(window).scrollTop();

Myślę, że lepiej jest mieć dolne przewijanie.

pb2q
źródło
2

Spowoduje to przewinięcie na samą górę:

$(window).animate({scrollTop: 0});

Spowoduje to przewinięcie na sam dół:

$(window).animate({scrollTop: $(document).height() + $(window).height()});

.. w razie potrzeby zmień okno na żądany identyfikator lub klasę kontenera (w cudzysłowach).

snoop_dog
źródło
Jak animować do dołu elementu div o stałej wysokości, overflow-y: autoaby faktycznie przewijał się do końca tekstu (który wykracza poza wysokość elementu div)?
user1063287
Zaktualizuj moje pytanie na wypadek, gdyby pomogło to komukolwiek innemu: Myślę, że właściwość do użycia może być scrollHeight- patrz: stackoverflow.com/q/7381817
user1063287
0

Oto najlepsza opcja przewiń do dołu dla siatki tabeli, zostanie przewinięta do ostatniego wiersza siatki tabeli:

 $('.add-row-btn').click(function () {
     var tempheight = $('#PtsGrid > table').height();
     $('#PtsGrid').animate({
         scrollTop: tempheight
         //scrollTop: $(".scroll-bottom").offset().top
     }, 'slow');
 });
SantoshK
źródło
0
// Back to bottom button
$(window).scroll(function () {
    var scrollBottom = $(this).scrollTop() + $(this).height();
    var scrollTop = $(this).scrollTop();
    var pageHeight = $('html, body').height();//Fixed

    if ($(this).scrollTop() > pageHeight - 700) {
        $('.back-to-bottom').fadeOut('slow');
    } else {
        if ($(this).scrollTop() < 100) {
            $('.back-to-bottom').fadeOut('slow');
        }
        else {
            $('.back-to-bottom').fadeIn('slow');
        }
    }
});
$('.back-to-bottom').click(function () {
    var pageHeight = $('html, body').height();//Fixed
    $('html, body').animate({ scrollTop: pageHeight }, 1500, 'easeInOutExpo');
    return false;
});
Ghebrehiywet
źródło
0

próbować:

 $(window).scrollTop( $('body').height() );
user944550
źródło
0
var scrolltobottom = document.documentElement.scrollHeight - $(this).outerHeight() - $(this).scrollTop();
gzenakos
źródło
2
Proszę unikać odpowiedzi tylko kodem i podać wyjaśnienie.
Mickael B.
-3

To szybki hack: po prostu przypisz wartość przewijania do bardzo dużej liczby. Zapewni to przewinięcie strony do dołu. Używając zwykłego javascript:

document.body.scrollTop = 100000;
odłączony
źródło
To nie zadziała na stronach dłuższych niż 100000 pikseli. Może się to wydawać dość skrajnym przypadkiem, jednak w przypadkach takich jak niekończące się przewijanie stron nie jest to takie nieprawdopodobne. Jeśli naprawdę potrzebujesz rozwiązania bez jQuery, ta odpowiedź może być lepszą opcją.
lucash
tak, chodzi o to, aby użyć jak największej liczby, powiedzmy 999999999999999999999999999999.
unplugged