Skip to content

Commit 0221f17

Browse files
committed
FIX for #88: Address decay issues, passing animation back to 'pointerOffTarget' when mouse moves back away from target.
1 parent 36f695c commit 0221f17

File tree

1 file changed

+41
-31
lines changed

1 file changed

+41
-31
lines changed

js/jquery.parallax.js

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@
346346
return css;
347347
}
348348

349-
function pointerOffTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn) {
349+
function pointerOffTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn, portElem) {
350350
var pointer, x;
351351

352352
if ((!parallax[0] || Math.abs(targetPointer[0] - prevPointer[0]) < threshold[0]) &&
@@ -369,13 +369,14 @@
369369
return updateFn(pointer);
370370
}
371371

372-
function pointerOnTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn) {
372+
function pointerOnTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn, portElem) {
373373
// Don't bother updating if the pointer hasn't changed.
374374
if (targetPointer[0] === prevPointer[0] && targetPointer[1] === prevPointer[1]) {
375375
return;
376376
}
377-
378-
return updateFn(targetPointer);
377+
378+
// Pass the responsibility for updating back to "pointerOffTarget" now that we're off the target again.
379+
portElem.trigger('parallax.setPointerFn', [pointerOffTarget]);
379380
}
380381

381382
function unport(elem, events, winEvents) {
@@ -422,32 +423,38 @@
422423

423424
return this.each(function(i) {
424425
var node = this,
425-
elem = jQuery(this),
426-
opts = args[i + 1] ? jQuery.extend({}, options, args[i + 1]) : options,
427-
decay = opts.decay,
428-
size = layerSize(elem, opts.width, opts.height),
429-
origin = layerOrigin(opts.xorigin, opts.yorigin),
430-
px = layerPx(opts.xparallax, opts.yparallax),
431-
parallax = layerParallax(opts.xparallax, opts.yparallax, px),
432-
offset = layerOffset(parallax, px, origin, size),
433-
position = layerPosition(px, origin),
434-
pointer = layerPointer(elem, parallax, px, offset, size),
435-
pointerFn = pointerOffTarget,
436-
targetFn = targetInside,
437-
events = {
438-
'mouseenter.parallax': function mouseenter(e) {
439-
pointerFn = pointerOffTarget;
440-
targetFn = targetInside;
441-
timer.add(frame);
442-
timer.start();
443-
},
444-
'mouseleave.parallax': function mouseleave(e) {
445-
// Make the layer come to rest at it's limit with inertia
446-
pointerFn = pointerOffTarget;
447-
// Stop the timer when the the pointer hits target
448-
targetFn = targetOutside;
449-
}
450-
};
426+
elem = jQuery(this),
427+
opts = args[i + 1] ? jQuery.extend({}, options, args[i + 1]) : options,
428+
decay = opts.decay,
429+
size = layerSize(elem, opts.width, opts.height),
430+
origin = layerOrigin(opts.xorigin, opts.yorigin),
431+
px = layerPx(opts.xparallax, opts.yparallax),
432+
parallax = layerParallax(opts.xparallax, opts.yparallax, px),
433+
offset = layerOffset(parallax, px, origin, size),
434+
position = layerPosition(px, origin),
435+
pointer = layerPointer(elem, parallax, px, offset, size),
436+
pointerFn = pointerOffTarget,
437+
targetFn = targetInside,
438+
events = {
439+
'mouseenter.parallax': function mouseenter(e) {
440+
pointerFn = pointerOffTarget;
441+
targetFn = targetInside;
442+
timer.add(frame);
443+
timer.start();
444+
},
445+
446+
'mouseleave.parallax': function mouseleave(e) {
447+
// Make the layer come to rest at it's limit with inertia
448+
pointerFn = pointerOffTarget;
449+
// Stop the timer when the the pointer hits target
450+
targetFn = targetOutside;
451+
},
452+
453+
// TODO: Needed to set this up as an event listener due to scope issues.
454+
'parallax.setPointerFn': function setPointerFn(e, newPointerFn) {
455+
pointerFn = newPointerFn;
456+
}
457+
};
451458

452459
function updateCss(newPointer) {
453460
var css = layerCss(parallax, px, offset, size, position, newPointer);
@@ -456,7 +463,10 @@
456463
}
457464

458465
function frame() {
459-
pointerFn(port.pointer, pointer, port.threshold, decay, parallax, targetFn, updateCss);
466+
// TODO: Might make sense to eventually refactor calls to pointerFN to simply pass the port instance.
467+
// TODO: Also to have the entire initialization to be based on a jQuery set of just the port [port] and
468+
// TODO: pass the layers as an option instead of the other way around, i.e. [layer, layer, ...]
469+
pointerFn(port.pointer, pointer, port.threshold, decay, parallax, targetFn, updateCss, elem);
460470
}
461471

462472
function targetInside() {

0 commit comments

Comments
 (0)