我正在尝试在网站上进行this scrolleffect工作。当用户向下滚动时,它必须自动转到下一张幻灯片。当用户向上滚动时,它必须向后滑动一次。我在Jquery中使用onScroll
函数尝试了很多东西,但它们似乎都没有用。
我使用以下脚本检查用户是向上还是向下滚动。
var lastScrollTop = 0;
var check = 1;
var scrollDirection = 'down';
var scrollBottom = $(window).scrollTop() + $(window).height();
$(window).scroll(function(event) {
slideHeight = $('.slide').height();
var st = $(this).scrollTop();
if (st > lastScrollTop){
scrollDirection = 'down';
if (check == 1){
$('body').scrollTo( {top:'0px', left:'100%'}, 800 );
check = 0;
}
} else {
scrollDirection = 'up';
}
lastScrollTop = st;
console.log('ScrollDirection: '+ scrollDirection);
});
我不会比这更进一步。进行开发的(测试)网站是:http://bit.ly/RBcffY 如果有人有这种功能的经验,那将非常有帮助。
答案 0 :(得分:10)
即使没有发生滚动,jquery.mousewheel插件也可用于捕获鼠标滚轮(与$.scroll
相反)。通过这种方式,您可以检测移动鼠标滚轮并阻止滚动发生。然后,只需要自己动画滚动即可。
var scrollingScreen = false;
$("body").mousewheel(function(event, delta) {
if ( !scrollingScreen ) {
scrollingScreen = true; // Throttles the call
var top = $("body").scrollTop() || // Chrome places overflow at body
$("html").scrollTop(); // Firefox places it at html
// Finds slide headers above/below the current scroll top
var candidates = $(".slide").filter(function() {
if ( delta < 0 )
return $(this).offset().top > top + 1;
else
return $(this).offset().top < top - 1;
});
// If one of more are found, updates top
if ( candidates.length > 0 ) {
if ( delta < 0 )
top = candidates.first().offset().top;
else if ( delta > 0 )
top = candidates.last().offset().top;
}
// Performs an animated scroll to the right place
$("html,body").animate({ scrollTop:top }, 800, "easeInOutQuint", function() {
scrollingScreen = false; // Releases the throttle
});
}
return false; // Prevents default scrolling
});
jsFiddle的工作示例。这与您显示的引用的行为非常一致,您可以根据需要添加额外的效果 - 通过在animate
之前或在其回调函数中插入代码,分别在滚动之前或之后执行它们。 (观察员:在iframe
中运行的小提琴,由于安全原因,在某些浏览器中无法访问scrollTop
,因此它会全局存储top
变量;但是,代码如图所示答案应该在独立页面中正常工作)
注意:在参考网站和我的示例中,中间点击并移动鼠标随意滚动。你可能想要防止这种情况,你的选择。尽管如此,更新后的示例会滚动到特定点,而不仅仅是添加一些增量,就像您在问题中建议的那样 - $('.slide').height()
。原因是考虑到不同幻灯片具有不同高度的可能性。此外,确切地知道您正在显示哪张幻灯片可以让您正确设置位置的哈希值。
有关详细信息,另请参阅this related question。
答案 1 :(得分:0)
这是我用于滚动DIV的版本。
顺便说一下。最好使用object.stop(),让滚动更改更顺畅。
var vi = $('.box'), vis = $('.box .inbox');
// both events needed for Firefox
vi.on('mousewheel DOMMouseScroll', function(e) {
var eo = e.originalEvent;
var xy = eo.wheelDelta || -eo.detail; //shortest possible code
var isScrollUp = xy /120 > 0;
if (vi.hasClass('scrolling'+(isScrollUp ? '1' : '0'))) return; // no change
var top = vi.scrollTop();
var candidates = vis.filter(function() {
if ( !isScrollUp )
return this.offsetTop > top;
else
return jQuery(this).offset().top < - 1;
});
if (candidates.length > 0) {
if (!isScrollUp)
top = candidates.first()[0].offsetTop;
else
top = candidates.last()[0].offsetTop;
}
vi.addClass('scrolling'+(isScrollUp ? '1' : '0')).stop().animate({ scrollTop:top }, 300, "swing", function() {
vi.removeClass('scrolling1 scrolling0');
});
return false; // no default
});
<!-- begin snippet: js hide: false console: true babel: false -->
BODY{
padding:10px;
}
.box{
height:300px;
overflow:scroll;
position:relative;
}
.inbox{
background:purple;height:300px;font-size:35px;color:#fff;font-weight:bold;
}
.inbox:nth-child(2n){background:lightblue;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="box">
<div class="inbox">1 -- SCROLLIT</div>
<div class="inbox">2</div>
<div class="inbox">3</div>
<div class="inbox">4</div>
<div class="inbox">5</div>
<div class="inbox">6</div>
</div>