【问题标题】:Smooth Anchor Scroll with url带有 url 的平滑锚滚动
【发布时间】:2014-06-17 09:52:47
【问题描述】:

我想用 jQuery 实现平滑滚动到锚点。我找到了一些解决方案,但是,它们都是基于指向锚点的链接看起来像这样的事实:

<a href="#anchor-id">TEST</a>

在我的场景中,链接如下所示:

<a href="some-page#anchor-id">TEST</a>

我有一个全局导航栏,其中包含指向“某些页面”的链接,悬停菜单条目会打开一个下拉菜单,其中包含指向该页面上锚点的链接。

我在网上找到了以下适用于常规锚链接&lt;a href="#..."&gt;的脚本:

$('a[href^="#"]').bind('click.smoothscroll', function (e) {
   e.preventDefault();

   var target = this.hash,
   $target = $(target);

   $('html, body').stop().animate({
      'scrollTop': $taeget.offset().top-60 
   }, 4000, 'swing', function () {
      window.location.hash = target;
   });
});

小提琴的链接:http://jsfiddle.net/2nT8M/5/

小提琴似乎不起作用,但是代码在我的网站上确实有效...

我的问题:

  • 如何让脚本正常工作(显然)?
  • 是否可以根据我的场景的需要使用不仅包含锚点 ID 的链接?

【问题讨论】:

  • 究竟是什么不工作?如果我单击您的 TEST 锚,它会向下滚动到 ANCHOR 元素,就像小提琴中的预期一样。除了您的 $('a[href^="#"]'
  • 谢谢,错字破坏了小提琴中的代码......现在它正在工作。但是,如果我将脚本与这种类型的链接 &lt;a href="sample-page#anchor"&gt;一起使用,则它不起作用。它只适用于#anchor...我怎样才能让它适用于较长的链接?
  • jsfiddle.net/2nT8M/6 这只是短链接的平滑滚动示例。对于更长的,你必须从你的href中获取#anchor-id,例如: var target = $( $(this).attr('href') );之后:target = '#' + target.split('#')[1]
  • 嘿,你能写成代码吗?我不明白它属于什么......

标签: jquery scroll


【解决方案1】:

这是一个有效的小提琴:http://jsfiddle.net/2nT8M/7/

如果你想滚动到一个 id 等于你的锚的 #-part 的元素,你可以像这样访问它:

HTML:

<div id="one"><a class="link" href="da#test">TEST</a></div>
<a id="test">ANCHOR</a>
<div id="two"><a class="link" href="ws#test2">TEST2</a></div>
<a id="test2">ANCHOR</a>

只需给一个元素(在本例中为 ANCHOR)与您的 href 的#-part 相同的 ID。还给所有可点击的 anachors 一个 class="link" 例如

如果你检查我的小提琴,你会看到以下 JS:

$('.link').on('click', function(event) {
  event.preventDefault();
  var target = $(this).attr('href');
  target = $('#' + target.split('#')[1]);
  if( target.length ) {
    $('html, body').animate({
        scrollTop: target.offset().top
    }, 1000);
  }
});

这样它会获取您单击的每个锚点的 #-Part 并滚动到具有相同 ID 的元素。

一些细节:

target.split('#')[1]

这部分取之前保存在目标中的href字符串,并在'#'处将其分成两部分。第一个锚的第一部分是“da”,第二部分是“测试”。您想要“测试”,因此您可以使用 [1] (它是一个数组)访问它。

现在剩下要做的就是在它前面放一个“#”并将其用作选择器:

target = $('#' + target.split('#')[1]);

$('#test') 现在是您要滚动到的目标。

【讨论】:

  • 嘿,谢谢你的解释。有一个大问题:脚本破坏了我的导航。我的导航栏有 5 个页面的链接,悬停时它们会显示下拉菜单,其中包括像 &lt;a href="/sample-page/#test"&gt; 这样的链接。如果我在该页面上,则滚动有效,但如果我想转到另一个页面,则顶级链接不起作用...
  • 好的,我改变了链接类,实际上我的html结构是&lt;ul class="sub-menu"&gt;&lt;li&gt;&lt;a ...&gt;所以我把你的$('.link')改为$('.sub-menu a')。我的导航再次起作用,但如果我不在该示例页面上,我将无法打开任何 &lt;a href="/sample-page/#test"&gt;links
  • 好的,我又指定了链接类:如果您在 SAMPLE-PAGE 上,则平滑滚动可以正常工作,导航栏的其余部分也是如此。如果您不在 SAMPLE-PAGE 上,所有链接都可以使用,但如果您尝试打开 &lt;a href="/sample-page/#test"&gt;,您只能到达 SAMPLE-PAGE 的顶部。理想的行为是:如果您不在指定页面上,则直接跳转到锚点。如果您已经在该页面上,请平滑滚动到锚点...您知道如何检测吗?
  • 好吧,event.preventDefault 防止锚元素重定向。您可以在函数内放置一个 if 语句。就像当前 url 包含您的示例页面一样,将函数的所有代码放入(包括阻止默认值),否则您可以执行类似 return true 的操作 - 因为没有阻止默认值,它只会跟随锚链接并重定向到该站点你想
  • 可以在此处找到如何检测部分 url 的示例:stackoverflow.com/questions/21718282/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2013-07-17
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多