2010-10-27 26 views

Respuesta

426

sólo puede utilizar la propiedad .animate()scrollTop, así:

$("html, body").animate({ scrollTop: "300px" }); 
+0

Muy bonito .. no hay necesidad de usa complementos para esto –

+13

¿Por qué necesita tanto 'html' como' body'? Aquí hay algunas ideas: http://stackoverflow.com/questions/2123690/slow-down-scroll-to-top-event-by-jquery-animate/2123721#comment16858893_2123721, pero no es una respuesta completa. –

+21

cuerpo es utilizado por webkit, html es utilizado por firefox. – Jory

4

Prueba el plugin de scrollTo.

+0

Parece que scrollTo no es más largo un proyecto en ese sitio. – Jim

+0

https://github.com/flesler/jquery.scrollTo –

+0

El código para lograr esto es tan simple. ¿Por qué agregaría un complemento para hacer algo que puede hacer con una línea de código? – Gavin

25

La respuesta de Nick funciona muy bien y la configuración predeterminada es agradable, pero puede controlar más completamente el desplazamiento completando todas las configuraciones opcionales.

aquí es lo que parece en la API:

.animate(properties [, duration] [, easing] [, complete]) 

por lo que podría hacer algo como esto:

.animate( 
    {scrollTop:'300px'}, 
    300, 
    swing, 
    function(){ 
     alert(animation complete! - your custom code here!); 
     } 
    ) 

aquí es la página de la función .animate API jQuery: http://api.jquery.com/animate/

66

La respuesta de Nick funciona muy bien. Tenga cuidado al especificar una función completa() dentro de la llamada animate() porque se ejecutará dos veces, ya que tiene dos selectores declarados (html y body).

$("html, body").animate(
    { scrollTop: "300px" }, 
    { 
     complete : function(){ 
      alert('this alert will popup twice'); 
     } 
    } 
); 

Aquí se explica cómo evitar la doble devolución de llamada.

var completeCalled = false; 
$("html, body").animate(
    { scrollTop: "300px" }, 
    { 
     complete : function(){ 
      if(!completeCalled){ 
       completeCalled = true; 
       alert('this alert will popup once'); 
      } 
     } 
    } 
); 
+0

La pregunta es, ¿por qué animarías 'html, body' y no solo 'body'? – Lior

+17

Porque dependiendo del navegador que sea, puede animar el cuerpo O html. Al animar AMBOS, cubre más buscadores. – Bene

+0

Pero en este caso emergerá realmente solo una vez, también si tiene que ser llamado repetidamente (haga clic en evento en el botón) o ¿me perdí algo? – HoGo

-3

el código del navegador cruz es:

$(window).scrollTop(300); 

es sin animación, pero funciona en todas partes

+6

Estaba buscando una forma de "animar scrollTop con jQuery?" Una respuesta que es "sin animación" no es una respuesta. –

0

Pero si realmente quiere añadir un poco de animación mientras se desplaza, se puede tratar mi simple plugin (AnimateScroll) que actualmente admite más de 30 estilos de aceleración

4

Puede utilizar la animación jQuery para la página de desplazamiento con una duración específica:

$("html, body").animate({scrollTop: "1024px"}, 5000); 

donde 1024px de desplazamiento es el desplazamiento de 5000 y es la duración de las animaciones en milisegundos.

+0

¡Gran respuesta! Me alegro de que haya incluido la opción de duración. Solo quería agregar que '$ (" html, body "). Animate ({scrollTop: 1024}, 5000);' también funciona. –

14

Tengo lo que creo que es una mejor solución que el truco $('html, body').

No es de una sola línea, pero el problema que tuve con $('html, body') es que si registras $(window).scrollTop() durante la animación, verás que el valor salta por todos lados, a veces por cientos de píxeles (aunque yo no no veo que algo así suceda visualmente). Necesitaba que el valor fuera predecible, de modo que pudiera cancelar la animación si el usuario agarró la barra de desplazamiento o giró la rueda del mouse durante el desplazamiento automático.

Aquí es una función animará desplaza suavemente:

