平滑滚动到div id jQuery


248

我一直在尝试滚动到div id jquery代码以正常工作。基于另一个堆栈溢出问题,我尝试了以下操作

演示http://jsfiddle.net/kevinPHPkevin/8tLdq/

$('#myButton').click(function() {
   $.scrollTo($('#myDiv'), 1000);
});

但这没有用。它只是捕捉到div。我也试过

$('#myButton').click(function(event) {
     event.preventDefault();
   $.scrollTo($('#myDiv'), 1000);
});

没有进展。



@TheVanillaThrilla我这样做了,但是对于单个链接使用来说似乎太过膨胀了
StevenPHP 2013年

1
@StevenPHP,我已经按照我的答案stackoverflow.com/a/26129950/947687替换了示例中的JavaScript代码。它可以工作jsfiddle.net/8tLdq/643
dizel3d 2014年

OP很旧,但是我将与SE的其他人分享这个帖子。下面是一篇文章,分享一个简单的功能解决问题:smartik.ws/2015/01/...
安德鲁·苏尔

Answers:


667

您需要设置动画 html, body

演示http://jsfiddle.net/kevinPHPkevin/8tLdq/1/

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#myDiv").offset().top
    }, 2000);
});

9
@vector我有一个问题,一旦单击它,我就必须使用jquery向上滚动,有解决方案吗?
YesItsMe 2015年

@yesitsme ...就我而言是向上还是向下
Gray Spectrum

@GraySpectrum向上,仅在单击后,听起来好像有延迟。
YesItsMe 2016年

1
我有一个相同的问题,如果我有几个需要滚动到不同位置的按钮,该如何尝试修改此代码但不起作用呢?您能再举一个例子吗?
Dreadlord '16

找到了一些“修复”。现在已经固定了适当元素的滚动,但是仍然可以通过单击相同的“ scroll-to”目标来上下滚动:var target = $(this).data("target"); $(".basics-content").animate({scrollTop: $(target).offset().top}, 1000); });说明:.basics-content是我实际要滚动到的模态的内部div,target我提供了ID号元素...
Roland

111

如果您想覆盖页面上的标准href-id导航而不更改HTML标记以进行平滑滚动,请使用以下示例示例):

// handle links with @href started with '#' only
$(document).on('click', 'a[href^="#"]', function(e) {
    // target element id
    var id = $(this).attr('href');

    // target element
    var $id = $(id);
    if ($id.length === 0) {
        return;
    }

    // prevent standard hash navigation (avoid blinking in IE)
    e.preventDefault();

    // top position relative to the document
    var pos = $id.offset().top;

    // animated top scrolling
    $('body, html').animate({scrollTop: pos});
});

3
这种运作良好,我可以提出一个非常小的调整var pos = $(id).offset().top;可能是var pos = $id.offset().top;
戴维

非常好。如果只希望在某些链接上发生这种情况(例如,您有一些要显示或隐藏的信息),则只需向它们添加一个类名,然后将您的类名(例如滚动条)添加到比赛声明的末尾(例如a [href ^ =“#”]。scroller)。
私有者

没有jQuery怎么办?
Vadorequest'5

21

这是我的2美分:

Javascript:

$('.scroll').click(function() {
    $('body').animate({
        scrollTop: eval($('#' + $(this).attr('target')).offset().top - 70)
    }, 1000);
});

HTML:

<a class="scroll" target="contact">Contact</a>

和目标:

<h2 id="contact">Contact</h2>

仅当您不声明doctype时,此方法才起作用。
David Martins

6
eval这里有什么用?
Seer 2016年

我认为这是必需的$('html, body').animate,以滚动
伊尔沙德汗

6

这是我使用的:

<!-- jquery smooth scroll to id's -->   
<script>
$(function() {
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        $('html,body').animate({
          scrollTop: target.offset().top
        }, 500);
        return false;
      }
    }
  });
});
</script>

这样做的好处是您可以使用无限数量的哈希链接和相应的ID,而不必为每个哈希脚本执行新的脚本。

如果您使用的是WordPress,请将代码插入到主题footer.php文件中,紧接在body标记之前</body>

如果您无权访问主题文件,则可以将代码嵌入到帖子/页面编辑器内部(必须以“文本”模式编辑帖子),也可以嵌入将在所有页面上加载的“文本”小部件中。

