简体   繁体   English

如何动画滚动位置到可滚动div中的目标元素?

[英]How to animate scroll position to target element in scrollable div?

How can I scroll to multiple anchors in a scrollable dviv ?.如何在可滚动的dviv滚动到多个锚点? My code is not working properly.我的代码工作不正常。 I checked it's working fine when I take reference the html and body elements.当我参考htmlbody元素时,我检查它工作正常。

 $(document).ready(function() { $('.btnpins a').click(function(e) { e.preventDefault(); $('.results').stop().animate({ scrollTop: $($(this).attr('href')).offset().top - 60 }, 400); return false; }); });
 .results { width: 300px; height: 500px; margin-top: 20px; overflow-y: scroll; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="btnpins"> <a href="#result1">Pin 1</a> <a href="#result2">Pin 2</a> <a href="#result3">Pin 3</a> <a href="#result4" class="focus">Pin 4</a> </div> <div class="results"> <div class="resultin" id="result1"> <h5>Result 1</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result2"> <h5>Result 2</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result3"> <h5>Result 3</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result4"> <h5>Result 4</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> </div>

The issue is because offset() returns the position of the element relative to the document , not the parent container, hence the value returned is thrown out when the scroll position of .results is not at the top.问题是因为offset()返回元素相对于document ,而不是父容器,因此当.results的滚动位置不在顶部时,返回的值会被抛出。

To address this you need to allow for the offset() and scrollTop() of the .results div in the position calculation.为了解决这个问题,您需要在位置计算中.results div 的offset()scrollTop() Try this:尝试这个:

 jQuery($ => { $('.btnpins a').click(function(e) { e.preventDefault(); let $results = $('.results'); let $target = $($(this).attr('href')); $results.stop().animate({ scrollTop: $target.offset().top - $results.offset().top + $results.scrollTop() }, 400); }); });
 .results { width: 300px; height: 500px; margin-top: 20px; overflow-y: scroll; position: relative; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="btnpins"> <a href="#result1">Pin 1</a> <a href="#result2">Pin 2</a> <a href="#result3">Pin 3</a> <a href="#result4" class="focus">Pin 4</a> </div> <div class="results"> <div class="resultin" id="result1"> <h5>Result 1</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result2"> <h5>Result 2</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result3"> <h5>Result 3</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result4"> <h5>Result 4</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> </div>

You should be scrolling relative to the parent container, which in your case is .results .您应该相对于父容器滚动,在您的情况下是.results Use $('.results').scrollTop() to get the container position and add it to your scrollTop position calculation使用$('.results').scrollTop()获取容器位置并将其添加到您的scrollTop位置计算中

$('.results').stop().animate({
  scrollTop: $('.results').scrollTop() + $($(this).attr('href')).offset().top - 60
}, 400);

 $(document).ready(function() { $('.btnpins a').click(function(e) { e.preventDefault(); $('.results').stop().animate({ scrollTop: $('.results').scrollTop() + $($(this).attr('href')).offset().top - 60 }, 400); return false; }); });
 .results { width: 300px; height: 500px; margin-top: 20px; overflow-y: scroll; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="btnpins"> <a href="#result1">Pin 1</a> <a href="#result2">Pin 2</a> <a href="#result3">Pin 3</a> <a href="#result4" class="focus">Pin 4</a> </div> <div class="results"> <div class="resultin" id="result1"> <h5>Result 1</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result2"> <h5>Result 2</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result3"> <h5>Result 3</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> <div class="resultin" id="result4"> <h5>Result 4</h5> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> <hr> </div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM