2012-08-30 11 views
6

Jak dodać łagodność/animację/powolne przechodzenie do tej funkcji? W tej chwili po prostu skacze. Teraz powinien przejść do "kotwicy" z animacją.ScrollTo z animacją

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

** Nigdy ** przekazać ciąg 'setInterval()' lub 'setTimeout()'. Takie postępowanie jest tak samo złe, jak użycie 'eval()' i skutkuje to nieczytelnym i potencjalnie niepewnym kodem, gdy tylko użyjesz zmiennych, ponieważ musisz wstawić je do łańcucha zamiast podania rzeczywistej zmiennej. Właściwym rozwiązaniem jest 'setInterval (function() {/ * twój kod *)}, msecs);'. To samo dotyczy 'setTimeout()'. Jeśli chcesz wywołać pojedynczą funkcję bez żadnych argumentów, możesz również bezpośrednio przekazać nazwę funkcji: 'setInterval (someFunction, msecs);' (zauważ, że za nazwą funkcji znajduje się ** no ** '()') – ThiefMaster

+0

Rozważ wykorzystanie istniejącej biblioteki. – ThiefMaster

+0

ten dźwięk brzmi dobrze, ale jak mogę dodać czas po ilu sekundach strona powinna przewinąć http://flesler.blogspot.se/2007/10/jqueryscrollto.html – Max

Odpowiedz

1

got to sam. z powodu wordpressa i jquery.noConflict Mode mam zamiar zmodyfikować kod:

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

dzięki dla wszystkich !!!

0

Korzystanie z jQuery znacznie ułatwia to zadanie, być może dzięki pluginowi scrollto. http://flesler.blogspot.se/2007/10/jqueryscrollto.html

rozważyć rozwiązanie takiego:

<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> 

Oczywiście trzeba dl skrypty.

Zobacz http://jsfiddle.net/7bFAF/2/ na przykład pracy

+0

i jak mogę dodać czas po ilu sekundy, które strona powinna przewijać? – Max

+0

używając jQuery można łatwo użyć limitu czasu tak, jak zasugerowałeś sobie przy ustawianiu opóźnienia, na przykład: http://stackoverflow.com/questions/1836105/how-to-wait-5-seconds-with-jquery – jtheman

+0

Próbowałem tego. . ale nie działa. "kod" 'kod' – Max

32

również możliwe z użyciem zwykłego javascript żądania animacji ramki ..

// 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

To jest świetna odpowiedź i pomógł mi wizualizować zaawansowane techniki korzystania z javascript w celu rozszerzenia jego własnych podstawowych funkcji. Dzięki! – vars

+0

Dla obsługi IE11 możesz użyć 'window.pageYOffset' zamiast' window.scrollY'. –

4

Adaptacja 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); 
} 

To powinno pozwolić Ci płynnie przejść przez określoną odległość.

+1

Dobra odpowiedź, dzięki. – Mirakurun

0

korzystać z tej i Twój problem zostanie rozwiązany

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

Dzięki

Powiązane problemy