jquery: $ (window) .scrollTop () mais pas $ (window) .scrollBottom ()

86

Je souhaite placer un élément en bas de la page chaque fois que l'utilisateur fait défiler la page. C'est comme "position fixe" mais je ne peux pas utiliser "position: fixed" css car beaucoup de navigateurs de mes clients ne peuvent pas supporter cela.

J'ai remarqué que jquery peut obtenir la position supérieure de la fenêtre courante, mais comment puis-je obtenir le bas de la fenêtre de défilement?

Donc je demande comment savoir: $ (window) .scrollBottom ()

Bin Chen
la source

Réponses:

148
var scrollBottom = $(window).scrollTop() + $(window).height();
David Tang
la source
17
vous penseriez que si c'est aussi simple que cela, il pourrait être inclus dans le framework de base en tant que .scrollBottom (). Strange ..
Curt
38
le défilement Topcorrespond au nombre de pixels verticaux du document Topà la fenêtre visible Top. Exactement à l'opposé du scroll Top, le scroll Bottomdevrait mesurer le nombre de pixels verticaux du document Bottomà la fenêtre visible Bottom(c'est-à-dire la réponse d'Alfred ci-dessous). Qu'est - ce que cela donne est le nombre de pixels verticaux du document _top_à la fenêtre visible Bottom. C'est utile à coup sûr, mais je ne peux pas l'appeler le contraire de ScrollBottom (je sais que c'est une réponse marquée mais pour les futurs lecteurs comme moi)
DeepSpace101
1
Cette solution ne fonctionnera pas si la distance du sommet peut varier. Par exemple, si j'ai un <div> qui doit être à une certaine distance du bas de la page et que la page a des éléments extensibles / pliables, cela va changer la hauteur du corps et donc la distance du bas.
crash springfield le
@crashspringfield En fait, c'est une question différente. Cette question concerne le placement des éléments vers le bas de la fenêtre et non vers le bas de la page.
iPherian
88

Je dirais qu'un scrollBottom en tant qu'opposé direct de scrollTop devrait être:

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

Voici un petit test laid qui fonctionne pour moi:

// 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
la source
2
Parfait, c'est ce que je cherchais ... Merci!
ℛɑƒæĿᴿᴹᴿ
9

Pour l'avenir, j'ai fait de scrollBottom un plugin jquery, utilisable de la même manière que scrollTop (c'est-à-dire que vous pouvez définir un nombre et il fera défiler ce montant à partir du bas de la page et retournera le nombre de pixels à partir du bas de la page, ou, renvoie le nombre de pixels à partir du bas de la page si aucun nombre n'est fourni)

$.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);
Zéphyr
la source
4
var scrollBottom =
    $(document).height() - $(window).height() - $(window).scrollTop();

Je pense qu'il vaut mieux obtenir le défilement du bas.

pb2q
la source
2

Cela défilera tout en haut:

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

Cela défilera tout en bas:

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

.. changez la fenêtre avec l'identifiant ou la classe de conteneur souhaité si nécessaire (entre guillemets).

Snoop Dog
la source
Comment animer vers le bas d'un div à hauteur fixe avec overflow-y: autopour qu'il défile réellement vers le bas du texte (qui s'étend au-delà de la hauteur du div)?
user1063287
Mettez à jour ma question au cas où cela aiderait quelqu'un d'autre: je pense que la propriété à utiliser pourrait être scrollHeight- voir: stackoverflow.com/q/7381817
user1063287
0

Voici la meilleure option de défilement vers le bas pour la grille du tableau, elle fera défiler jusqu'à la dernière ligne de la grille du tableau:

 $('.add-row-btn').click(function () {
     var tempheight = $('#PtsGrid > table').height();
     $('#PtsGrid').animate({
         scrollTop: tempheight
         //scrollTop: $(".scroll-bottom").offset().top
     }, 'slow');
 });
SantoshK
la source
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
la source
0

essayer:

 $(window).scrollTop( $('body').height() );
user944550
la source
0
var scrolltobottom = document.documentElement.scrollHeight - $(this).outerHeight() - $(this).scrollTop();
gzenakos
la source
2
Veuillez éviter de répondre uniquement au code et fournir des explications.
Mickael B.
-3

C'est un hack rapide: attribuez simplement la valeur de défilement à un très grand nombre. Cela garantira que la page défile vers le bas. Utilisation de javascript simple:

document.body.scrollTop = 100000;
débranché
la source
Cela ne fonctionnera pas sur les pages de plus de 100 000 pixels. Cela peut sembler être un cas assez complexe, mais dans des cas comme des pages à défilement sans fin, ce n'est pas si improbable. Si vous voulez vraiment une solution sans jquery, cette réponse pourrait être une meilleure option.
lucash
oui, le but est d'utiliser un nombre aussi grand que possible, disons 999999999999999999999999999999.
débranché le