javascript - JQuery 平滑滚动到带有粘性导航栏的 anchor

标签 javascript jquery css html

我有一个带有粘性 header 的网页,我正在尝试实现平滑滚动以锚定标签以进行导航。当我点击我想去的部分的导航链接时 scrollTop: href.offset().top - 100似乎无法正常工作。如果我在网页导航到该部分后再次单击该链接,我可以看到页面滚动,但随后又弹回到顶部。知道发生了什么事吗?我正在使用 Microsoft Edge(是的,我知道......)。

HTML

<!DOCTYPE HTML>
<html lang="en">
<head></head>
<body id="home">
    <nav><a href="#section1">Section #1</a></nav>
    <main>
        <!-- INSERT A BUNCH OF <BR> TAGS -->
        <h2 id="section1">section1</h2>
        <!-- INSERT A BUNCH OF <BR> TAGS -->
    </main>
</body>
</html>

CSS

nav {
    position:fixed;
    padding:4px;
border:2px solid #000;
width:100%;
    line-height:2.25em;
    background-color:yellow;
}

h2 {
    padding:4px;
    border:1px solid #000;
    width:100%;
    line-height:100px;
    background-color:red;
    }

jQuery

$(document).ready(function() {

    $('a[href*="#"]').click(function(event) {

        var href = $(this.hash);

        if (href.length) {
            event.preventDefault();
            $('html, body').animate({
                scrollTop: href.offset().top - 100
            }, 750, function() {
                location.hash = href.attr('id');
            });     
        }
    });
});

JSFiddle

编辑:

我知道设置 <div>元素到 display:fixed将其从页面流中删除,我认为这是导致问题的原因。有解决办法吗?

最佳答案

编辑:

Edge 和 Firefox 并未配合修改 hashchange 行为的初始方法,因此此编辑只是删除​​了 window.location.hash 步骤以防止动画后跳转.但是,这并不理想,因为它阻止了默认的哈希位置行为。

$(document).ready(function() {
  $('a[href*="#"]').on('click', (event) => {
    const hash = event.currentTarget.hash;
    if (hash) {
      event.preventDefault();
      $('html, body').animate({scrollTop: $(hash).offset().top - 100}, 750);
    }
  });
});
nav {
  position: fixed;
  padding: 4px;
  border: 2px solid #000;
  width: 100%;
  line-height: 2.25em;
  background-color: yellow;
}

h2 {
  padding: 4px;
  border: 1px solid #000;
  width: 100%;
  line-height: 100px;
  background-color: red;
}
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  </head>
  <body id="home">
    <!-- Navigation -->
    <nav><a href="#section1">Section #1</a></nav>
    <!-- Main Content -->
    <main>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <h2 id="section1">section1</h2>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
      <br>
    </main>
  </body>
</html>

原创:

我认为 location.hash 会导致滚动在 scrollTop 动画完成后跳到顶部。您可以修改 hashchange 事件以在 anchor 上方相同距离处停止滚动以消除跳跃。

$(document).ready(function() {
  $(window).on('hashchange', function() {
    window.scrollTo(window.scrollX, window.scrollY - 100);
  });
  
  $('a[href*="#"]').on('click', (event) => {
    const hash = event.currentTarget.hash;
    if (hash) {
      event.preventDefault();
      $('html, body').animate({
        scrollTop: $(hash).offset().top - 100
      }, 750, function() {
        window.location.hash = hash;
      });
    }
  });
});

关于javascript - JQuery 平滑滚动到带有粘性导航栏的 anchor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52322144/

相关文章:

javascript - 如何检查页面上是否加载了 jQuery 文件?

html - 为什么有一个永无止境的行(文本超过其容器的 div 宽度时不会放置到下一行)

javascript - 模态对话框内的 JQuery UI slider

java - 如何在javafx中完成边框长度?

html - 为什么我的标题和图片之间有大约 1-2 像素的差距?

javascript - DrawImage 不会在第一帧加载

javascript - 通过 React 的 useState Hook 设置状态时,删除键的最佳或最有效的方法是什么?

javascript - getSVGDocument 在 FireFox 和 Chrome 中返回 null

javascript - 禁用在 Bootstrap 模式区域之外单击以关闭模式

javascript - Jquery UI Datepicker - 如何使用 jquery/javascript 突出显示多个日期 bgcolor