我正在努力解决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作为滚动效果的目标来实现这一点。
问题在于它很快就会变得太乱。
我不能以某种方式将“下一个对象与类:容器”对齐,然后滚动到那个?
我不确定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>
答案 0 :(得分: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
});
您只需使用$(this)
获取链接对象,.parent()
获取链接的父级,即<div>
,然后使用.next()
获取下一个兄弟(注意它会自动换行,所以最后<div>
之后的兄弟是第一个 <div>!),
。offset()to get its position relative to the page,
。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树上一步。
在找到具有.container
的内容后,会用nextdiv = container.nextAll('.container, :has(.container)').first();
抓取它。
最后,如果找不到任何内容,请nextdiv.length==0
检查,只需抓住整个页面中的第一个.container
。
然后滚动到抓取的.container
。
要为滚动设置动画,请将scrollTop
属性放在animate
函数中:
// $(document).scrollTop(nextdiv.offset().top); // snaps to new scroll position
$('body').animate({scrollTop:nextdiv.offset().top},300); // animates scrolling
答案 1 :(得分:-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>
答案 2 :(得分:-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();
我相信你可以弄清楚下一个按钮应该做什么;)