【问题标题】:Animated switch between vertical full-height divs when scroll滚动时垂直全高 div 之间的动画切换
【发布时间】:2017-11-06 07:46:06
【问题描述】:

我在一页中有三个 div,每个高度为 100vh。所以我想在它们之间自动切换,当用户滚动(向上或向下)时将激活。我用 scrollTop() 函数写了条件。

例如:

if($("#first").scrollTop() > 10){ /*go to next div automatically*/ }

它非常适合第一个 div,但再次滚动到顶部是不可能的,因为第一个条件始终为真。我没有任何想法。请帮帮我。

【问题讨论】:

    标签: javascript scrolltop


    【解决方案1】:

    这是一个小代码 sn-p 可以帮助您完成您正在尝试做的事情。基本上,这种功能可能有不同的实现。尝试阅读我在代码中输入的 cmets,使用 sn-p,理解逻辑并使其变得更好。如果您有任何问题,请告诉我。

    $(document).ready(function() {
      
      /* define some helper variables */
      var 
        /* body jQuery wrapper */
        body = $('html, body'),
        
        /* window jQuery wrapper */
        win = $(window),
        
        /* divs jQuery wrapper */
        divs = $('.view'),
        
        /* divs length, which we will use to determine if we are on the last/first div */
        divsLen = divs.length - 1,
        
        /* Last scroll position which will help us to determine which is the scroll direction */
        lastScroll = 0,
        
        /* Currently showing div's index */
        divIndex = 0,
        
        /* Flag to determine if scrolling animation is active */
        scrolling = false;
    
      /* Do the magic */
      win.on('scroll', _handleScroll);
    
      function _handleScroll(e) {
        
        /* Do nothing if currently running animation is not finished */
        if (scrolling) {
          return false;
        }
    
        scrolling = true;
    
        /* Determine scroll direction and the div to which we will scroll */
        if (win.scrollTop() > lastScroll) {
          /* scrolling down */
          if (divIndex < divsLen) {
            /* increment divIndex so we scroll to next div */
            divIndex++;
          } else {
            /* return if we are on the last element to prevent flicker animation */
            scrolling = false;
            return false;
          }
        } else {
          /* scrolling up */
          if (divIndex > 0) {
            /* decrement divIndex so we scroll to previous div */
            divIndex--;
          } else {
            /* return if we are on the first element to prevent flicker animation */
            scrolling = false;
            return false;
          }
        }
        
        /* Process the animation */
        body.stop().animate({
          scrollTop: divs.eq(divIndex).offset().top
        }, 500, function() {
        
          /* Use a small timeout before setting scrolling = false, otherwise scroll event is triggered immediately and code is not working fine */
          setTimeout(function() {
          
            /* reset the scrolling flag */
            scrolling = false;
            
            /* save last scroll position */
            lastScroll = win.scrollTop();
            
          }, 50);
        });
      }
    
    });
    *{margin:0; padding:0;}
    .view {height:100vh; display: flex; align-items: center; justify-content: center;}
    .view span {color: white; font-size: 25px; font-family: arial; font-weight: bold;}
    #first {background-color: blue;}
    #second {background-color: black;}
    #third {background-color: green;}
    #fourth {background-color: red;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <div id="first" class="view">
      <span>First</span>
    </div>
    
    <div id="second" class="view">
      <span>Second</span>
    </div>
    
    <div id="third" class="view">
      <span>Third</span>
    </div>
    
    <div id="fourth" class="view">
      <span>Fourth</span>
    </div>

    【讨论】:

    • 很高兴它对您有所帮助。现在尝试在 jQuery 插件中组织代码:P
    猜你喜欢
    • 2011-06-29
    • 2017-02-26
    • 2018-02-03
    • 2019-07-13
    • 2016-04-21
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多