滚动到下一个元素。

3

我正在苦恼一个jquery或javascript问题。

它已经让我感到烦躁了,这告诉我我可能在这个问题上想得太复杂了。

所以我的标记(简化)看起来像这样:

<div class="container">
    My Content
<a href="#" class="button">scroll down</a>
</div>


<div class="container">
    My Content
<a href="#" class="button">scroll down</a>
</div>


<div class="container">
    My Content
<a href="#" class="button">scroll down</a>
</div>


<div class="container">
    My Content
<a href="#" class="button">scroll down</a>
</div>

基本上只是一些容器。

每个容器都包含不同的内容和一个按钮。


计划:

1) 点击按钮后,窗口应向下滚动到下一个容器

2) 最后一个按钮滚动到第一个容器。所以我需要一个循环

3) 容器的数量可能因页面而异。

编辑: 4) 容器可能不总是直接兄弟关系(见下面的标记)


问题:

我可以通过为每个容器提供唯一的ID作为滚动效果的目标来使其工作。

问题在于它很快变得太乱了。

我能不能只是以某种方式针对“具有class:container的下一个对象”,并滚动到那里?


我不确定js还是jquery是正确的方法。 我在两者中的知识都有限。

我会非常感激指点方向。


编辑: 容器可能不总是直接兄弟关系。

<div class="row">
        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>


        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>
</div>        

        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>


        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>

<div class="row">
        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>


        <div class="container">
            My Content
        <a href="#" class="button">scroll down</a>
        </div>
</div>  
3个回答

6

简单解决方案:

要获取下一个容器,请尝试使用 next()

基本上,<div> 容器是彼此的兄弟,因此在一个 div 容器上调用 .next() 将会给你下一个容器。

$(".button").on("click", function(e) {
    $(document).scrollTop($(this).parent().next().offset().top);
    // $(this).parent().next() // this is the next div container.
    return false; // prevent anchor
});

http://jsfiddle.net/Pm3cj/1/

你只需使用$(this)获取链接对象,.parent()获取链接的父级元素,即<div>,然后使用.next()获取下一个兄弟元素(请注意,它会自动换行,所以最后一个<div>后面的兄弟元素是第一个<div>!),.offset()获取它相对于页面的位置,.top获取它相对于顶部边框的位置。
然后,您只需使用$(document).scrollTop()滚动到该位置即可。

对于完全通用的解决方案,请使用:

$(".button").on("click", function(e) {
    container = $(this).parent();

    // if I am the last .container in my group...
    while (    document != container[0] // not reached root
            && container.find('~.container, ~:has(.container)').length == 0)
        container = container.parent(); // search siblings of parent instead

    nextdiv = container.nextAll('.container, :has(.container)').first();

    // no next .container found, go back to first container
    if (nextdiv.length==0) nextdiv = $(document).find('.container:first');

    $(document).scrollTop(nextdiv.offset().top);
    // $(this).parent().next() // this is the next div container.
    return false;
});

该代码基本上使用container.find('~.container, ~:has(.container)')来查找任何具有或是.container的兄弟元素。如果没有找到,则向DOM树上移动1步。
在找到任何一个是或者有.container的元素之后,使用nextdiv = container.nextAll('.container, :has(.container)').first();来获取它。
最后,如果没有找到,通过nextdiv.length==0进行检查,只需获取整个页面中的第一个.container
然后滚动到所抓取的任何.container

http://jsfiddle.net/Pm3cj/3/


scrollTop 属性放置在 animate 函数中以实现滚动动画效果:
// $(document).scrollTop(nextdiv.offset().top); // snaps to new scroll position
$('body').animate({scrollTop:nextdiv.offset().top},300); // animates scrolling

http://jsfiddle.net/Pm3cj/4/


嗨,ronalchn,感谢您的回答。有趣的方法。不幸的是,我担心我在这里简化了我的标记,因为容器并不总是直接相邻的。我已经相应地更新了问题。 对于造成的麻烦,我很抱歉,我只是没有意识到这可能会引起问题。非常感谢您的努力! - Arrowcatch
添加了通用解决方案(增加了3个语句)- 它甚至比您添加到解决方案中的结构更通用,它将适用于任何页面结构! - ronalchn
嘿,ronalch, 哇!太棒了,谢谢你的帮助。我明天会实现它,但看起来它工作得很整洁。如果没有滚动动画,它只是有点令人困惑。我考虑使用.animate()来解决这个问题,但我不确定在不破坏你的脚本的情况下应该把它放在哪里。这可能吗?非常令人印象深刻!谢谢! - Arrowcatch
只需修改执行滚动的代码行,并将该属性放入“animate”函数中,如上所示。 - ronalchn
我不记得所有的函数,但我知道可以做什么,以及可能使用哪些函数。所以我只是在我不知道或不记得的东西上进行一些快速搜索。 - ronalchn
显示剩余4条评论

-2

JavaScript 不是必需的。您可以使用 HTML 锚点。

<div class="container" id="first">
    My Content
<a href="#second" class="button">scroll down</a>
</div>


<div class="container" id="second">
    My Content
<a href="#third" class="button">scroll down</a>
</div>


<div class="container" id="third">
    My Content
<a href="#fourth" class="button">scroll down</a>
</div>


<div class="container" id="fourth">
    My Content
<a href="#first" class="button">scroll down</a>
</div>

我可以通过为每个容器分配唯一的ID作为滚动效果的目标来使其工作。但问题在于这样很快就会变得太混乱了。 - Ram

-2

通过使用parent()child(),您可以轻松实现所需的功能。

如果每个页面上容器的数量不同,则应该按顺序开始对容器进行ID标识(不知道这是否是一个术语)。类似于class="container-1"之类的东西。

最后一个按钮上的点击事件应该执行以下操作:

var num = $('div[class^="container-"]').filter(function() {
    return((" " + this.className + " ").match(/\scontainer-\d+\s/) != null);
});
num++;
var last_container = $(this).parent('.container' + num);
last_container .scrollTo();

我相信你可以想出下一个按钮应该做什么 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接