jQuery通过向上/向下按钮滚动到下一个元素 - 如何为手动滚动添加处理,否则会混淆这一点
jQuery scroll to next element via up/down buttons - how to add handling for manual scrolling that would otherwise confuse this?
我正在尝试实现两个静态按钮,用于在单个相当深的内容页面上在大约 10 个包含div 标签之间向上或向下导航。
我希望按钮在单击时能够顺利滚动到页面的下一部分(下一个包含div(。
此解决方案的问题在于,如果您使用浏览器滚动条或鼠标滚轮手动上下滚动页面,则代码的逻辑不知道这一点,并且当您下次单击下一步/上一个时,会发生与实际与您看到的可视区域无关的滚动, 完全破坏了用户体验。
您可以在此演示中对此进行测试:http://jsfiddle.net/aVJBY/。 如果您单击"下一步",它就会起作用。现在向下滚动到内容底部附近,然后单击"上一个"。 理论上,页面应该从页面底部后退一步。 相反,它会返回到页面顶部。
也许我只需要废弃这段代码并使用一些外部库,这很好,但我找不到任何合适的东西。 有人知道如何让我的代码解决此问题吗?
到目前为止,我使用的代码在这里:
$('div.section').first();
$('a.display').on('click', function(e) {
e.preventDefault();
var t = $(this).text(),
that = $(this);
if (t === 'next' && $('.current').next('div.section').length > 0) {
var $next = $('.current').next('.section');
var top = $next.offset().top;
$('.current').removeClass('current');
$('body').animate({
scrollTop: top
}, function () {
$next.addClass('current');
});
} else if (t === 'prev' && $('.current').prev('div.section').length > 0) {
var $prev = $('.current').prev('.section');
var top = $prev.offset().top;
$('.current').removeClass('current');
$('body').animate({
scrollTop: top
}, function () {
$prev.addClass('current');
});
}
});
我用精彩的 jQuery inview 插件解决了这个问题 - https://github.com/protonet/jquery.inview 我所做的事情的概述如下......
我首先设置了一些变量,pageItems 数组包含我需要监控的所有div...
var posNext=0;
var posPrev=0;
var pageItems = ["pageone", "pagetwo", "pagethree", "pagefour", "pagefive"];
然后,我在文档就绪中设置以下内容。 多亏了 inview 插件和 jQuery bind 事件,在页面滚动(任何类型的,通过我的按钮、手动或通过鼠标滚轮(上,插件就会运行。 我首先在页面项数组中搜索与 $(this(.attr("id"( 值返回的内容匹配的内容。 然后,我使用基于视图中当前div 的值调整 posNext/posPrev 变量。
$(document).ready(function (){
$(".divclass").bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
if (isInView) {
matchPos = pageItems.indexOf($(this).attr("id"));
// Determine prev/next positions now we have an index. The position values used in click events later
if ( (matchPos+1)==pageItems.length ){
posNext=matchPos;
posPrev=matchPos-1;
}else if (matchPos==0){
posNext=matchPos+1;
posPrev=0;
}else{
posNext=matchPos+1;
posPrev=matchPos-1;
}
} else {
// dont update index
}
});
});
最后,在document.ready中,我绑定了我始终在屏幕上的按钮上的点击。它们使用 jQuery animate 调用滚动到通过 posNext/posPrev 中的数组索引值指定的div id 值。
$(".down-button").click(function(e){
event.preventDefault();
$('html, body').stop().animate({
scrollTop: $("#"+pageItems[posNext]).offset().top
}, 500);
});
$(".up-button").click(function(e){
event.preventDefault();
$('html, body').stop().animate({
scrollTop: $("#"+pageItems[posPrev]).offset().top
}, 500);
});
- Java Selenium 2.0-在WebElement.click()之前使用内置滚动时处理z索引(navi)
- JavaScript 事件处理具有延迟的滚动事件
- 如何处理 Backbone .js应用程序中哈希更改的滚动位置
- JavaScript:当用户滚动时对滚动进行动画处理
- jQuery:如果其他滚动函数,则进行动画处理
- 处理 js - 关卡滚动
- 处理窗口外焦点的 Javascript 滚动条
- jQuery通过向上/向下按钮滚动到下一个元素 - 如何为手动滚动添加处理,否则会混淆这一点
- Famo.us:如何以编程方式对滚动视图的位置进行动画处理
- JQuery- 如何使用 ALS 滚动脚本处理图像
- 为什么在用户滚动后,设置超时不会在触摸端处理程序中触发(iOS Safari)
- 绑定此鼠标滚轮事件处理程序将禁用垂直滚动
- 使用jQuery.off或.unbind删除和添加滚动事件处理程序
- 滚动无法处理动态添加到jQuery移动列表的项目
- 如何在无限滚动中处理javascript的执行
- 将多个事件处理程序绑定到滚动事件是否会影响性能
- 在ZK中处理鼠标滚动
- PhoneGap如何处理滚动
- Javascript滚动处理
- Javascript滚动处理程序未触发