如果您使用的是其他任何CMS或仅使用HTML,则可以将代码插入到在body标记之前紧接在所有页面上加载的部分中</body>

如果您需要更多详细信息,请在此处查看我的快速文章:jQuery平滑滚动到id

希望对您有所帮助,如果您对此有疑问,请告诉我。


喜欢这是多么简单和完美。
DoPeT

5

再举一个例子:

HTML链接:

<a href="#featured" class="scrollTo">Learn More</a>

JS:

  $(".scrollTo").on('click', function(e) {
     e.preventDefault();
     var target = $(this).attr('href');
     $('html, body').animate({
       scrollTop: ($(target).offset().top)
     }, 2000);
  });

HTML锚点:

  <div id="featured">My content here</div>

3

您确定要加载jQuery scrollTo插件文件吗?

您可能正在获取对象:控制台中找不到方法“ scrollTo”错误。

scrollTO方法不是本机jquery方法。要使用它,您需要包括jquery滚动到插件文件。

参考:http : //flesler.blogspot.in/2009/05/jqueryscrollto-142-released.html http://flesler.blogspot.in/2007/10/jqueryscrollto.html

soln:将此添加到头部。

<script src="\\path\to\the\jquery.scrollTo.js file"></script>

这应该是公认的答案。问题中的代码是正确的,并且工作正常。似乎scrollTo插件不起作用/不起作用。。他没有询问做类似事情的不同方法。
克里斯·卡瓦纳

3

该脚本是Vector脚本的改进。我对此做了一些改动。因此,此脚本适用于其中具有页面滚动类的每个链接。

起初不放松:

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000);
});

为了放松,您将需要Jquery UI:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

将此添加到脚本中:

'easeOutExpo'

最后

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000, 'easeOutExpo');
});

您可以在这里找到所有的缓动:备忘单


3

此代码对于网络上的任何内部链接都非常有用

    $("[href^='#']").click(function() {
        id=$(this).attr("href")
        $('html, body').animate({
            scrollTop: $(id).offset().top
        }, 2000);
    });

1

您可以使用以下简单的jQuery代码来实现。

教程,演示和源代码可在此处找到- 使用jQuery平滑滚动至div

JavaScript:

$(function() {
    $('a[href*=#]:not([href=#])').click(function() {
        var target = $(this.hash);
        target = target.length ? target : $('[name=' + this.hash.substr(1) +']');
        if (target.length) {
            $('html,body').animate({
              scrollTop: target.offset().top
            }, 1000);
            return false;
        }
    });
});

HTML:

<a href="#section1">Go Section 1</a>
<div id="section1">
    <!-- Content goes here -->
</div>

1

在这里,我尝试了这项工作,对我来说非常有用。

$('a[href*="#"]').on('click', function (e) {
    e.preventDefault();

    $('html, body').animate({
        scrollTop: $($(this).attr('href')).offset().top
    }, 500, 'linear');
});

HTML:

 <a href="#fast-food" class="active" data-toggle="tab" >FAST FOOD</a>

<div id="fast-food">
<p> Scroll Here... </p>
  </div>

您的答案有什么不同?
yunandtidus



0

这对我有用。

<div id="demo">
        <h2>Demo</h2>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>
    $(document).ready(function () {
        // Handler for .ready() called.
        $('html, body').animate({
            scrollTop: $('#demo').offset().top
        }, 'slow');
    });
</script>

谢谢。


0

这是我的解决方案,如果您有固定的标头,则可以使用jQuery平滑滚动至div / anchor,以便它不会在其下方滚动。如果您从其他页面链接它也可以。

只需将“ .site-header”替换为包含标题的div。

$(function() {

$('a[href*="#"]:not([href="#"])').click(function() {
var headerheight = $(".site-header").outerHeight();
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
  var target = $(this.hash);
  target = target.length ? target : $('[name=' + this.hash.slice(1) +']');

  if (target.length) {
    $('html, body').animate({
      scrollTop: (target.offset().top - headerheight)
    }, 1000);
    return false;
  }
}
});

//Executed on page load with URL containing an anchor tag.
if($(location.href.split("#")[1])) {
var headerheight = $(".site-header").outerHeight();
  var target = $('#'+location.href.split("#")[1]);
  if (target.length) {
    $('html,body').animate({
      scrollTop: target.offset().top - headerheight
    }, 1);
    return false;
  }
}
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.