Javascript jQuery鼠标滚轮事件与元素动画耦合
场景: 我需要创建一个曲线动画(弧形),由鼠标滚轮触发 所以,我想出了一些代码Javascript jQuery鼠标滚轮事件与元素动画耦合,javascript,jquery,mousewheel,Javascript,Jquery,Mousewheel,场景: 我需要创建一个曲线动画(弧形),由鼠标滚轮触发 所以,我想出了一些代码 var arc = { center: [-200, ($(window).height() - 24) / 2], // height + padding radius: 450, start: 0, end: 90, dir: 1 } $('.point').each(function () { $(this).data('lastEnd', arc.e
var arc = {
center: [-200, ($(window).height() - 24) / 2],
// height + padding
radius: 450,
start: 0,
end: 90,
dir: 1
}
$('.point').each(function () {
$(this).data('lastEnd', arc.end).animate({
path: new $.path.arc(arc)
}, 0);
arc.start -= 10;
arc.end -= 8;
});
$('body').mousewheel(function (e, delta, deltaX, deltaY) {
e.preventDefault();
var delta = delta * -1;
$('.point').each(function () {
var $this = $(this);
var startPoint = $this.data('lastEnd');
var arc = {
center: [-200, ($(window).height() - 24) / 2],
radius: 450,
start: startPoint,
end: (delta * 8) + startPoint,
dir: delta > 0 ? 1 : -1
}
$this.data('lastEnd', arc.end);
$(this).animate({
path: new $.path.arc(arc)
}, 500);
});
});
我正在使用曲线动画,和
触发鼠标滚轮上的事件
问题:
鼠标滚轮只是给我鼠标滚轮的方向,但不是速度。所以,如果用户滚动得更快,而不是给出增加的delta
,它会多次触发鼠标滚轮事件。
它本来可以在简单的情况下工作,但我正在制作点的动画。因此,在动画完成之前,会触发多个鼠标滚轮事件。(您可以通过加快滚动速度查看)
我的尝试:
iscrowling
,限制了多个鼠标滚轮事件,如果iscrowling
为true,则限制滚动。但是,这并不能给我平滑的动画效果。在动画完成之前,mousescroll不会执行任何操作setTimeout
来保持滚动几毫秒,并对在这段时间内触发的所有增量求和,但它也不平滑stop()
。但是stop()
在中途停止动画,我希望在标记位置至少有一个点(不在其上方/下方)var arc = {
center: [-200, ($(window).height() - 24) / 2],
// height + padding
radius: 450,
start: 0,
end: 90,
dir: 1
}
$('.point').each(function () {
$(this).data('lastEnd', arc.end).animate({
path: new $.path.arc(arc)
}, 0);
arc.start -= 10;
arc.end -= 8;
});
$('body').mousewheel(function (e, delta, deltaX, deltaY) {
e.preventDefault();
var delta = delta * -1;
$('.point').each(function () {
var $this = $(this);
var startPoint = $this.data('lastEnd');
var arc = {
center: [-200, ($(window).height() - 24) / 2],
radius: 450,
start: startPoint,
end: (delta * 8) + startPoint,
dir: delta > 0 ? 1 : -1
}
$this.data('lastEnd', arc.end);
$(this).animate({
path: new $.path.arc(arc)
}, 500);
});
});
现在,在开始动画之前,我使用
setTimeout
对delta
进行总结,然后使用相对持续时间在较大的delta中动画速度更快,在较小的delta中动画速度较慢。我将使用$.path.arc
中的css
-方法,并将其返回的css
-对象传递到$.fn.animate
。要立即获取实际的css
-对象,请使用鼠标滚轮-delta
对其进行迭代:
var path = new $.path.arc(arc);
$this.stop().animate(path.css(delta-1), 500);
要使其更平滑,应使用缓和功能:
$.easing.easeOutQuad = function (x, t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
};
...
var path = new $.path.arc(arc);
$this.stop().animate(path.css(delta-1), 500, 'easeOutQuad');
thx,用于将我指向
path.css
。但是你能看到快速滚动会破坏角度吗?它不再在那个曲线上移动了好吧,等你有时间的时候试试看。同时我会尽力的。我又找到了一种方法。如前所述,我使用setTimeout,然后根据delta动态更改animate
的持续时间,我得到了一个非常平滑的动画。顺便说一句,对于您的effort@Jashwant你能分享一下setTimeout
-小提琴吗?:)奇怪的是,JSFIDLE不允许我更新代码。返回此错误端口:无法建立连接。接收端不存在代码>。我会在以后再试,好的,在你们的方法中发现了问题。当插件改变左侧
,顶部
时,角度会改变,但也会改变转换
。我从插件中删除了转换,它可以稍微工作(当我滚动得更快时会出现波动)。我需要知道,为什么在css()
函数中传递delta-1
。可能是这造成了问题