jQuery滚动动画滚动到div底部而不是顶部

3

我正在制作一个带有导航栏的网站。当点击导航栏中的项目时,它应该滚动到特定的div,但它却滚动到div的底部而不是顶部。

我找不到错误,有人能帮忙吗?

欢迎任何帮助。

我的代码:

* {box-sizing: border-box;}
body { 
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
  background-color: #10171e;
  color: white;
}
img{
  width: 100%;
}
.header {
  margin-bottom: 100px;
  position: fixed;
  width: 100%;
  overflow: hidden;
  background-color: #15202b;
  padding: 20px 10px;
}
.header a {
  float: left;
  color: white;
  text-align: center;
  padding: 12px;
  text-decoration: none;
  font-size: 18px; 
  line-height: 25px;
  border-radius: 4px;
}
.header a:hover {
  background-color: #ddd;
  color: black;
}
.header-right {
  float: left;
}

.home{
  /*margin-bottom: 500px;*/
}
.about{
  background: red;
  /*height: 1000px;*/
  /*margin-top: 500px;*/
  /*margin-bottom: 500px;*/
  width: 60%;
  margin-left: 20%;
}
.contact{
  background-color: blue;
  height: 1000px;
  /*margin-top: 500px;*/
  /*margin-bottom: 500px;*/
  width: 60%;
  margin-left: 20%;
}
}
@media screen and (max-width: 500px) {
  .header a {
    float: none;
    display: block;
    text-align: left;
  }
  
  .header-right {
    float: none;
  }
}
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <link rel="stylesheet" type="text/css" href="style.css">
 <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>
 <title>Jurjen</title>
</head>
<body>
 <div class="home">
  <div class="header">
      <a class="nav" href="#" id="home">Home</a>
      <a class="nav" href="#" id="about">About</a>
      <a class="nav" href="#" id="contact">Contact</a>
  </div>
  <img src="img/programmer1.png" alt="programmer"> 
  <a id="button" class="arrow bounce" href="#"></a>
 </div>
 <div class="about">
  <p class="P1">Waarom gebruiken we het? Het is al geruime tijd een bekend gegeven dat een lezer, tijdens het bekijken van de layout van een pagina, afgeleid wordt door de tekstuele inhoud. Het belangrijke punt van het gebruik van Lorem Ipsum is dat het uit een min of meer normale verdeling van letters bestaat, in tegenstelling tot "Hier uw tekst, hier uw tekst" wat het tot min of meer leesbaar nederlands maakt. Veel desktop publishing pakketten en web pagina editors gebruiken tegenwoordig Lorem Ipsum als hun standaard model tekst, en een zoekopdracht naar "lorem ipsum" ontsluit veel websites die nog in aanbouw zijn. Verscheidene versies hebben zich ontwikkeld in de loop van de jaren, soms per ongeluk soms expres (ingevoegde humor en dergelijke).</p>
 </div>
 <div class="contact">
  <p>Waarom gebruiken we het?Het is al geruime tijd een bekend gegeven dat een lezer, tijdens het bekijken van de layout van een pagina, afgeleid wordt door de tekstuele inhoud. Het belangrijke punt van het gebruik van Lorem Ipsum is dat het uit een min of meer normale verdeling van letters bestaat, in tegenstelling tot "Hier uw tekst, hier uw tekst" wat het tot min of meer leesbaar nederlands maakt. Veel desktop publishing pakketten en web pagina editors gebruiken tegenwoordig Lorem Ipsum als hun standaard model tekst, en een zoekopdracht naar "lorem ipsum" ontsluit veel websites die nog in aanbouw zijn. Verscheidene versies hebben zich ontwikkeld in de loop van de jaren, soms per ongeluk soms expres (ingevoegde humor en dergelijke).
  </p>
 </div>
</body>
<footer></footer>
</html>
<script type="text/javascript">
$("#button").click(function() {
 $('html,body').animate({
     scrollTop: $(".P1").offset().top},
     'slow');
});
$("#home").click(function() {
    $('html,body').animate({
        scrollTop: $(".home").offset().top},
        'slow');
});
$("#about").click(function() {
    $('html,body').animate({
        scrollTop: $(".about").offset().top},
        'slow');
});
$("#contact").click(function() {
    $('html,body').animate({
        scrollTop: $(".contact").offset().top},
        'slow');
});
</script>

