【问题标题】:How to scroll to next div using Javascript?如何使用 Javascript 滚动到下一个 div?
【发布时间】:2019-02-21 09:44:15
【问题描述】:

所以我正在制作一个包含许多 100% 高度的 Div 的网站。 我想制作一个按钮,以便在单击它时平滑滚动到下一个 div。 我编写了一些代码,所以当它被点击时,它会滚动到特定的 div。

$(".next").click(function() {
    $('html,body').animate({
        scrollTop: $(".p2").offset().top},
        'slow');
});
body{
  margin: 0;
  height: 100%;
}

.p1{
  height: 100vh;
  width: 70%;
  background-color: #2196F3;
}
.p2{
  height: 100vh;
  width: 70%;
  background-color: #E91E63;
}
.p3{
  height: 100vh;
  width: 70%;
  background-color: #01579B;
}

.admin{
  background-color: #B71C1C;
  height: 100vh;
  position: fixed;
  right: 0%;
  top: 0%;
  width: 30%;
  float: left;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="p1">
  
</div>
<div class="p2">
  
</div>
<div class="p3">
  
</div>

<div class="admin">
  
  <button class="next">NEXT</button>
  
</div>

【问题讨论】:

    标签: javascript jquery html css


    【解决方案1】:

    要完成这项工作,您需要识别当前显示的div。为此,您可以将类应用于当前显示的元素。然后你可以使用next() 来遍历它们。

    还要注意,在下面的示例中,为所有元素添加了一个公共类.p,以干燥 CSS 并使 DOM 遍历更容易。

    $(".next").click(function() {
      var $target = $('.p.active').next('.p');
      if ($target.length == 0)
        $target = $('.p:first');
        
      $('html, body').animate({
        scrollTop: $target.offset().top
      }, 'slow');
    
      $('.active').removeClass('active');
      $target.addClass('active');
    });
    body {
      margin: 0;
      height: 100%;
    }
    
    .p {
      height: 100vh;
      width: 70%;
    }
    .p1 {
      background-color: #2196F3;
    }
    .p2 {
      background-color: #E91E63;
    }
    .p3 {
      background-color: #01579B;
    }
    
    .admin {
      background-color: #B71C1C;
      height: 100vh;
      position: fixed;
      right: 0%;
      top: 0%;
      width: 30%;
      float: left;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="p p1 active"></div>
    <div class="p p2"></div>
    <div class="p p3"></div>
    <div class="admin">
      <button class="next">NEXT</button>
    </div>

    【讨论】:

    • 如果用户先手动滚动,然后单击按钮。这是滚动到当前显示 div 的下一个 div 的工作吗?
    • @thang 不,因为您需要监控滚动事件发生时当前显示的元素,您可以实现like this
    【解决方案2】:

    对容器使用相同的类名。从第一个元素开始。每次单击都指向下一个scroller 元素

    var f = $('.p1');
    var nxt = f;
    $(".next").click(function() {
    
      if (nxt.next('.scroller').length > 0) {
        nxt = nxt.next('.scroller');
      } else {
        nxt = f;
      }
      $('html,body').animate({
          scrollTop: nxt.offset().top
        },
        'slow');
    });
    body {
      margin: 0;
      height: 100%;
    }
    
    .p1 {
      height: 100vh;
      width: 70%;
      background-color: #2196F3;
    }
    
    .p2 {
      height: 100vh;
      width: 70%;
      background-color: #E91E63;
    }
    
    .p3 {
      height: 100vh;
      width: 70%;
      background-color: #01579B;
    }
    
    .admin {
      background-color: #B71C1C;
      height: 100vh;
      position: fixed;
      right: 0%;
      top: 0%;
      width: 30%;
      float: left;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="p1 scroller">
    
    </div>
    <div class="p2 scroller">
    
    </div>
    <div class="p3 scroller">
    
    </div>
    
    <div class="admin">
    
      <button class="next">NEXT</button>
    
    </div>

    【讨论】:

      【解决方案3】:

      这是一个基本版本,它向前移动并在到达最后一张幻灯片时回绕到开头。我们将currSlide 存储在循环之外,并在函数内部增加数字。

      为方便起见,我在每张幻灯片中添加了一个slide 类,这样我可以:

      • 轻松计算幻灯片的长度
      • 浓缩CSS

      let currSlide = 1;
      const SLIDE_LENGTH = $('.slide').length;
      $(".next").click(function() {
        currSlide = currSlide === SLIDE_LENGTH ? 1 : ++currSlide;
        $('html,body').animate({
            scrollTop: $(`.p${currSlide}`).offset().top
          },
          'slow');
      });
      body {
        margin: 0;
        height: 100%;
      }
      
      /* Less repetition */
      .slide {
        height: 100vh;
        width: 70%;
      }
      
      .p1 {
        background-color: #2196F3;
      }
      
      .p2 {
        background-color: #E91E63;
      }
      
      .p3 {
        background-color: #01579B;
      }
      
      .admin {
        background-color: #B71C1C;
        height: 100vh;
        position: fixed;
        right: 0%;
        top: 0%;
        width: 30%;
        float: left;
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div class="slide p1"></div>
      <div class="slide p2"></div>
      <div class="slide p3"></div>
      
      <div class="admin">
        <button class="next">NEXT</button>
      </div>

      jsFiddle

      奖金编辑:

      如果您有兴趣在某个时候添加上一个按钮……

      let currSlide = 1;
      const SLIDE_LENGTH = $('.slide').length;
      
      function moveSlide() {
        currSlide = $(this).hasClass("next") ? ++currSlide : --currSlide;
        if (currSlide < 1) {
          currSlide = SLIDE_LENGTH;
        }
        if (currSlide > SLIDE_LENGTH) {
          currSlide = 1;
        }
        $('html,body').animate({
            scrollTop: $(`.p${currSlide}`).offset().top
          },
          'slow');
      }
      
      $(".prev, .next").on("click", moveSlide);
      body {
        margin: 0;
        height: 100%;
      }
      
      /* Less repetition */
      
      .slide {
        height: 100vh;
        width: 70%;
      }
      
      .p1 {
        background-color: #2196F3;
      }
      
      .p2 {
        background-color: #E91E63;
      }
      
      .p3 {
        background-color: #01579B;
      }
      
      .admin {
        background-color: #B71C1C;
        height: 100vh;
        position: fixed;
        right: 0%;
        top: 0%;
        width: 30%;
        float: left;
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div class="slide p1"></div>
      <div class="slide p2"></div>
      <div class="slide p3"></div>
      
      <div class="admin">
        <button class="prev">PREVIOUS</button>
        <button class="next">NEXT</button>
      </div>

      jsFiddle

      【讨论】:

      • @freedomn-m 完成。
      【解决方案4】:

      由于您的问题是“如何使用 Javascript”,我将用几行原版 JS 来回答这个问题:

      var p = 1;
      const container = document.getElementById('container');
      var nextPage = function() {
        var topPos = document.getElementsByClassName('page')[p++].offsetTop;
        container.scrollTo({top: topPos, behavior: 'smooth'});
      }
      

      在上面的示例中,page 是您分配给要滚动到的 div 的类名,例如:

      <div id="container">
        <div class="page p1"></div>
        <div class="page p2"></div>
        <div class="page p3"></div>
      </div>
      

      既然你想滚动整个浏览器窗口,你只需替换

      container.scrollTo({top: topPos, behavior: 'smooth'});
      

      window.scrollTo({top: topPos, behavior: 'smooth'});
      

      像这样:

      var p = 1;
      var nextPage = function() {
        var topPos = document.getElementsByClassName('page')[p++].offsetTop;
        window.scrollTo({top: topPos, behavior: 'smooth'});
      }
      

      如果topPos 位置不正确,您可以减去或添加要偏移的像素数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        相关资源
        最近更新 更多