2012-08-30 26 views
6

Come posso aggiungere un andamento/animazione/spostamento lento a questa funzione? Al momento salta semplicemente. Ora dovrebbe passare all'ancora con un'animazione.ScrollTo con animazione

<script type='text/javascript'> 
     setTimeout("window.scrollBy(0,270);",3000); 
</script> 
+3

** ** Mai passare una stringa a 'setInterval()' o 'setTimeout()'. Fare così è pessimo quanto usare 'eval()' e risulta in codice illeggibile e probabilmente insicuro non appena si usano le variabili poiché è necessario inserirle nella stringa invece di passare la variabile attuale. La soluzione corretta è 'setInterval (function() {/ * your code *)}, msecs);'. Lo stesso vale per 'setTimeout()'. Se vuoi semplicemente chiamare una singola funzione senza argomenti, puoi anche passare direttamente il nome della funzione: 'setInterval (someFunction, msecs);' (nota che ci sono ** no ** '()' dietro il nome della funzione) – ThiefMaster

+0

Considera l'utilizzo di alcune librerie esistenti per questo. – ThiefMaster

+0

questo suona bene, ma come posso aggiungere il tempo dopo quanti secondi la pagina dovrebbe scorrere http://flesler.blogspot.se/2007/10/jqueryscrollto.html – Max

risposta

1

got me stesso. a causa delle modalità di wordpress e il jquery.noConflict ho hade di modificare il codice:

<script type="text/javascript"> 
     (function($){ 
     $(document).ready(function(){ 
      setTimeout(function() { 
      $('body').scrollTo('300px', 2500); 
     }, 3000); 
     }); 
     }(jQuery)); 
</script> 

grazie per tutti !!!

0

L'utilizzo di jQuery rende tutto molto più semplice, forse con il plugin scrollto. http://flesler.blogspot.se/2007/10/jqueryscrollto.html

in considerazione una soluzione del genere:

<script type='text/javascript' src='js/jquery.1.7.2.min.js'></script> 
<script type='text/javascript' src='js/jquery.scrollTo-min.js'></script> 
<script type='text/javascript' src='js/jquery.easing.1.3.js'></script><!-- only for other easings than swing or linear --> 
<script type='text/javascript'> 
$(document).ready(function(){ 
    setTimeout(function() { 
    $('html,body').scrollTo({top:'30%', left:'0px'}, 800, {easing:'easeInBounce'}); 
}, 3000); 
}); 
</script> 

Naturalmente è necessario dl gli script.

Vedi http://jsfiddle.net/7bFAF/2/ per un esempio di lavoro

+0

e come posso aggiungere il tempo, dopo quanti secondi la pagina dovrebbe scorrere? – Max

+0

utilizzando jQuery è possibile utilizzare facilmente il timeout proprio come suggerito per l'impostazione del ritardo, ad esempio: http://stackoverflow.com/questions/1836105/how-to-wait-5-seconds-with-jquery – jtheman

+0

ho provato questo. .ma non funziona .code' 'codice' – Max

32

possibile anche con javascript pianura con richiesta di frame di animazione ..

// first add raf shim 
// http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ 
window.requestAnimFrame = (function(){ 
    return window.requestAnimationFrame  || 
      window.webkitRequestAnimationFrame || 
      window.mozRequestAnimationFrame || 
      function(callback){ 
      window.setTimeout(callback, 1000/60); 
      }; 
})(); 

// main function 
function scrollToY(scrollTargetY, speed, easing) { 
    // scrollTargetY: the target scrollY property of the window 
    // speed: time in pixels per second 
    // easing: easing equation to use 

    var scrollY = window.scrollY, 
     scrollTargetY = scrollTargetY || 0, 
     speed = speed || 2000, 
     easing = easing || 'easeOutSine', 
     currentTime = 0; 

    // min time .1, max time .8 seconds 
    var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY)/speed, .8)); 

    // easing equations from https://github.com/danro/easing-js/blob/master/easing.js 
    var PI_D2 = Math.PI/2, 
     easingEquations = { 
      easeOutSine: function (pos) { 
       return Math.sin(pos * (Math.PI/2)); 
      }, 
      easeInOutSine: function (pos) { 
       return (-0.5 * (Math.cos(Math.PI * pos) - 1)); 
      }, 
      easeInOutQuint: function (pos) { 
       if ((pos /= 0.5) < 1) { 
        return 0.5 * Math.pow(pos, 5); 
       } 
       return 0.5 * (Math.pow((pos - 2), 5) + 2); 
      } 
     }; 

    // add animation loop 
    function tick() { 
     currentTime += 1/60; 

     var p = currentTime/time; 
     var t = easingEquations[easing](p); 

     if (p < 1) { 
      requestAnimFrame(tick); 

      window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t)); 
     } else { 
      console.log('scroll done'); 
      window.scrollTo(0, scrollTargetY); 
     } 
    } 

    // call it once to get started 
    tick(); 
} 

// scroll it! 
scrollToY(0, 1500, 'easeInOutQuint'); 
+0

Questa è una grande risposta e mi ha aiutato a visualizzare tecniche avanzate di utilizzo di javascript per estendere le proprie funzionalità di base. Grazie! – vars

+0

Per il supporto di IE11, è possibile utilizzare 'window.pageYOffset' anziché' window.scrollY'. –

4

Adattato da this answer:

function scrollBy(distance, duration) { 

    var initialY = document.body.scrollTop; 
    var y = initialY + distance; 
    var baseY = (initialY + y) * 0.5; 
    var difference = initialY - baseY; 
    var startTime = performance.now(); 

    function step() { 
     var normalizedTime = (performance.now() - startTime)/duration; 
     if (normalizedTime > 1) normalizedTime = 1; 

     window.scrollTo(0, baseY + difference * Math.cos(normalizedTime * Math.PI)); 
     if (normalizedTime < 1) window.requestAnimationFrame(step); 
    } 
    window.requestAnimationFrame(step); 
} 

Ciò dovrebbe consentire di scorrere senza problemi dalla distanza specificata.

+1

Bella risposta, grazie. – Mirakurun

0

Utilizzare questo e il tuo problema sarà risolto

animate(document.documentElement, 'scrollTop', 0, 200); 

Grazie

Problemi correlati