使用JavaScript滚动页面

时间:2011-05-12 21:19:34

标签: javascript animation

我正在使用Ender.js,我正在尝试让页面滚动到特定位置。 我觉得我在这里做错了,但是页面甚至没有动。理想情况下,我本来希望使用animate事件,但emile不接受scrollTop作为参数。 任何帮助表示赞赏。

$.domReady(function () {
    function startPageScroll(finalPos){
      var scrollAmount = 0;
      var id = setInterval(function(){
        if(scrollAmount < finalPos){
          $('body,html').scroll(0,50);
          scrollAmount+=50;
        }
        else{clearInterval(id);}
      },100);
    }
    $('a.back-to-top-link').each(function(element) {
        var link = $(element);
        var target = link.attr("href");
        var position = $(target).offset().top;      
        link.on('click', function(event) {
            event.preventDefault();
            startPageScroll(position);
        });
    });
});

我的构建包括:

  • domready@0.1.0
  • scriptjs@2.1.1
  • qwery@1.1.6
  • bonzo@0.4.5
  • bean@0.1.5
  • emile@1.0.4

1 个答案:

答案 0 :(得分:4)

我们上周刚推出了一个新版本的网站,并进行了Javascript滚动。 你可以在http://beebole.com看到它,但我已经提取了以下基本示例的代码:

<html lang="en">
<head>
    <title>BeeBole - Simple and Fast Timesheets</title>
    <style>
      body{ padding:0 1em; margin:0;}
      ul{ padding:0;margin:0;}
      li{ list-style:none; float:left; margin:0 1em;}
      h1{ clear:both;}
    </style>
</head>
<body>
    <a id="home" name="home"></a>
    <div class="header">
        <ul class="menu">
            <li><a class="fr current" href="#home" onclick="return beebole.scrollTo(this)">Home</a>
            <li><a class="fr" href="#pricing" onclick="return beebole.scrollTo(this)">Pricing</a>
            <li><a class="fr" href="#tour" onclick="return beebole.scrollTo(this)">Tour</a>
        </ul>
    </div>
    <div class="chapter home">
        <h1>Home</h1>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>
    </div>

    <a id="pricing" name="pricing"></a>
    <div class="header">
        <ul class="menu">
            <li><a class="fr" href="#home" onclick="return beebole.scrollTo(this)">Home</a>
            <li><a class="current fr" href="#pricing" onclick="return beebole.scrollTo(this)">Pricing</a>
            <li><a class="fr" href="#tour" onclick="return beebole.scrollTo(this)">Tour</a>
        </ul>
    </div>
    <div class="chapter pricing">
        <h1>Pricing</h1>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>

    </div>

    <a id="tour" name="tour"></a>
    <div class="header">
        <ul class="menu">
            <li><a class="fr" href="#home" onclick="return beebole.scrollTo(this)">Home</a>
            <li><a class="fr" href="#pricing" onclick="return beebole.scrollTo(this)">Pricing</a>
            <li><a class="current fr" href="#tour" onclick="return beebole.scrollTo(this)">Tour</a>
        </ul>
    </div>
    <div class="chapter tour">
        <h1>Take a tour</h1>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>
        <p>Lorem ipsum dolor sit ... in feugiat massa congue in.</p>

    </div>
    <script>
    (function(){
        window.beebole = {
            getPos: function( elm ){
                var x = 0, y = 0;
                while( elm != null ) {
                    x += elm.offsetLeft;
                    y += elm.offsetTop;
                    elm = elm.offsetParent ;
                }
                return {x:x, y:y};
            },
            damper:function(rfnAction, rfnDone, duration){
                var interval,
                    startTime = new Date().getTime();

                interval = setInterval( function(){
                    var pos, 
                        t,
                        now = new Date().getTime();

                    t = now - startTime;
                    if(t >= duration){
                        clearInterval(interval);
                        rfnDone.call(beebole);
                    }else{
                        t = 2 * t / duration;
                        if (t < 1) {
                            pos = 0.5*t*t*t*t;
                        }else{
                            t -= 2;
                            pos = -0.5 * (t*t*t*t - 2);
                        }                       
                        rfnAction.call(beebole, pos);
                    }
                }, 15 );
            },
            scrollTo: function( a ){
                try{
                    var endName = a.href.split('#')[1],
                        endElm = document.getElementById(endName),
                        start = isNaN(window.pageYOffset) ? 
                            document.documentElement.scrollTop :
                            window.pageYOffset,
                        end = beebole.getPos(endElm).y,
                        length = beebole.getPos(endElm).y - start;

                    this.damper(function(pos){
                        //when moving
                        window.scrollTo(0, start + length * pos);
                    }, function(){
                        //when done
                        window.location.hash = endName;
                    },
                    //duration
                    Math.max( Math.abs( Math.round(length / 3) ), 1200));
                    return false;
                }catch(e){
                    return true;
                }
            }
        };
    })();

    </script>
</body>
</html>

lorem ipsum所在的位置添加更多内容。或者使浏览器窗口非常小以进行滚动。

点击链接查看页面移动。

如果浏览器关闭了Javascript,浏览器将使用默认的#键来管理滚动。但显然没有阻尼效应。 它没有在IE6和IE7上测试过。