una suave página lento hacia enlaces div desplazar desplazamiento deslizar dentro crear con bajar automaticamente arriba animado anclas jquery scroll

suave - desplazar scroll jquery



¿Diferenciar entre desplazarse hacia arriba/abajo en jQuery? (6)

Evento de desplazamiento

El evento scroll se comporta de forma extraña en FF (se dispara muchas veces debido al desplazamiento suave) pero funciona.

Nota: el evento de scroll realidad se dispara al arrastrar la barra de desplazamiento, utilizando las teclas de cursor o la rueda del mouse.

//creates an element to print the scroll position $("<p id=''test''>").appendTo("body").css({ padding: "5px 7px", background: "#e9e9e9", position: "fixed", bottom: "15px", left: "35px" }); //binds the "scroll" event $(window).scroll(function (e) { var target = e.currentTarget, $self = $(target), scrollTop = window.pageYOffset || target.scrollTop, lastScrollTop = $self.data("lastScrollTop") || 0, scrollHeight = target.scrollHeight || document.body.scrollHeight, scrollText = ""; if (scrollTop > lastScrollTop) { scrollText = "<b>scroll down</b>"; } else { scrollText = "<b>scroll up</b>"; } $("#test").html(scrollText + "<br>innerHeight: " + $self.innerHeight() + "<br>scrollHeight: " + scrollHeight + "<br>scrollTop: " + scrollTop + "<br>lastScrollTop: " + lastScrollTop); if (scrollHeight - scrollTop === $self.innerHeight()) { console.log("► End of scroll"); } //saves the current scrollTop $self.data("lastScrollTop", scrollTop); });

Evento rueda

También puede echar un vistazo a MDN, expone una gran información sobre el Evento de la rueda .

Nota: el evento de la rueda se dispara solo cuando se usa la rueda del ratón ; Las teclas de cursor y arrastrando la barra de desplazamiento no activan el evento.

Leí el documento y el ejemplo: escuchar este evento en el navegador
y después de algunas pruebas con FF, IE, chrome, safari, terminé con este fragmento de código:

//creates an element to print the scroll position $("<p id=''test''>").appendTo("body").css({ padding: "5px 7px", background: "#e9e9e9", position: "fixed", bottom: "15px", left: "15px" }); //attach the "wheel" event if it is supported, otherwise "mousewheel" event is used $("html").on(("onwheel" in document.createElement("div") ? "wheel" : "mousewheel"), function (e) { var evt = e.originalEvent || e; //this is what really matters var deltaY = evt.deltaY || (-1 / 40 * evt.wheelDelta), //wheel || mousewheel scrollTop = $(this).scrollTop() || $("body").scrollTop(), //fix safari scrollText = ""; if (deltaY > 0) { scrollText = "<b>scroll down</b>"; } else { scrollText = "<b>scroll up</b>"; } //console.log("Event: ", evt); $("#test").html(scrollText + "<br>clientHeight: " + this.clientHeight + "<br>scrollHeight: " + this.scrollHeight + "<br>scrollTop: " + scrollTop + "<br>deltaY: " + deltaY); });

Esta pregunta ya tiene una respuesta aquí:

He encontrado algunas formas excelentes de verificar dónde está la barra de desplazamiento utilizando jquery, pero me preguntaba si puede diferenciar si el usuario se desplazó hacia arriba o hacia abajo.


Compruebe el último estado. Algo como esto:

Mantenga una variable, por ejemplo, last_scroll_position , y cuando tenga un desplazamiento, si last_scroll_position - current_position > 0 , el usuario se desplazó hacia arriba y hacia abajo si es menor que 0.


Ejemplo para javascript vainilla:

var f = (function(){ var oldPos = window.scrollY; function fu(e) { var newPos = window.scrollY; if (newPos>oldPos) { console.log(''down''); } else if(newPos<oldPos) { console.log(''up''); } else { console.log(''same''); } oldPos = newPos; } return fu; })(); window.addEventListener(''scroll'',f);


Hay una forma sencilla de hacerlo sin variables globales de ningún tipo. El evento MouseWheel tiene una propiedad que especifica explícitamente la dirección de desplazamiento. Aquí está cómo usarlo:

$("#scroll_div").bind("mousewheel",function(ev) { var curScrollLeft = $(this).scrollLeft(); $(this).scrollLeft(curScrollLeft + Math.round(ev.originalEvent.wheelDelta)); });


Para diferenciar entre desplazarse hacia arriba / abajo en jQuery, puede usar:

var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel" //FF doesn''t recognize mousewheel as of FF3.x $(''#yourDiv'').bind(mousewheelevt, function(e){ var evt = window.event || e //equalize event object evt = evt.originalEvent ? evt.originalEvent : evt; //convert to originalEvent if possible var delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta //check for detail first, because it is used by Opera and FF if(delta > 0) { //scroll up } else{ //scroll down } });

Este método también funciona en divs que tienen overflow:hidden .

Lo probé con éxito en FireFox, IE y Chrome.


<script type=''text/javascript''> $(function(){ var CurrentScroll = 0; $(window).scroll(function(event){ var NextScroll = $(this).scrollTop(); if (NextScroll > CurrentScroll){ //write the codes related to down-ward scrolling here } else { //write the codes related to upward-scrolling here } CurrentScroll = NextScroll; //Updates current scroll position }); });