【问题标题】:Javascript: scroll from one div to the other when scrolling?Javascript:滚动时从一个 div 滚动到另一个?
【发布时间】:2015-11-01 13:16:49
【问题描述】:

我希望能够在向下滚动时直接转到下一个 div,在向上滚动时直接转到上一个 div。 这是我的文件,其中包含两个 div 的示例:

$(document).ready(function() {
  var lastScrollTop = 0;

  function findPos(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
      do {
        curtop += obj.offsetTop;
      } while (obj = obj.offsetParent);
      return [curtop];
    }
  }

  $(window).scroll(function(event) {
    var st = $(this).scrollTop();
    if (st > lastScrollTop) {
      $('html, body').animate({
        scrollTop: $("#space_od").offset().top
      }, 500);
    } else {
      $('html, body').animate({
        scrollTop: $("#black_hole").offset().top
      }, 500);
    }
    lastScrollTop = st;
  });
});
body {
  padding: 0;
  margin: 0;
}

#black_hole {
  background-image: url("black_hole.jpg");
  background-position: center;
  display: block;
  height: 100vh;
  width: 100%;
}

#space_od {
  background-image: url("2001.png");
  background-position: center;
  display: block;
  height: 100vh;
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="black_hole">
</div>
<div id="space_od">
</div>

第一次向下滚动时似乎可以正常工作,但向上滚动时却不行,它似乎移动了几个像素然后停止了。有什么想法吗?

【问题讨论】:

标签: javascript jquery html css scroll


【解决方案1】:

scrollTo 是一个添加到需要滚动到的 div 的类:

<div id="black_hole" class="scrollTo">

</div>
<div id="space_od" class="scrollTo">

</div>

Js

var scrolling = false;
var currentPos = 0;

    function scrollUp(){
        if(!scrolling && currentPos > 0 ){
            scrolling=true;
            currentPos --;
            var scrollToElement = $('.scrollTo')[currentPos];

            $('html, body').animate({
                scrollTop: $(scrollToElement).offset().top
            }, 500, function(){
                scrolling = false;
            });      
        }
    }   

    function scrollDown(){   
        if(!scrolling && currentPos < $('.scrollTo').length-1  ){
            scrolling=true;
            currentPos ++;
            var scrollToElement = $('.scrollTo')[currentPos];

            $('html, body').animate({
                scrollTop: $(scrollToElement).offset().top
            }, 500,function(){
                scrolling = false;
            }); 
        }
    }    

    $(document).ready(function() {

        // Get the current position on load

        for( var i = 0; i < $('.scrollTo').length; i++){
            var elm = $('.scrollTo')[i];

            if( $(document).scrollTop() >= $(elm).offset().top ){
                currentPos = i;
            }
        }

        $(document).bind('DOMMouseScroll', function(e){
            if(e.originalEvent.detail > 0) {
                scrollDown();
            }else {
                scrollUp();   
            }
            return false;
        });

        $(document).bind('mousewheel', function(e){
            if(e.originalEvent.wheelDelta < 0) {
                scrollDown();
            }else {
                scrollUp();     
            }
            return false;
        });
    });

【讨论】:

  • 刚刚注意到一个问题,如果有更多的div会怎样?
  • 我把开头改成:var currentPos = window.pageYOffset || document.documentElement.scrollTop;但是,当向下滚动时,它一开始就向上,然后当我再次向下滚动时,它又向下……奇怪……
  • currentPos 应该是一个整数。第一个 div 为 0,第二个为 1,如果有 (n+1) 个具有 scrollTo 类的 div,则为最后一个 div
  • 这似乎可以解决问题:var currentPos = (window.pageYOffset || document.documentElement.scrollTop)/$(window).height();
  • 我找到了一个不同的解决方案应该可以工作,请检查更新的答案,我在 $(document).ready() 方法中添加了几行
猜你喜欢
  • 2016-11-05
  • 2016-01-10
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多