jQuery:在调用URL时滚动到锚点,替换浏览器行为

时间:2009-12-14 21:19:04

标签: jquery scroll anchor smooth

我已经知道了jQuery插件ScrollTo,但到目前为止我还没有找到任何方法来实现以下内容:

用户访问我的网站(通过输入,而不是点击我页面上的链接)domain.com/bla.php#foo

并且锚“#foo”存在。现在我希望用户的浏览器不会自动滚动到“#foo”,而是我想要平滑滚动,以便元素'#foo'位于视图的中间而不是在绝对的顶部位置用户查看。

到目前为止感谢!

9 个答案:

答案 0 :(得分:22)

如果您不创建实际的锚点foo,而是创建一个ID为_foo的锚点(类似<a id="_foo">)。您可以处理$(document).ready来实现此目的。

像(伪代码)

之类的东西
$(document).ready(function() { 
    var elem = $('#_' + window.location.hash.replace('#', ''));
    if(elem) {
         $.scrollTo(elem.left, elem.top);
    }
});

答案 1 :(得分:6)

我对Jan Jongboom的脚本做了一些改进,现在它看起来像这样:

$(document).ready(function () {
    // replace # with #_ in all links containing #
    $('a[href*=#]').each(function () {
        $(this).attr('href', $(this).attr('href').replace('#', '#_'));
    });

    // scrollTo if #_ found
    hashname = window.location.hash.replace('#_', '');
    // find element to scroll to (<a name=""> or anything with particular id)
    elem = $('a[name="' + hashname + '"],#' + hashname);

    if(elem) {
         $(document).scrollTo(elem, 800);
    }

});

它会更改链接中的所有锚点,因此对于没有javascript的用户,行为将保持不变。

答案 2 :(得分:1)

Machineghost的回答非常有帮助。我一起修补的代码采用了一个URL参数,并将其转换为一个哈希标记,浏览器会在DOM准备好后立即滚动到该标记。

网址如下所示:

www.mysite.com/hello/world.htm?page=contact

联系人是您要滚动到的ID的名称

<h1 id="contact">Contact Us</h1>

以下是代码:

// Get any params from the URL
$.extend({
  getUrlVars: function(){
    var vars = [], hash;
    var url = decodeURIComponent(window.location.href);
    var hashes = url.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      vars.push(hash[0]);
      vars[hash[0]] = hash[1];
    }
    return vars;
  },
  getUrlVar: function(name){
    return $.getUrlVars()[name];
 }
});

$(document).ready(function() {
    // Unhide the main content area
    $('section.centered').fadeIn('slow');

    // Create a var out of the URL param that we can scroll to
    var page = $.getUrlVar('page');
    var scrollElement = '#' + page;

    // Scroll down to the newly specified anchor point
    var destination = $(scrollElement).offset().top;
    $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination-75}, 800 );
    return false;
});

我在Chrome和FF中检查过它,效果非常好。如果滚动目标没有到达您想要的确切位置,请尝试调整“destination-75”。

我无法完成上述帖子,谢谢!

答案 3 :(得分:1)

/* scrolling to element */
    var headerHeight = $('#header').height() + $('#header-bottom-cap').height() + 10; //When the header position is fixed
    $('a').click(function(){
        var hashEle = $(this).attr('href').split('#');
        if (hashEle.length > 1) {
            if (hashEle[1] == 'top') {
                $('body, html').animate({
                    scrollTop: 0
                },500);
            } else {
            jQuery('body, html').animate({
                scrollTop: $('#'+ hashEle[1]).offset().top - headerHeight
            },500);
            }
        };
    })
        // find element from url
hashname = window.location.hash.replace('#', '');
elem = $('#' + hashname);
if(hashname.length > 1) {
    if(hashname == 'top') {
    $('body, html').animate({
            scrollTop: 0
        },200); 
    } else {
     $('body, html').animate({
            scrollTop: $(elem).offset().top - headerHeight
        },500);
 }
};
/* END scrolling to element */

这个脚本应该是$(document).ready(function(){});

答案 4 :(得分:0)

您仍然可以使用ScrollTo。您可能希望在其中没有锚点的情况下呈现页面,然后使用在加载页面时运行的JavaScript以从URL获取锚点。然后,您可以使用该文本滚动到特定ID。

不确定如何将项目放在页面中间,但您可以为滚动指定偏移量。

答案 5 :(得分:0)

我不想说这是不可能的,但......它至少会非常具有挑战性。浏览器(或至少我知道的所有浏览器)在页面的一部分加载时立即滚动到锚点; AFAIK没有基于Javascript的方法来避免这种情况(你需要一个浏览器插件或其他东西)。

但是,我认为您可以使用“在页面完全加载之前不显示页面”的变体来获取您想要的行为。换句话说,你会:

  1. 隐藏所有页面的内容(例如,有一个包装整个页面的DIV,并在其上放置“display:none”样式)

  2. 将“onLoad”事件处理程序附加到取消隐藏DIV的页面,然后......

  3. 在同一个“onLoad”事件处理程序中,使用标准的JS滚动机制(ie.ScrollTo)滚动到锚点(我想你可以通过检查窗口来确定要滚动到哪个锚点。位置)

  4. 理论上,因为浏览器会在#1和#2之间进行浏览器滚动(因为无处可滚动,内容被隐藏,所有内容,我想它根本不会做任何事情),你在#3中使用的滚动机制不应该有任何干扰。

    话虽如此,以上所有内容都是完全未经测试的计划;你的里程我的变化。即使它确实有效,但实施起来也很痛苦,所以除非你真的想要这种行为,否则几乎肯定不值得这么做。

答案 6 :(得分:0)

尝试使用此代码,仅使用jQuery即可完美地为我工作。

$(document).ready(function() {
    var target = window.location.hash;
    var offset = 85; // You can change this value as per your need.
    if ($(target).length > 0) {
        $('html, body').animate({
            scrollTop: $(target).offset().top - offset
        }, 1000);
    } else {
        console.warn('Element ' + target + ' does not exist');
    }
});

答案 7 :(得分:0)

if(window.location.hash) {
  var hash = window.location.hash;

  $('html, body').animate({
    scrollTop: $(hash).offset().top
  }, 1500, 'swing');
}

这对我来说很好。

答案 8 :(得分:-1)

那是不可能的

修改

行为完全掌握在UA手中。