【问题标题】:jQuery script smooth scroll to different sections with a different offsetjQuery 脚本平滑滚动到具有不同偏移量的不同部分
【发布时间】:2012-08-09 09:23:32
【问题描述】:

我正在为我的单页网站使用平滑滚动脚本。它滚动到每个锚点。

由于设计原因,我无法让锚点直接卡到页面顶部。我不得不创建隐藏在页面上方的锚点,这样它就不会完全贴合到顶部。

这是我目前使用的脚本:

jQuery(document).ready(function($) {
    $(".scroll").click(function(event){ 
        event.preventDefault();
        $('html,body').animate({
            scrollTop: $('[name="' + this.hash.substring(1) + '"]').offset().top
        }, 500);
    });
});

我被告知我可以在这个脚本中进行偏移。与其到处都有这些隐藏的小锚点,我可以简单地在顶部的末尾添加一些东西以将其偏移一定数量的像素。它将是最高的 - 250

$('html,body').animate({
    scrollTop:$('[name="' + this.hash.substring(1) + '"]').offset().top - 250
}, 500);

问题是这会使偏移量始终为 250px,我需要它是可变的,例如,投资组合 div 可以用 200px 的偏移量锚定,但联系人 div 只能固定 50px。

谁能帮我在脚本中编写某种选择器,让我可以根据锚定的 div 调整顶部 - [变量]?

【问题讨论】:

  • 你试过你的sn-p代码了吗?当您获取锚点的偏移量并从动态值中减去 250 时,它应该可以工作。可以肯定的是,请尝试用括号括住您的计算。
  • 你能在jsfiddle.net上提供一些简单的测试代码吗?不知道你的div#contactdiv#portfolio 在哪里。
  • 嗨,是的,我试过了。它可以工作,但它始终位于 div 上方 250 像素处,这不是我想要的。

标签: jquery scroll target


【解决方案1】:

您并没有真正说明确定命名锚的 top 值的偏移量的规则。

因此,也许最简单的方法是引入一个属性,您可以使用该属性来调整命名锚点或您希望滚动到视图中的任何元素的偏移量。

例如,这里有一个命名锚点,它有一个名为data-section-offset 的新属性,我想偏移 20px。

<a id="myAnchor" data-section-offset="20">My Section</a>

在您的点击处理程序中,您可以提取动画的属性值。

jQuery(document).ready(function($) {

    $(".scroll").click(function(event) {
        event.preventDefault();        
        var $anchor = $('#' + this.hash.substring(1));
        $('html,body').animate({ 
            scrollTop: $anchor.offset().top - $anchor.attr('data-section-offset')
        }, 500);        
    });
});

这是一个fiddle 以显示更多示例。

注意:JQuery 具有 data 方法,因此可以像这样(如上)拉出属性

$anchor.attr('data-section-offset')

或者像这样

$anchor.data('section-offset')

正如@Ben 指出的HTML5 specification for custom data attributes 非常有用> HTML 5 data- Attributes

【讨论】:

  • 使用&lt;a name= 是老派,很快就会被弃用,取而代之的是使用元素ID。此外,您可以通过 id 直接链接到 div 或其他容器元素,而不是在整个页面中撒上锚点。例如:&lt;div id="linkToMe"&gt;&lt;/div&gt;&lt;a href="#linkToMe"&gt; 您的自定义属性也会破坏页面验证。它会起作用,但也许如果你想使用自定义属性,你至少应该使用新的 HTML5 标准,在它前面加上 data-
  • @BenSwayne 感谢您的评论 - 必须承认我不知道自定义数据属性的 HTML5 规范。
【解决方案2】:

首先,您不需要使用旧的&lt;a name= 约定。查看锚点HTML anchors on w3schools 上的 w3schools 页面。现在的最佳做法是通过 id 链接容器元素。

因此,如果您要链接到包含某些内容的 div,请使用 &lt;div id="linkToMe"&gt;My content in here.&lt;/div&gt;&lt;a href="#linkToMe"&gt;The link text&lt;/a&gt;

这当然会破坏您上面的代码,因为它正在按名称查找元素。您想通过 id 来查找它们(反正更快!)。

在我的网页中,我的顶部有一个工具栏,有时是position: fixed;,所以当我滚动时,我想偏移滚动位置,这样它就不会在页面顶部的工具栏下方。

这就是我的做法:

function goToByScroll(id) {
    //Find toolbar height
    var pageOffset = 0,
        hdr = $('#sub'),
        tb = $('#sitemenu');
    if (hdr.css('position') == 'fixed') { pageOffset += hdr.height() }
    if (tb.css('position') == 'fixed') { pageOffset += tb.height() }

    //Scroll the document
    $('html,body').animate({ scrollTop: $("#" + id).offset().top - pageOffset }, 'slow'); }

然后用 jQuery 连接起来:

$(".jumptoid").click(function (e) {
    e.preventDefault();

    // Track in google analytics if you are using it.
    _gaq.push(['_trackEvent', 'Jump to Id', e.currentTarget.host, this.href, 0]);

    // Scroll to item location using jquery
    goToByScroll(this.href.split('#')[1]);

    // Push History in browser bar so the forward/back button works
    window.location.hash = this.href.split('#')[1];

    return false;
});

如果目标元素的位置是固定的,这将使目标元素的顶部与我的标题/工具栏的底部完美对齐,如果不是,则与浏览器视口的顶部完美对齐。

在您的情况下,您要么想要更改计算偏移量的方式(而不是我的 hdrtb 项目,您可以做一些其他数学运算或查看其他页面元素),或者您可以使用自定义@chris moutray 建议的属性。

如果要使用属性,请使用建议的以data- 开头的html5 标准,以便它通过验证。例如&lt;div id="linkToMe" data-scroll-offset="250"&gt;My content here&lt;/div&gt;,然后使用@chris 的代码来获取该属性,例如$anchor.attr('data-scroll-offset')

【讨论】:

  • 您好,谢谢,我会调查一下,看看它是如何工作的。我无法链接到 div 容器本身的原因纯粹是因为这会将容器放在顶部(当我希望它稍微偏移时)所以如果这可行,我将非常高兴:) 感谢您的时间。跨度>
  • @FrancescaHaselden 让我们知道您的问题是否通过接受答案得到解决,否则如果您需要进一步说明,请考虑添加评论,我很乐意添加更多信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多