Scroll a page using JavaScript

2019-07-04 03:42发布

I'm using Ender.js and I am trying to get the page to scroll to a specific position. I think I'm doing something wrong here, but page doesn't even move. Ideally I would have liked to use an animate event but emile doesn't accept scrollTop as a parameter. Any help is appreciated.

$.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);
        });
    });
});

My build consists of:

  • 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条回答
时光不老,我们不散
2楼-- · 2019-07-04 04:29

We just rolled out a new version of our web site last week, with a Javascript scrolling. You can see it live at http://beebole.com but I've extracted the code for a basic example below:

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

Either add more content where the lorem ipsum are. Or make the browser window very small to have a scroll.

Click the links to see the page move.

If the browser has Javascript off, the browser will take in charge the scroll using the default # key. But obviously without the damper effect. It was not tested on IE6 and IE7.

查看更多
登录 后发表回答