|
346 | 346 | return css; |
347 | 347 | } |
348 | 348 |
|
349 | | - function pointerOffTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn) { |
| 349 | + function pointerOffTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn, portElem) { |
350 | 350 | var pointer, x; |
351 | 351 |
|
352 | 352 | if ((!parallax[0] || Math.abs(targetPointer[0] - prevPointer[0]) < threshold[0]) && |
|
369 | 369 | return updateFn(pointer); |
370 | 370 | } |
371 | 371 |
|
372 | | - function pointerOnTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn) { |
| 372 | + function pointerOnTarget(targetPointer, prevPointer, threshold, decay, parallax, targetFn, updateFn, portElem) { |
373 | 373 | // Don't bother updating if the pointer hasn't changed. |
374 | 374 | if (targetPointer[0] === prevPointer[0] && targetPointer[1] === prevPointer[1]) { |
375 | 375 | return; |
376 | 376 | } |
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]); |
379 | 380 | } |
380 | 381 |
|
381 | 382 | function unport(elem, events, winEvents) { |
|
422 | 423 |
|
423 | 424 | return this.each(function(i) { |
424 | 425 | 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 | + }; |
451 | 458 |
|
452 | 459 | function updateCss(newPointer) { |
453 | 460 | var css = layerCss(parallax, px, offset, size, position, newPointer); |
|
456 | 463 | } |
457 | 464 |
|
458 | 465 | 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); |
460 | 470 | } |
461 | 471 |
|
462 | 472 | function targetInside() { |
|
0 commit comments