javascript - 滚动到一个 div,只有一个滚动,已经相互滚动的 div

标签 javascript jquery html css

我让我的 div 相互滚动,没有它们向上滚动出屏幕,例如(这里是 jsfiddle)。

(function($){
    /* Store the original positions */
    var d1 = $('.one');
    var d1orgtop = d1.position().top;
    var d2 = $('.two');
    var d2orgtop = d2.position().top;
    var d3 = $('.three');
    var d3orgtop = d3.position().top;
    var d4 = $('.four');
    var d4orgtop = d4.position().top;
    
    /* respond to the scroll event */
    $(window).scroll(function(){
        /* get the current scroll position */
        var st = $(window).scrollTop();

        /* change classes based on section positions */
        if (st >= d1orgtop) {
            d1.addClass('latched');
        } else {
            d1.removeClass('latched');
        }
        if (st >= d2orgtop) {
            d2.addClass('latched');
        } else {
            d2.removeClass('latched');
        }
        if (st >= d3orgtop) {
            d3.addClass('latched');
        } else {
            d3.removeClass('latched');
        }
        if (st >= d4orgtop) {
            d4.addClass('latched');
        } else {
            d4.removeClass('latched');
        }
    });

})(window.jQuery);
.container {
    background: black;
    position: relative;
}
.spacer {
    width: 0;
    height: 600px;
    float: left;
     clear: both;
}
.one { background:red; width: 100%; height: 600px; position: relative; float: left; }
.two { background: blue; width: 100%; height: 600px; position: relative; float: left; }
.three { background: green; width: 100%; height: 600px; position: relative; float: left; }
.four { background: yellow; width: 100%; height: 600px; position: relative; float: left; }
.latched { position: fixed; top: 0; left: 8px; right: 8px; width: auto; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- 1. Items that are not in fixed position * latched * scroll normally -->
<!-- 2. Items that go above the scroll position are given .latched -->
<!-- 3. If they scroll down again, they lose .latched -->
<!-- 4. div.spacer included to pad out space when content sections become latched -->

<div class="spacer"></div>
<div class="one">
    <h2>ONE</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec erat. Sed ultrices ornare volutpat.</p>

    <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="two">
    <h2>TWO</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec erat. Sed ultrices ornare volutpat.</p>

    <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="three">
    <h2>THREE</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec erat. Sed ultrices ornare volutpat.</p>

    <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="four">
    <h2>FOUR</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec erat. Sed ultrices ornare volutpat.</p>

    <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div style="clear: both"></div>
<div style="height: 1000px"></div>

现在我想只用一个滚动条从一个 div 滚动到另一个 div(从一个部分滚动到另一个部分)- 请参见这里的示例 jsfiddle .同时仍然保持一个 div 在另一个 div 上滚动的动画效果

最佳答案

您必须稍微修改一下设置。我将您的 div 放入一个数组中,然后修改了您的代码,以便它跟踪滚动事件的目标 div。您还需要忽略滚动到元素时生成的滚动事件。来自 this answer 的代码在这方面提供了帮助。

这是您更新后的代码(它还保持了 div 固定效果):

(function($) {
  var prevScroll = 0; //stores last successful scroll
  var scrollIdx = 0; //current index in your div array
  //array that contains the div object and original offset from the top to handle the animation
  var divs = [{
    div: $('.one'),
    top: $('.one').position().top
  }, {
    div: $('.two'),
    top: $('.two').position().top
  }, {
    div: $('.three'),
    top: $('.three').position().top
  }, {
    div: $('.four'),
    top: $('.four').position().top
  }];
  var scrollDestination = -1; //stores the target div's offset 

  // handles div fixing as the scroll transitions from one div to the next
  function setLatch(st) {
    divs.forEach(function(divObj) {
      if (st >= divObj.top) {
        divObj.div.addClass('latched');
      } else {
        divObj.div.removeClass('latched');
      }
    })
  }

  /* respond to the scroll event */
  $(window).scroll(function(e) {
    /* get the current scroll position */
    var st = $(window).scrollTop();
    var scrollDir = 0;

    //reset the latch as the scroll occurs
    setLatch(st);

    // check the state of the scroll event
    if (scrollDestination == -1) { //we're done scrolling
      //noop
    } else if (st != scrollDestination) { //we're still scrolling, ignore
      return;
    } else if (st == scrollDestination) { //we're done, but ignore this final scroll event
      scrollDestination = -1;
      prevScroll = st;
      return;
    }

    //determine the direction of the scroll;
    if (st > prevScroll) {
      scrollDir = 1;
    } else {
      scrollDir = -1;
    }

    if (scrollIdx + scrollDir == divs.length || scrollIdx + scrollDir < 0) {
      //do nothing bu update the prevScroll so we can accurately 
      //capture the direction the next time around
      prevScroll = st;
      return;
    }

    scrollIdx += scrollDir;
    //record the destination of the next div
    scrollDestination = divs[scrollIdx].top;
    $('html, body').animate({
      scrollTop: divs[scrollIdx].top
    }, {
      duration: 1000
    });

  });

})(window.jQuery);
.container {
  background: black;
  position: relative;
}
.spacer {
  width: 0;
  height: 600px;
  float: left;
  clear: both;
}
.one {
  background: red;
  width: 100%;
  height: 600px;
  position: relative;
  float: left;
}
.two {
  background: blue;
  width: 100%;
  height: 600px;
  position: relative;
  float: left;
}
.three {
  background: green;
  width: 100%;
  height: 600px;
  position: relative;
  float: left;
}
.four {
  background: yellow;
  width: 100%;
  height: 600px;
  position: relative;
  float: left;
}
.latched {
  position: fixed;
  top: 0;
  left: 8px;
  right: 8px;
  width: auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- 1. Items that are not in fixed position * latched * scroll normally -->
<!-- 2. Items that go above the scroll position are given .latched -->
<!-- 3. If they scroll down again, they lose .latched -->
<!-- 4. div.spacer included to pad out space when content sections become latched -->

<div class="spacer"></div>
<div class="one">
  <h2>ONE</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat
    ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum
    mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec
    erat. Sed ultrices ornare volutpat.</p>

  <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla
    mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="two">
  <h2>TWO</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat
    ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum
    mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec
    erat. Sed ultrices ornare volutpat.</p>

  <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla
    mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="three">
  <h2>THREE</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat
    ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum
    mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec
    erat. Sed ultrices ornare volutpat.</p>

  <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla
    mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div class="spacer"></div>
<div class="four">
  <h2>FOUR</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec lacus risus, eu sagittis felis. Praesent in feugiat elit. Pellentesque sem turpis, ornare et porttitor quis, placerat sit amet lacus. Fusce in purus sit amet sapien vestibulum volutpat
    ac at velit. Donec vel libero risus. Aliquam aliquet arcu vel justo molestie euismod. Suspendisse lorem massa, venenatis non congue a, commodo et nunc. Phasellus rhoncus, arcu a tristique adipiscing, mi dolor ullamcorper lacus, vel adipiscing ipsum
    mi ut augue. Pellentesque rhoncus dapibus tellus. Proin nec ante vel quam posuere mollis non vitae sem. Praesent hendrerit urna ac nisl consequat placerat. Ut placerat sollicitudin cursus. Curabitur orci magna, rhoncus et tempor non, volutpat nec
    erat. Sed ultrices ornare volutpat.</p>

  <p>Nunc imperdiet felis a purus feugiat vel euismod urna tristique. Maecenas sit amet felis tincidunt nulla tincidunt convallis nec eu purus. Donec auctor mauris non nisi rutrum euismod. Donec vehicula ipsum sit amet enim viverra sit amet commodo nulla
    mollis. Maecenas iaculis tincidunt quam et adipiscing. Vivamus eleifend nulla lobortis augue ultrices porta. Ut ut turpis dui, in vehicula nunc. In hac habitasse platea dictumst. Aliquam erat volutpat.</p>
</div>
<div style="clear: both"></div>
<div style="height: 1000px"></div>

关于javascript - 滚动到一个 div,只有一个滚动,已经相互滚动的 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39066301/

相关文章:

javascript - 动态地将项目插入到 SVG 元素中

javascript - 为什么请求呈指数级增长?

javascript - 在子窗口中从父窗口运行JS函数?

javascript - Jquery Ajax 调用不设置 cookie

html - 在 NodeJS 中读取复选框数据的正确方法

javascript - 使用 jquery 进行多文件上传,有限制

javascript - jQuery 插件 select2 有没有办法保留每个选择选项的类?

javascript - 如何使用 Jekyll 禁用/启用弹出窗口

javascript - 如何在前端截取包含用户上传图片的 div 的屏幕截图?

javascript - 将 jQuery 与 WinJS 绑定(bind)元素结合使用