正如您所看到的,当您点击导航按钮时,它会滚动,但不会滚动到div的顶部,而是滚动到div的中间。这是什么原因?

1个回答

4
问题是由于offset().top没有考虑到.header元素的高度,所以内容与其下方对齐。

要解决这个问题,只需获取.headerouterHeight()并从offset().top中减去即可。

另外,请注意您可以通过使用单个选择器检索它们所有并通过连接点击的a元素的id来定位要滚动到的元素,从而简化多个单击处理程序。请尝试以下操作:

var navHeight = $('.header').outerHeight();

$(".header a").click(function() {
  $('html,body').animate({
    scrollTop: $("." + this.id).offset().top - navHeight
  }, 'slow');
});
* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
  background-color: #10171e;
  color: white;
}

img {
  width: 100%;
}

.header {
  margin-bottom: 100px;
  position: fixed;
  width: 100%;
  overflow: hidden;
  background-color: #15202b;
  padding: 20px 10px;
}

.header a {
  float: left;
  color: white;
  text-align: center;
  padding: 12px;
  text-decoration: none;
  font-size: 18px;
  line-height: 25px;
  border-radius: 4px;
}

.header a:hover {
  background-color: #ddd;
  color: black;
}

.header-right {
  float: left;
}

.home {
  /*margin-bottom: 500px;*/
}

.about {
  background: red;
  /*height: 1000px;*/
  /*margin-top: 500px;*/
  /*margin-bottom: 500px;*/
  width: 60%;
  margin-left: 20%;
}

.contact {
  background-color: blue;
  height: 1000px;
  /*margin-top: 500px;*/
  /*margin-bottom: 500px;*/
  width: 60%;
  margin-left: 20%;
}


}
@media screen and (max-width: 500px) {
  .header a {
    float: none;
    display: block;
    text-align: left;
  }
  
  .header-right {
    float: none;
  }
}
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js"></script>

<div class="home">
  <div class="header">
    <a class="nav" href="#" id="home">Home</a>
    <a class="nav" href="#" id="about">About</a>
    <a class="nav" href="#" id="contact">Contact</a>
  </div>
  <img src="img/programmer1.png" alt="programmer">
  <a id="button" class="arrow bounce" href="#"></a>
</div>
<div class="about">
  <p class="P1">Waarom gebruiken we het? Het is al geruime tijd een bekend gegeven dat een lezer, tijdens het bekijken van de layout van een pagina, afgeleid wordt door de tekstuele inhoud. Het belangrijke punt van het gebruik van Lorem Ipsum is dat het uit een min
    of meer normale verdeling van letters bestaat, in tegenstelling tot "Hier uw tekst, hier uw tekst" wat het tot min of meer leesbaar nederlands maakt. Veel desktop publishing pakketten en web pagina editors gebruiken tegenwoordig Lorem Ipsum als hun
    standaard model tekst, en een zoekopdracht naar "lorem ipsum" ontsluit veel websites die nog in aanbouw zijn. Verscheidene versies hebben zich ontwikkeld in de loop van de jaren, soms per ongeluk soms expres (ingevoegde humor en dergelijke).</p>
</div>
<div class="contact">
  <p>Waarom gebruiken we het?Het is al geruime tijd een bekend gegeven dat een lezer, tijdens het bekijken van de layout van een pagina, afgeleid wordt door de tekstuele inhoud. Het belangrijke punt van het gebruik van Lorem Ipsum is dat het uit een min
    of meer normale verdeling van letters bestaat, in tegenstelling tot "Hier uw tekst, hier uw tekst" wat het tot min of meer leesbaar nederlands maakt. Veel desktop publishing pakketten en web pagina editors gebruiken tegenwoordig Lorem Ipsum als hun
    standaard model tekst, en een zoekopdracht naar "lorem ipsum" ontsluit veel websites die nog in aanbouw zijn. Verscheidene versies hebben zich ontwikkeld in de loop van de jaren, soms per ongeluk soms expres (ingevoegde humor en dergelijke).
  </p>
</div>


如何使用纯JavaScript编写outerHeight? - doğukan
@DogukanCavus 请查看 https://dev59.com/mGgv5IYBdhLWcg3wMN0U - Rory McCrossan
1
@J.vee 没问题,很高兴能帮助。 - Rory McCrossan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接