【问题标题】:jQuery animated scroll to anchor not working?jQuery 动画滚动到锚点不起作用?
【发布时间】:2015-02-07 08:07:06
【问题描述】:

我以为我已经解决了这个问题,但事实证明我没有。基本上构建一个 tumblr 主题,我的代码中的某些内容与 jquery 动画滚动到顶部相冲突。我试过删除一些东西,因为我不完全确定它可能是什么,并且认为它对其他人来说可能真的很明显?

这是一个指向我的主题 http://minori-theme.tumblr.com/ 的链接和一个我正在关注的 jsfiddle,以便为平滑滚动设置动画 http://jsfiddle.net/YtJcL/1008/

我正在使用的代码如下,我只是使用标准的链接和 id,它们链接正常,因为它到达了正确的点,只是滚动不流畅。

$(document).ready(function() {
var hashTagActive = "";
$(".scroll").click(function (event) {
    if(hashTagActive != this.hash) { //this will prevent if the user click several times the same link to freeze the scroll.
        event.preventDefault();
        //calculate destination place
        var dest = 0;
        if ($(this.hash).offset().top > $(document).height() - $(window).height()) {
            dest = $(document).height() - $(window).height();
        } else {
            dest = $(this.hash).offset().top;
        }
        //go to destination
        $('html,body').animate({
            scrollTop: dest
        }, 2000, 'swing');
        hashTagActive = this.hash;
    }
});
});

编辑:如果有人有更简单的选择,我愿意接受建议吗?

【问题讨论】:

  • 你真的需要你的条件if ($(this.hash).offset().top >吗?如果您只使用元素的 .offset().top 作为目标点,则 ScrollTop 可以正常工作
  • 我没有得到您的问题,因为您的代码运行方式与您提供的链接类似,只是您将 timeInterval 设置为 2000 毫秒。滚动在两者中都很流畅 ..?
  • 如果您唯一的问题是它不流畅,您可能正在寻找一个 jQuery UI 缓动:jqueryui.com/easing - 您想要哪一个? (单击它们并查看它们是如何工作的)...您需要包含 jQuery UI 才能使它们工作...
  • 在小提琴中它工作正常,在我的主题中,链接在跳到顶部时工作,但没有动画发生。对不起,我不擅长 jQuery。我相信唯一的问题是它没有滚动,但我不明白为什么?
  • 我将如何使用 jquery easing - 任何教程或示例,非常感谢!

标签: javascript jquery html css animation


【解决方案1】:

如果您不添加easing libary,您的animate 函数上的缓动效果将不起作用。 jQuery 核心没有缓动功能。

<script type="text/javascript" src="http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.compatibility.js"></s‌​cript>

您还可以根据元素的偏移顶部值定义动画时间的动态值。这将使您的动画根据当前值更加流畅。

Here is jsFiddle with smooth scrolling effect.

 $(".scroll").click(function(event){
         event.preventDefault();

         var dest = 0;
         var $target = $(this.hash);
         var targetTop = $target.offset().top;
         var remainTop = $(document).height() - $(window).height();

         if( targetTop > remainTop){
              dest = remainTop;
         }else{
              dest = targetTop;
         }

         // Dynamic value for timing
         var dur = dest*1.2;

         $('html,body').animate({scrollTop:dest}, dur,'easeInOutCubic');

});

最后一点,你应该使用变量来组织你的代码,你的这些编码很难阅读和维护。

【讨论】:

  • 您好,感谢您的回复,这似乎没有在现场工作或在小提琴中工作,并且还破坏了锚链接。
  • @user2498890 如果你想使用缓动效果,你需要添加这个脚本:&lt;script type="text/javascript" src="http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.compatibility.js"&gt;&lt;/script&gt;
  • 谢谢,但我也试过了,但没有运气。有什么想法吗?
  • 如您所见,它在小提琴上运行良好。如果它不适用于您的模板,我们可以检测到关于 tumblr 的其他内容。 jsfiddle.net/YtJcL/1017
  • 它在 jsfiddle 中不起作用,因为它显示一条消息说请停止热链接我的缓动脚本?
【解决方案2】:

卷轴第一次起作用,但之后的任何时候都不起作用。检查所有习惯于查看是否保留某些内容的 var。

编辑: 线

if(hashTagActive != this.hash)

如果您已经单击“返回顶部”,则不会打扰 jquery 动画,因为 hashTagActive 已经是#top。这就是为什么它工作一次但不是两次的原因。

编辑 2: 查看This fiddle 了解解决方法

【讨论】:

  • 他在滚动目标伙伴方面没有问题。他正在努力使动画更流畅
  • 是的 - 问题是在您第一次单击“返回顶部”后代码不会影响 jquery 动画。这就是它不平滑的原因。
  • 他是她 - 感谢您的回答,我该如何准确编辑,我需要删除该行吗?
  • 您可以在动画调用中放置一个回调函数,以在动画完成后清除 hashTagActive。这意味着您在动画期间禁用它并在完成时将其清除。见上面的编辑 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2013-09-22
  • 2023-03-30
相关资源
最近更新 更多