Animate scrolling to top of element within an overflow div

Dustin

I am struggling to figure this out. I have a div that is set to overflow: scroll;. I want to be able to click a link and have the content in that div scroll to the top of the linked element. For some reason it always seems like it scrolls until the top of the element hits the top of the body. I need it to stop when it hits the top of the overflow div. In the example I have below when you click "link to paragraph 3" I need it to put paragraph 3 at the top of the scrollable div.

$(document).ready(function(){
$("a").click(function(e){
    e.preventDefault();
    
    var anchor = $(this).attr("href");
    
    console.log(anchor);
      $(".parent").animate({
        scrollTop: $(anchor).offset().top - $(".parent").offset().top
      }, 2000);

});
});
body {background-color:tan;}

.parent {height:100px; overflow-y:scroll; background-color:#ffff; margin-top:100px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<a href="#child3" class="child3">Link to paragraph 3</a>
<a href="#child4" class="child4">Link to paragraph 4</a>

<div class="parent">
  <div id="child1">
  <p><strong>paragraph 1</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child2">
  <p><strong>paragraph 2</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child3">
  <p><strong>paragraph 3</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child4">
  <p><strong>paragraph 4</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child5">
  <p><strong>paragraph 5</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>
</div>

Mark Fisher

jQuery's .offset() method returns the offset of the element relative to the document. To counteract this, you need to substract the offset of the container. Below I have modified the 4th line of javascript only.

$(document).ready(function(){
$("a").click(function(e){
    e.preventDefault();
    
    var anchor = $(this).attr("href");
    
    console.log(anchor);
      $(".parent").animate({
        scrollTop: $(".parent").scrollTop() + $(anchor).offset().top - $(".parent").offset().top
      }, 2000);

});
});
body {
    background-color:tan;
}

.parent {
    height:100px;
    overflow-y:scroll;
    background-color:#ffff;
    margin-top:100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="#child3" class="child3">Link to paragraph 3</a>
<a href="#child4" class="child4">Link to paragraph 4</a>

<div class="parent">
  <div id="child1">
  <p><strong>paragraph 1</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child2">
  <p><strong>paragraph 2</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child3">
  <p><strong>paragraph 3</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child4">
  <p><strong>paragraph 4</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>

  <div id="child5">
  <p><strong>paragraph 5</strong>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque consectetur repellendus laboriosam ad magnam fugiat cum, in nam, facilis enim perferendis? Deleniti laudantium praesentium est culpa, similique ut error iure.
  </p>
  </div>
</div>

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related