function animateScrollTop(target, duration) { 
    duration = duration || 16; 
    var scrollTopProxy = { value: $(window).scrollTop() }; 
    if (scrollTopProxy.value != target) { 
     $(scrollTopProxy).animate(
      { value: target }, 
      { duration: duration, step: function (stepValue) { 
       var rounded = Math.round(stepValue); 
       $(window).scrollTop(rounded); 
      } 
     }); 
    } 
} 

continuación es una versión más compleja que se cancelará la animación en la interacción del usuario, así como recocido hasta el valor objetivo se alcanza, que es útil cuando tratando de configurar el scrollTop instantáneamente (ej.simplemente llamando $(window).scrollTop(1000) - en mi experiencia, esto no funciona alrededor del 50% de las veces)

function animateScrollTop(target, duration) { 
    duration = duration || 16; 

    var $window = $(window); 
    var scrollTopProxy = { value: $window.scrollTop() }; 
    var expectedScrollTop = scrollTopProxy.value; 

    if (scrollTopProxy.value != target) { 
     $(scrollTopProxy).animate(
      { value: target }, 
      { 
       duration: duration, 

       step: function (stepValue) { 
        var roundedValue = Math.round(stepValue); 
        if ($window.scrollTop() !== expectedScrollTop) { 
         // The user has tried to scroll the page 
         $(scrollTopProxy).stop(); 
        } 
        $window.scrollTop(roundedValue); 
        expectedScrollTop = roundedValue; 
       }, 

       complete: function() { 
        if ($window.scrollTop() != target) { 
         setTimeout(function() { 
          animateScrollTop(target); 
         }, 16); 
        } 
       } 
      } 
     ); 
    } 
} 
9

Como Kita mencionó que hay un problema con múltiples devoluciones de llamada de disparar cuando se anima tanto 'html' y 'cuerpo'. . En lugar de animar a ambos y bloquear devoluciones de llamadas posteriores, prefiero usar algunas funciones básicas de detección y solo animar la propiedad scrollTop de un solo objeto.

La respuesta aceptada en este otro hilo da una idea de por qué propiedad scrollTop del objeto que deberíamos tratar de animar: pageYOffset Scrolling and Animation in IE8

// UPDATE: don't use this... see below 
// only use 'body' for IE8 and below 
var scrollTopElement = (window.pageYOffset != null) ? 'html' : 'body'; 

// only animate on one element so our callback only fires once! 
$(scrollTopElement).animate({ 
     scrollTop: '400px' // vertical position on the page 
    }, 
    500, // the duration of the animation 
    function() {  
     // callback goes here... 
    }) 
}); 

ACTUALIZACIÓN - - -

El intento anterior en la detección de características falla. Parece que no hay una forma de una línea de hacerlo, ya que los navegadores de tipo webkit la propiedad de páginaYOffset siempre devuelve cero cuando hay un tipo de documento. En su lugar, encontré una forma de utilizar la promesa de hacer una única devolución de llamada por cada vez que se ejecuta la animación.

$('html, body') 
    .animate({ scrollTop: 100 }) 
    .promise() 
    .then(function(){ 
     // callback code here 
    }) 
}); 
+0

Usar promise() aquí es genio. –

7

Tenía problemas donde la animación siempre comenzaba desde la parte superior de la página después de una actualización de página en los otros ejemplos.

i fijo esto no anima el css directamente sino más bien llamar window.scrollTo(); en cada paso:

$({myScrollTop:window.pageYOffset}).animate({myScrollTop:300}, { 
    duration: 600, 
    easing: 'swing', 
    step: function(val) { 
    window.scrollTo(0, val); 
    } 
}); 

Esto también se pone en torno al tema html vs body, ya que está utilizando multi-navegador JavaScript.

Eche un vistazo a http://james.padolsey.com/javascript/fun-with-jquerys-animate/ para obtener más información sobre lo que puede hacer con la función animada de jQuery.

0

Si desea mover hacia abajo al final de la página (para que no tenga que desplazarse hacia abajo hasta la parte inferior), puede utilizar:

$('body').animate({ scrollTop: $(document).height() }); 
2
$(".scroll-top").on("click", function(e){ 
    e.preventDefault(); 
    $("html, body").animate({scrollTop:"0"},600); 
});