如何为 Bootstrap 的滚动间谍功能添加平滑滚动

IT技术 javascript html css twitter-bootstrap smooth-scrolling
2021-02-21 11:21:49

一段时间以来,我一直在尝试向我的网站添加平滑滚动功能,但似乎无法使其正常工作。

这是与我的导航相关的 HTML 代码:

<div id="nav-wrapper">
<div id="nav" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="675">
  <div class="navbar-inner" data-spy="affix-top">
    <div class="container">

      <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>

      <!-- Everything you want hidden at 940px or less, place within here -->
      <div class="nav-collapse collapse">
        <ul class="nav">
            <li><a href="#home">Home</a></li>
            <li><a href="#service-top">Services</a></li>
            <li><a href="#contact-arrow">Contact</a></li>
        </ul><!--/.nav-->
      </div><!--/.nav-collapse collapse pull-right-->
    </div><!--/.container-->
  </div><!--/.navbar-inner-->
</div><!--/#nav /.navbar navbar-inverse-->
</div><!--/#nav-wrapper-->

这是我添加的JS代码:

<script src="js/jquery.scrollTo-1.4.3.1-min.js"></script>

<script>
    $(document).ready(function(e) {

        $('#nav').scrollSpy()
        $('#nav ul li a').bind('click', function(e) {
            e.preventDefault();
            target = this.hash;
            console.log(target);
            $.scrollTo(target, 1000);
        });
    });
</script>

就其value而言,这里是我收到有关我迄今为止所做工作的信息的地方,这里是我的网站的当前形式。如果你能帮我,我会给你烤馅饼或饼干之类的。谢谢!

6个回答

你真的需要那个插件吗?您可以为该scrollTop属性设置动画

$("#nav ul li a[href^='#']").on('click', function(e) {

   // prevent default anchor click behavior
   e.preventDefault();

   // store hash
   var hash = this.hash;

   // animate
   $('html, body').animate({
       scrollTop: $(hash).offset().top
     }, 300, function(){

       // when done, add hash to url
       // (default click behaviour)
       window.location.hash = hash;
     });

});

小提琴

请注意,要使其正常工作,您需要将其<a id="...">用作锚点而不是通常的锚点<a name="...">(尽管您可以将这两个属性添加为后备)。
2021-05-03 11:21:49
我的问题 1 不在 Bootstrap 中。AddThis 插件会导致该问题。这是一个解决方案:support.addthis.com/customer/portal/articles/...
2021-05-13 11:21:49
不错,@Dologan - 我编辑了结果并更改bindon.
2021-05-18 11:21:49
为了解决undefinde问题我这样做:1)加入这一行target = this.hash;之前e.preventDefault();2)变线window.location.hash = this.hash;window.location.hash = target;
2021-05-18 11:21:49
当所有链接都指向同一页面中的锚点时,这很有效,但如果包含外部链接,它们将不再起作用。因为它只在锚点上运行并留下真实的链接可操作使用:$("#nav ul li a[href^='#']").bind('click'').bind(...)相反。
2021-05-20 11:21:49

如果你有一个固定的导航栏,你将需要这样的东西。

从以上最佳答案和评论中汲取...

$(".bs-js-navbar-scrollspy li a[href^='#']").on('click', function(event) {
  var target = this.hash;

  event.preventDefault();

  var navOffset = $('#navbar').height();

  return $('html, body').animate({
    scrollTop: $(this.hash).offset().top - navOffset
  }, 300, function() {
    return window.history.pushState(null, null, target);
  });
});

首先,为了防止“未定义”错误,target在调用 之前将散列存储到变量,然后preventDefault()引用该存储值,如 pupadupa 所述。

下一个。您不能使用,window.location.hash = target因为它同时而不是单独设置 url 和位置。您最终将在元素的开头找到位置,该元素的 id 与 href... 匹配,但被固定的顶部导航栏覆盖。

为了解决这个问题,您将 scrollTop 值设置为目标的垂直滚动位置值减去固定导航栏的高度。直接针对该值可保持平滑滚动,而不是事后添加调整,并产生看起来不专业的抖动。

您会注意到 url 没有改变。要设置它,请改用return window.history.pushState(null, null, target);手动将 url 添加到历史堆栈中。

完毕!

其他注意事项:

1) 使用该.on方法是最新的(截至 2015 年 1 月)jquery 方法,它比.bindor更好.live,甚至.click原因我会留给你找出来。

2) navOffset 值可以在函数内部或外部,但您可能希望它在外部,因为您很可能会引用其他函数/DOM 操作的垂直空间。但我把它留在里面,使它整齐地成为一个功能。

$("#YOUR-BUTTON").on('click', function(e) {
   e.preventDefault();
   $('html, body').animate({
        scrollTop: $("#YOUR-TARGET").offset().top
     }, 300);
});
这使用 jquery,如果您不使用 jquery,这将不起作用。
2021-05-13 11:21:49
这段代码有什么作用?你能改进这个答案吗?
2021-05-17 11:21:49
// styles.css
html {
    scroll-behavior: smooth
}

来源:https : //www.w3schools.com/howto/howto_css_smooth_scroll.asp#section2

如果您下载了 jquery 缓动插件(检查出来),那么您只需要将其添加到您的 main.js 文件中:

$('a.smooth-scroll').on('click', function(event) {
    var $anchor = $(this);
    $('html, body').stop().animate({
        scrollTop: $($anchor.attr('href')).offset().top + 20
    }, 1500, 'easeInOutExpo');
    event.preventDefault();
});

并且不要忘记将平滑滚动类添加到您的 a 标签中,如下所示:

 <li><a href="#about" class="smooth-scroll">About Us</a></li>