2016-08-21 107 views
0

我让我的div滚动对方,没有他们从屏幕向上滚动,从示例(这里jsfiddle)。滚动到只有一个滚动div div divs已滚动对方

(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的动画效果

回答

0

您必须稍微修改一下设置。我把你的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>

+0

在第一个代码段见[的jsfiddle](http://jsfiddle.net/xtyus/1 /),一个div是固定的,而另一个div是在固定div上滑动的,这是该片段的主要部分。但是这个代码禁用了这个效果,只能让它从一个滚动的div移动到div。我不能接受它,因为它还没有回答我的问题,但它更进一步。谢谢 – bexis

+0

我冒昧地将您的js代码片段添加到原始代码中,并且向下滚动时,它完全按照我想要的方式工作,[jsfiddle](https://jsfiddle.net/duyknL3n/),但是当您尝试向上滚动,它根本不起作用。现在的问题是,如何使它以这种方式回滚。这将是答案,谢谢 – bexis

+0

是的,我完全flubbed,对不起。我继续前进并清理并修复了我的示例,以包含原始效果并对其进行修复,以便在您向后滚动时实现效果。 – xorspark