parallax-controller
Advanced tools
Comparing version 1.1.0 to 1.1.1
@@ -5,3 +5,3 @@ import { Rect } from '../classes/Rect'; | ||
import { Scroll } from '../classes/Scroll'; | ||
import { ParallaxStartEndEffects } from '../types'; | ||
export declare function createLimitsWithTranslationsForRelativeElements(rect: Rect, view: View, effects: ParallaxStartEndEffects, scroll: Scroll, shouldStartAnimationInitialInView?: boolean): Limits; | ||
import { ParallaxStartEndEffects, ValidScrollAxis } from '../types'; | ||
export declare function createLimitsWithTranslationsForRelativeElements(rect: Rect, view: View, effects: ParallaxStartEndEffects, scroll: Scroll, scrollAxis: ValidScrollAxis, shouldStartAnimationInitialInView?: boolean): Limits; |
@@ -0,2 +1,3 @@ | ||
import { ValidScrollAxis } from '../types'; | ||
import { ParallaxElementConfig, ParallaxStartEndEffects } from '../types'; | ||
export declare function getShouldScaleTranslateEffects(props: ParallaxElementConfig, effects: ParallaxStartEndEffects): boolean; | ||
export declare function getShouldScaleTranslateEffects(props: ParallaxElementConfig, effects: ParallaxStartEndEffects, scrollAxis: ValidScrollAxis): boolean; |
@@ -187,3 +187,3 @@ 'use strict'; | ||
out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || defaultUnit; // @ts-expect-error | ||
out.unit = str.match(/[\d.\-+]*\s*(.*)/)[1] || defaultUnit; // @ts-expect-error | ||
@@ -502,3 +502,3 @@ var isValidUnit = VALID_UNITS.includes(out.unit); | ||
}; | ||
function createLimitsWithTranslationsForRelativeElements(rect, view, effects, scroll, shouldStartAnimationInitialInView) { | ||
function createLimitsWithTranslationsForRelativeElements(rect, view, effects, scroll, scrollAxis, shouldStartAnimationInitialInView) { | ||
// get start and end accounting for percent effects | ||
@@ -520,14 +520,20 @@ var translateX = effects.translateX || DEFAULT_VALUE; | ||
var endY = rect.bottom; | ||
var endX = rect.right; // let multiplierY = 1; | ||
// if (scrollAxis === ScrollAxis.vertical) { | ||
var endX = rect.right; | ||
var startMultiplierY = 1; | ||
var endMultiplierY = 1; | ||
var startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, view.height + rect.height); | ||
var endMultiplierY = startMultiplierY; // } | ||
// let multiplierX = 1; | ||
// if (scrollAxis === ScrollAxis.horizontal) { | ||
if (scrollAxis === exports.ScrollAxis.vertical) { | ||
startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, view.height + rect.height); | ||
endMultiplierY = startMultiplierY; | ||
} | ||
var startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, view.width + rect.width); | ||
var endMultiplierX = startMultiplierX; // } | ||
// Apply the scale to initial values | ||
var startMultiplierX = 1; | ||
var endMultiplierX = 1; | ||
if (scrollAxis === exports.ScrollAxis.horizontal) { | ||
startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, view.width + rect.width); | ||
endMultiplierX = startMultiplierX; | ||
} // Apply the scale to initial values | ||
if (startTranslateYPx < 0) { | ||
@@ -618,3 +624,3 @@ startY = startY + startTranslateYPx * startMultiplierY; | ||
function getShouldScaleTranslateEffects(props, effects) { | ||
function getShouldScaleTranslateEffects(props, effects, scrollAxis) { | ||
if (props.rootMargin || props.targetElement) { | ||
@@ -624,3 +630,3 @@ return false; | ||
if (!!effects.translateX || !!effects.translateY) { | ||
if (!!effects.translateX && scrollAxis === exports.ScrollAxis.horizontal || !!effects.translateY && scrollAxis === exports.ScrollAxis.vertical) { | ||
return true; | ||
@@ -667,3 +673,3 @@ } | ||
}); | ||
var shouldScaleTranslateEffects = getShouldScaleTranslateEffects(this.props, this.effects); | ||
var shouldScaleTranslateEffects = getShouldScaleTranslateEffects(this.props, this.effects, this.scrollAxis); | ||
@@ -681,3 +687,3 @@ if (typeof this.props.startScroll === 'number' && typeof this.props.endScroll === 'number') { | ||
if (shouldScaleTranslateEffects) { | ||
this.limits = createLimitsWithTranslationsForRelativeElements(this.rect, view, this.effects, scroll, this.props.shouldStartAnimationInitialInView); | ||
this.limits = createLimitsWithTranslationsForRelativeElements(this.rect, view, this.effects, scroll, this.scrollAxis, this.props.shouldStartAnimationInitialInView); | ||
this.scaledEffects = scaleTranslateEffectsForSlowerScroll(this.effects, this.limits); | ||
@@ -810,2 +816,3 @@ } else { | ||
supportsPassiveOption = true; | ||
return true; | ||
} | ||
@@ -812,0 +819,0 @@ }); // @ts-expect-error |
@@ -1,2 +0,2 @@ | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,e,i,s,n,r,a=(t=require("bezier-easing"))&&"object"==typeof t&&"default"in t?t.default:t,o=function(t){this.startX=t.startX,this.startY=t.startY,this.endX=t.endX,this.endY=t.endY,this.totalX=this.endX-this.startX,this.totalY=this.endY-this.startY,this.startMultiplierX=t.startMultiplierX||1,this.endMultiplierX=t.endMultiplierX||1,this.startMultiplierY=t.startMultiplierY||1,this.endMultiplierY=t.endMultiplierY||1};function l(){return(l=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(t[s]=i[s])}return t}).apply(this,arguments)}(e=exports.ValidCSSEffects||(exports.ValidCSSEffects={})).speed="speed",e.translateX="translateX",e.translateY="translateY",e.rotate="rotate",e.rotateX="rotateX",e.rotateY="rotateY",e.rotateZ="rotateZ",e.scale="scale",e.scaleX="scaleX",e.scaleY="scaleY",e.scaleZ="scaleZ",e.opacity="opacity",(i=exports.Units||(exports.Units={})).px="px",i["%"]="%",(s=exports.RotationUnits||(exports.RotationUnits={})).deg="deg",s.turn="turn",s.rad="rad",(exports.ScaleUnits||(exports.ScaleUnits={}))[""]="",(n=exports.ScrollAxis||(exports.ScrollAxis={})).vertical="vertical",n.horizontal="horizontal",(r=exports.EasingPreset||(exports.EasingPreset={})).ease="ease",r.easeIn="easeIn",r.easeOut="easeOut",r.easeInOut="easeInOut",r.easeInQuad="easeInQuad",r.easeInCubic="easeInCubic",r.easeInQuart="easeInQuart",r.easeInQuint="easeInQuint",r.easeInSine="easeInSine",r.easeInExpo="easeInExpo",r.easeInCirc="easeInCirc",r.easeOutQuad="easeOutQuad",r.easeOutCubic="easeOutCubic",r.easeOutQuart="easeOutQuart",r.easeOutQuint="easeOutQuint",r.easeOutSine="easeOutSine",r.easeOutExpo="easeOutExpo",r.easeOutCirc="easeOutCirc",r.easeInOutQuad="easeInOutQuad",r.easeInOutCubic="easeInOutCubic",r.easeInOutQuart="easeInOutQuart",r.easeInOutQuint="easeInOutQuint",r.easeInOutSine="easeInOutSine",r.easeInOutExpo="easeInOutExpo",r.easeInOutCirc="easeInOutCirc",r.easeInBack="easeInBack",r.easeOutBack="easeOutBack",r.easeInOutBack="easeInOutBack";var h=0;function u(){return++h}var c=function(){function t(t){var e=t.el.getBoundingClientRect();if(t.view.scrollContainer){var i=t.view.scrollContainer.getBoundingClientRect();e=l({},e,{top:e.top-i.top,right:e.right-i.left,bottom:e.bottom-i.top,left:e.left-i.left})}this.height=t.el.offsetHeight,this.width=t.el.offsetWidth,this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,t.rootMargin&&this._setRectWithRootMargin(t.rootMargin)}return t.prototype._setRectWithRootMargin=function(t){var e=t.top+t.bottom,i=t.left+t.right;this.top-=t.top,this.right+=t.right,this.bottom+=t.bottom,this.left-=t.left,this.height+=e,this.width+=i},t}(),d=[exports.ScaleUnits[""],exports.Units.px,exports.Units["%"],exports.RotationUnits.deg,exports.RotationUnits.turn,exports.RotationUnits.rad];function p(t,e){void 0===e&&(e=exports.Units["%"]);var i={value:0,unit:e};if(void 0===t)return i;if("number"!=typeof t&&"string"!=typeof t)throw new Error("Invalid value provided. Must provide a value as a string or number");if(t=String(t),i.value=parseFloat(t),i.unit=t.match(/[\d.\-\+]*\s*(.*)/)[1]||e,!d.includes(i.unit))throw new Error("Invalid unit provided.");return i}var f={ease:[.25,.1,.25,1],easeIn:[.42,0,1,1],easeOut:[0,0,.58,1],easeInOut:[.42,0,.58,1],easeInQuad:[.55,.085,.68,.53],easeInCubic:[.55,.055,.675,.19],easeInQuart:[.895,.03,.685,.22],easeInQuint:[.755,.05,.855,.06],easeInSine:[.47,0,.745,.715],easeInExpo:[.95,.05,.795,.035],easeInCirc:[.6,.04,.98,.335],easeOutQuad:[.25,.46,.45,.94],easeOutCubic:[.215,.61,.355,1],easeOutQuart:[.165,.84,.44,1],easeOutQuint:[.23,1,.32,1],easeOutSine:[.39,.575,.565,1],easeOutExpo:[.19,1,.22,1],easeOutCirc:[.075,.82,.165,1],easeInOutQuad:[.455,.03,.515,.955],easeInOutCubic:[.645,.045,.355,1],easeInOutQuart:[.77,0,.175,1],easeInOutQuint:[.86,0,.07,1],easeInOutSine:[.445,.05,.55,.95],easeInOutExpo:[1,0,0,1],easeInOutCirc:[.785,.135,.15,.86],easeInBack:[.6,-.28,.735,.045],easeOutBack:[.175,.885,.32,1.275],easeInOutBack:[.68,-.55,.265,1.55]};function v(t){if(Array.isArray(t))return a(t[0],t[1],t[2],t[3]);if("string"==typeof t&&void 0!==f[t]){var e=f[t];return a(e[0],e[1],e[2],e[3])}}var m=Object.values(exports.ValidCSSEffects),g={speed:"px",translateX:"%",translateY:"%",rotate:"deg",rotateX:"deg",rotateY:"deg",rotateZ:"deg",scale:"",scaleX:"",scaleY:"",scaleZ:"",opacity:""};function w(t,e){var i={};return m.forEach((function(s){var n=g[s];if("number"==typeof(null==t?void 0:t[s])){var r=null==t?void 0:t[s],a=-10*(r||0)+"px",o=p(10*(r||0)+"px"),l=p(a),h={start:o.value,end:l.value,unit:o.unit};e===exports.ScrollAxis.vertical&&(i.translateY=h),e===exports.ScrollAxis.horizontal&&(i.translateX=h)}if(Array.isArray(null==t?void 0:t[s])){var u=null==t?void 0:t[s];if(void 0!==u[0]&&void 0!==u[1]){var c=p(null==u?void 0:u[0],n),d=p(null==u?void 0:u[1],n),f=v(null==u?void 0:u[2]);if(i[s]={start:c.value,end:d.value,unit:c.unit,easing:f},c.unit!==d.unit)throw new Error("Must provide matching units for the min and max offset values of each axis.")}}})),i}function E(t,e,i,s){var n=(i-t)/e;return s&&(n=s(n)),n}function x(t,e,i){return i>=t&&i<=e}function _(t,e,i,s,n){return(i-e)*(t-s)/(n-s)+e}function I(t,e){return{value:_("function"==typeof t.easing?t.easing(e):e,(null==t?void 0:t.start)||0,(null==t?void 0:t.end)||0,0,1),unit:null==t?void 0:t.unit}}var S=Object.values(exports.ValidCSSEffects).filter((function(t){return"opacity"!==t}));function y(t,e,i){if(i){var s=function(t,e){return S.reduce((function(i,s){var n=t[s]&&I(t[s],e);return void 0===n||void 0===n.value||void 0===n.unit?i:i+(s+"(")+n.value+n.unit+")"}),"")}(t,e),n=function(t,e){var i=t.opacity&&I(t.opacity,e);return void 0===i||void 0===i.value||void 0===i.unit?"":""+i.value}(t,e);i.style.transform=s,i.style.opacity=n}}function O(t){var e=t.el;e&&(e.style.transform="",e.style.opacity="")}function C(t,e,i){var s=e>t,n=(Math.abs(t)+Math.abs(e))*(s?-1:1);return Math.max(i/(i+n),1)}function b(t,e){var i=t.start,s=t.end;if("%"===t.unit){var n=e/100;i*=n,s*=n}return{start:i,end:s}}var X={start:0,end:0,unit:""},Y=function(){function t(t){var e,i;this.el=t.el,this.props=t.props,this.scrollAxis=t.scrollAxis,this.id=u(),this.effects=w(this.props,this.scrollAxis),this.isInView=null,this.progress=0,this._setElementEasing(t.props.easing),e=t.el,i=Object.keys(this.effects).includes("opacity"),e.style.willChange="transform"+(i?",opacity":""),this.updatePosition=t.scrollAxis===exports.ScrollAxis.vertical?this._updatePositionVertical:this._updatePositionHorizontal}var e=t.prototype;return e.updateProps=function(t){return this.props=l({},this.props,t),this.effects=w(t,this.scrollAxis),this._setElementEasing(t.easing),this},e.setCachedAttributes=function(t,e){O(this),this.rect=new c({el:this.props.targetElement||this.el,rootMargin:this.props.rootMargin,view:t});var i,s,n=(s=this.effects,!((i=this.props).rootMargin||i.targetElement||!s.translateX&&!s.translateY));return"number"==typeof this.props.startScroll&&"number"==typeof this.props.endScroll?(this.limits=new o({startX:this.props.startScroll,startY:this.props.startScroll,endX:this.props.endScroll,endY:this.props.endScroll}),this):(n?(this.limits=function(t,e,i,s,n){var r=i.translateY||X,a=b(i.translateX||X,t.width),l=a.start,h=a.end,u=b(r,t.height),c=u.start,d=u.end,p=t.top-e.height,f=t.left-e.width,v=t.bottom,m=t.right,g=C(c,d,e.height+t.height),w=g,E=C(l,h,e.width+t.width),x=E;return c<0&&(p+=c*g),d>0&&(v+=d*w),l<0&&(f+=l*E),h>0&&(m+=h*x),f+=s.x,m+=s.x,p+=s.y,v+=s.y,n&&(s.y+t.top<e.height&&(g=1,w=C(c,d,(v=t.bottom+s.y)-(p=0)),d>0&&(v+=d*w)),s.x+t.left<e.width&&(E=1,x=C(l,h,(m=t.right+s.x)-(f=0)),h>0&&(m+=h*x))),new o({startX:f,startY:p,endX:m,endY:v,startMultiplierX:E,endMultiplierX:x,startMultiplierY:g,endMultiplierY:w})}(this.rect,t,this.effects,e,this.props.shouldStartAnimationInitialInView),this.scaledEffects=function(t,e){var i=l({},t);return i.translateX&&(i.translateX=l({},t.translateX,{start:i.translateX.start*e.startMultiplierX,end:i.translateX.end*e.endMultiplierX})),i.translateY&&(i.translateY=l({},t.translateY,{start:i.translateY.start*e.startMultiplierY,end:i.translateY.end*e.endMultiplierY})),i}(this.effects,this.limits)):this.limits=function(t,e,i,s){var n=t.top-e.height,r=t.left-e.width,a=t.bottom,l=t.right;return r+=i.x,n+=i.y,s&&(i.y+t.top<e.height&&(n=0),i.x+t.left<e.width&&(r=0)),new o({startX:r,startY:n,endX:l+=i.x,endY:a+=i.y})}(this.rect,t,e,this.props.shouldStartAnimationInitialInView),this._setElementStyles(),this)},e._updateElementIsInView=function(t){t!==this.isInView&&(t?this.props.onEnter&&this.props.onEnter():(this._setFinalStylesAndProgress(),this.props.onExit&&this.props.onExit())),this.isInView=t},e._setFinalStylesAndProgress=function(){var t=Math.round(this.progress);this._updateElementProgress(t)},e._setElementStyles=function(){y(this.scaledEffects||this.effects,this.progress,this.el)},e._updateElementProgress=function(t){this.progress=t,this.props.onProgressChange&&this.props.onProgressChange(this.progress),this.props.onChange&&this.props.onChange(this),this._setElementStyles()},e._setElementEasing=function(t){this.easing=v(t)},e._updatePositionHorizontal=function(t){if(!this.limits)return this;var e=x(this.limits.startX,this.limits.endX,t.x);if(this._updateElementIsInView(e),!e)return this;var i=E(this.limits.startX,this.limits.totalX,t.x,this.easing);return this._updateElementProgress(i),this},e._updatePositionVertical=function(t){if(!this.limits)return this;var e=x(this.limits.startY,this.limits.endY,t.y);if(this._updateElementIsInView(e),!this.isInView)return this;var i=E(this.limits.startY,this.limits.totalY,t.y,this.easing);return this._updateElementProgress(i),this},t}(),P=function(){function t(t){var e=t.width,i=t.height;this.scrollContainer=t.scrollContainer,this.width=e,this.height=i}return t.prototype.setSize=function(t,e){return this.width=t,this.height=e,this},t}(),A=function(){function t(t,e){this.x=t,this.y=e,this.dx=0,this.dy=0}return t.prototype.setScroll=function(t,e){return this.dx=t-this.x,this.dy=e-this.y,this.x=t,this.y=e,this},t}();function M(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}var Q=function(){function t(t){var e=t.scrollAxis,i=void 0===e?exports.ScrollAxis.vertical:e,s=t.scrollContainer;this.scrollAxis=i,this.elements=[],this._hasScrollContainer=!!s,this.viewEl=null!=s?s:window;var n=this._getScrollPosition();this.scroll=new A(n[0],n[1]),this.view=new P({width:0,height:0,scrollContainer:this._hasScrollContainer?s:void 0}),this._ticking=!1,this._supportsPassive=M(),this._bindAllMethods(),this._addListeners(this.viewEl),this._setViewSize()}t.init=function(e){if("undefined"==typeof window)throw new Error("Looks like ParallaxController.init() was called on the server. This method must be called on the client.");return new t(e)};var e=t.prototype;return e._bindAllMethods=function(){var t=this;["_addListeners","_removeListeners","_getScrollPosition","_handleScroll","_handleUpdateCache","_updateAllElements","_updateElementPosition","_setViewSize","getElements","createElement","removeElementById","resetElementStyles","updateElementPropsById","update","updateScrollContainer","destroy"].forEach((function(e){t[e]=t[e].bind(t)}))},e._addListeners=function(t){t.addEventListener("scroll",this._handleScroll,!!this._supportsPassive&&{passive:!0}),window.addEventListener("resize",this._handleUpdateCache,!1),window.addEventListener("blur",this._handleUpdateCache,!1),window.addEventListener("focus",this._handleUpdateCache,!1),window.addEventListener("load",this._handleUpdateCache,!1)},e._removeListeners=function(t){t.removeEventListener("scroll",this._handleScroll,!1),window.removeEventListener("resize",this._handleUpdateCache,!1),window.removeEventListener("blur",this._handleUpdateCache,!1),window.removeEventListener("focus",this._handleUpdateCache,!1),window.removeEventListener("load",this._handleUpdateCache,!1)},e._getScrollPosition=function(){return[this._hasScrollContainer?this.viewEl.scrollLeft:window.pageXOffset,this._hasScrollContainer?this.viewEl.scrollTop:window.pageYOffset]},e._handleScroll=function(){var t=this._getScrollPosition();this.scroll.setScroll(t[0],t[1]),!this._ticking&&this.elements.length>0&&(this._ticking=!0,window.requestAnimationFrame(this._updateAllElements))},e._handleUpdateCache=function(){this._setViewSize(),this._updateAllElements({updateCache:!0})},e._updateAllElements=function(t){var e=this,i=(void 0===t?{}:t).updateCache;this.elements&&this.elements.forEach((function(t){i&&t.setCachedAttributes(e.view,e.scroll),e._updateElementPosition(t)})),this._ticking=!1},e._updateElementPosition=function(t){t.props.disabled||t.updatePosition(this.scroll)},e._setViewSize=function(){if(this._hasScrollContainer)return this.view.setSize(this.viewEl.offsetWidth,this.viewEl.offsetHeight);var t=document.documentElement,e=window.innerWidth||t.clientWidth,i=window.innerHeight||t.clientHeight;return this.view.setSize(e,i)},e.getElements=function(){return this.elements},e.createElement=function(t){var e=new Y(l({},t,{scrollAxis:this.scrollAxis}));return e.setCachedAttributes(this.view,this.scroll),this.elements=this.elements?[].concat(this.elements,[e]):[e],this._updateElementPosition(e),e},e.removeElementById=function(t){this.elements&&(this.elements=this.elements.filter((function(e){return e.id!==t})))},e.updateElementPropsById=function(t,e){this.elements&&(this.elements=this.elements.map((function(i){return i.id===t?i.updateProps(e):i}))),this.update()},e.resetElementStyles=function(t){O(t)},e.update=function(){var t=this._getScrollPosition();this.scroll.setScroll(t[0],t[1]),this._setViewSize(),this._updateAllElements({updateCache:!0})},e.updateScrollContainer=function(t){this._removeListeners(this.viewEl),this.viewEl=t,this._hasScrollContainer=!!t,this.view=new P({width:0,height:0,scrollContainer:t}),this._setViewSize(),this._addListeners(this.viewEl),this._updateAllElements({updateCache:!0})},e.destroy=function(){this._removeListeners(this.viewEl),this.elements&&this.elements.forEach((function(t){return O(t)})),this.elements=void 0},t}();exports.Element=Y,exports.Limits=o,exports.ParallaxController=Q,exports.Rect=c,exports.Scroll=A,exports.View=P,exports.createId=u,exports.getProgressAmount=E,exports.isElementInView=x,exports.parseElementTransitionEffects=w,exports.parseValueAndUnit=p,exports.resetStyles=O,exports.scaleBetween=_,exports.scaleEffectByProgress=I,exports.setElementStyles=y,exports.testForPassiveScroll=M; | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,e,i,s,n,r,a=(t=require("bezier-easing"))&&"object"==typeof t&&"default"in t?t.default:t,o=function(t){this.startX=t.startX,this.startY=t.startY,this.endX=t.endX,this.endY=t.endY,this.totalX=this.endX-this.startX,this.totalY=this.endY-this.startY,this.startMultiplierX=t.startMultiplierX||1,this.endMultiplierX=t.endMultiplierX||1,this.startMultiplierY=t.startMultiplierY||1,this.endMultiplierY=t.endMultiplierY||1};function l(){return(l=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var s in i)Object.prototype.hasOwnProperty.call(i,s)&&(t[s]=i[s])}return t}).apply(this,arguments)}(e=exports.ValidCSSEffects||(exports.ValidCSSEffects={})).speed="speed",e.translateX="translateX",e.translateY="translateY",e.rotate="rotate",e.rotateX="rotateX",e.rotateY="rotateY",e.rotateZ="rotateZ",e.scale="scale",e.scaleX="scaleX",e.scaleY="scaleY",e.scaleZ="scaleZ",e.opacity="opacity",(i=exports.Units||(exports.Units={})).px="px",i["%"]="%",(s=exports.RotationUnits||(exports.RotationUnits={})).deg="deg",s.turn="turn",s.rad="rad",(exports.ScaleUnits||(exports.ScaleUnits={}))[""]="",(n=exports.ScrollAxis||(exports.ScrollAxis={})).vertical="vertical",n.horizontal="horizontal",(r=exports.EasingPreset||(exports.EasingPreset={})).ease="ease",r.easeIn="easeIn",r.easeOut="easeOut",r.easeInOut="easeInOut",r.easeInQuad="easeInQuad",r.easeInCubic="easeInCubic",r.easeInQuart="easeInQuart",r.easeInQuint="easeInQuint",r.easeInSine="easeInSine",r.easeInExpo="easeInExpo",r.easeInCirc="easeInCirc",r.easeOutQuad="easeOutQuad",r.easeOutCubic="easeOutCubic",r.easeOutQuart="easeOutQuart",r.easeOutQuint="easeOutQuint",r.easeOutSine="easeOutSine",r.easeOutExpo="easeOutExpo",r.easeOutCirc="easeOutCirc",r.easeInOutQuad="easeInOutQuad",r.easeInOutCubic="easeInOutCubic",r.easeInOutQuart="easeInOutQuart",r.easeInOutQuint="easeInOutQuint",r.easeInOutSine="easeInOutSine",r.easeInOutExpo="easeInOutExpo",r.easeInOutCirc="easeInOutCirc",r.easeInBack="easeInBack",r.easeOutBack="easeOutBack",r.easeInOutBack="easeInOutBack";var h=0;function u(){return++h}var c=function(){function t(t){var e=t.el.getBoundingClientRect();if(t.view.scrollContainer){var i=t.view.scrollContainer.getBoundingClientRect();e=l({},e,{top:e.top-i.top,right:e.right-i.left,bottom:e.bottom-i.top,left:e.left-i.left})}this.height=t.el.offsetHeight,this.width=t.el.offsetWidth,this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,t.rootMargin&&this._setRectWithRootMargin(t.rootMargin)}return t.prototype._setRectWithRootMargin=function(t){var e=t.top+t.bottom,i=t.left+t.right;this.top-=t.top,this.right+=t.right,this.bottom+=t.bottom,this.left-=t.left,this.height+=e,this.width+=i},t}(),d=[exports.ScaleUnits[""],exports.Units.px,exports.Units["%"],exports.RotationUnits.deg,exports.RotationUnits.turn,exports.RotationUnits.rad];function p(t,e){void 0===e&&(e=exports.Units["%"]);var i={value:0,unit:e};if(void 0===t)return i;if("number"!=typeof t&&"string"!=typeof t)throw new Error("Invalid value provided. Must provide a value as a string or number");if(t=String(t),i.value=parseFloat(t),i.unit=t.match(/[\d.\-+]*\s*(.*)/)[1]||e,!d.includes(i.unit))throw new Error("Invalid unit provided.");return i}var f={ease:[.25,.1,.25,1],easeIn:[.42,0,1,1],easeOut:[0,0,.58,1],easeInOut:[.42,0,.58,1],easeInQuad:[.55,.085,.68,.53],easeInCubic:[.55,.055,.675,.19],easeInQuart:[.895,.03,.685,.22],easeInQuint:[.755,.05,.855,.06],easeInSine:[.47,0,.745,.715],easeInExpo:[.95,.05,.795,.035],easeInCirc:[.6,.04,.98,.335],easeOutQuad:[.25,.46,.45,.94],easeOutCubic:[.215,.61,.355,1],easeOutQuart:[.165,.84,.44,1],easeOutQuint:[.23,1,.32,1],easeOutSine:[.39,.575,.565,1],easeOutExpo:[.19,1,.22,1],easeOutCirc:[.075,.82,.165,1],easeInOutQuad:[.455,.03,.515,.955],easeInOutCubic:[.645,.045,.355,1],easeInOutQuart:[.77,0,.175,1],easeInOutQuint:[.86,0,.07,1],easeInOutSine:[.445,.05,.55,.95],easeInOutExpo:[1,0,0,1],easeInOutCirc:[.785,.135,.15,.86],easeInBack:[.6,-.28,.735,.045],easeOutBack:[.175,.885,.32,1.275],easeInOutBack:[.68,-.55,.265,1.55]};function v(t){if(Array.isArray(t))return a(t[0],t[1],t[2],t[3]);if("string"==typeof t&&void 0!==f[t]){var e=f[t];return a(e[0],e[1],e[2],e[3])}}var m=Object.values(exports.ValidCSSEffects),g={speed:"px",translateX:"%",translateY:"%",rotate:"deg",rotateX:"deg",rotateY:"deg",rotateZ:"deg",scale:"",scaleX:"",scaleY:"",scaleZ:"",opacity:""};function w(t,e){var i={};return m.forEach((function(s){var n=g[s];if("number"==typeof(null==t?void 0:t[s])){var r=null==t?void 0:t[s],a=-10*(r||0)+"px",o=p(10*(r||0)+"px"),l=p(a),h={start:o.value,end:l.value,unit:o.unit};e===exports.ScrollAxis.vertical&&(i.translateY=h),e===exports.ScrollAxis.horizontal&&(i.translateX=h)}if(Array.isArray(null==t?void 0:t[s])){var u=null==t?void 0:t[s];if(void 0!==u[0]&&void 0!==u[1]){var c=p(null==u?void 0:u[0],n),d=p(null==u?void 0:u[1],n),f=v(null==u?void 0:u[2]);if(i[s]={start:c.value,end:d.value,unit:c.unit,easing:f},c.unit!==d.unit)throw new Error("Must provide matching units for the min and max offset values of each axis.")}}})),i}function x(t,e,i,s){var n=(i-t)/e;return s&&(n=s(n)),n}function E(t,e,i){return i>=t&&i<=e}function _(t,e,i,s,n){return(i-e)*(t-s)/(n-s)+e}function S(t,e){return{value:_("function"==typeof t.easing?t.easing(e):e,(null==t?void 0:t.start)||0,(null==t?void 0:t.end)||0,0,1),unit:null==t?void 0:t.unit}}var I=Object.values(exports.ValidCSSEffects).filter((function(t){return"opacity"!==t}));function y(t,e,i){if(i){var s=function(t,e){return I.reduce((function(i,s){var n=t[s]&&S(t[s],e);return void 0===n||void 0===n.value||void 0===n.unit?i:i+(s+"(")+n.value+n.unit+")"}),"")}(t,e),n=function(t,e){var i=t.opacity&&S(t.opacity,e);return void 0===i||void 0===i.value||void 0===i.unit?"":""+i.value}(t,e);i.style.transform=s,i.style.opacity=n}}function O(t){var e=t.el;e&&(e.style.transform="",e.style.opacity="")}function C(t,e,i){var s=e>t,n=(Math.abs(t)+Math.abs(e))*(s?-1:1);return Math.max(i/(i+n),1)}function b(t,e){var i=t.start,s=t.end;if("%"===t.unit){var n=e/100;i*=n,s*=n}return{start:i,end:s}}var A={start:0,end:0,unit:""},X=function(){function t(t){var e,i;this.el=t.el,this.props=t.props,this.scrollAxis=t.scrollAxis,this.id=u(),this.effects=w(this.props,this.scrollAxis),this.isInView=null,this.progress=0,this._setElementEasing(t.props.easing),e=t.el,i=Object.keys(this.effects).includes("opacity"),e.style.willChange="transform"+(i?",opacity":""),this.updatePosition=t.scrollAxis===exports.ScrollAxis.vertical?this._updatePositionVertical:this._updatePositionHorizontal}var e=t.prototype;return e.updateProps=function(t){return this.props=l({},this.props,t),this.effects=w(t,this.scrollAxis),this._setElementEasing(t.easing),this},e.setCachedAttributes=function(t,e){O(this),this.rect=new c({el:this.props.targetElement||this.el,rootMargin:this.props.rootMargin,view:t});var i,s,n,r=(s=this.effects,n=this.scrollAxis,!(i=this.props).rootMargin&&!i.targetElement&&!!(s.translateX&&n===exports.ScrollAxis.horizontal||s.translateY&&n===exports.ScrollAxis.vertical));return"number"==typeof this.props.startScroll&&"number"==typeof this.props.endScroll?(this.limits=new o({startX:this.props.startScroll,startY:this.props.startScroll,endX:this.props.endScroll,endY:this.props.endScroll}),this):(r?(this.limits=function(t,e,i,s,n,r){var a=i.translateY||A,l=b(i.translateX||A,t.width),h=l.start,u=l.end,c=b(a,t.height),d=c.start,p=c.end,f=t.top-e.height,v=t.left-e.width,m=t.bottom,g=t.right,w=1,x=1;n===exports.ScrollAxis.vertical&&(x=w=C(d,p,e.height+t.height));var E=1,_=1;return n===exports.ScrollAxis.horizontal&&(_=E=C(h,u,e.width+t.width)),d<0&&(f+=d*w),p>0&&(m+=p*x),h<0&&(v+=h*E),u>0&&(g+=u*_),v+=s.x,g+=s.x,f+=s.y,m+=s.y,r&&(s.y+t.top<e.height&&(w=1,x=C(d,p,(m=t.bottom+s.y)-(f=0)),p>0&&(m+=p*x)),s.x+t.left<e.width&&(E=1,_=C(h,u,(g=t.right+s.x)-(v=0)),u>0&&(g+=u*_))),new o({startX:v,startY:f,endX:g,endY:m,startMultiplierX:E,endMultiplierX:_,startMultiplierY:w,endMultiplierY:x})}(this.rect,t,this.effects,e,this.scrollAxis,this.props.shouldStartAnimationInitialInView),this.scaledEffects=function(t,e){var i=l({},t);return i.translateX&&(i.translateX=l({},t.translateX,{start:i.translateX.start*e.startMultiplierX,end:i.translateX.end*e.endMultiplierX})),i.translateY&&(i.translateY=l({},t.translateY,{start:i.translateY.start*e.startMultiplierY,end:i.translateY.end*e.endMultiplierY})),i}(this.effects,this.limits)):this.limits=function(t,e,i,s){var n=t.top-e.height,r=t.left-e.width,a=t.bottom,l=t.right;return r+=i.x,n+=i.y,s&&(i.y+t.top<e.height&&(n=0),i.x+t.left<e.width&&(r=0)),new o({startX:r,startY:n,endX:l+=i.x,endY:a+=i.y})}(this.rect,t,e,this.props.shouldStartAnimationInitialInView),this._setElementStyles(),this)},e._updateElementIsInView=function(t){t!==this.isInView&&(t?this.props.onEnter&&this.props.onEnter():(this._setFinalStylesAndProgress(),this.props.onExit&&this.props.onExit())),this.isInView=t},e._setFinalStylesAndProgress=function(){var t=Math.round(this.progress);this._updateElementProgress(t)},e._setElementStyles=function(){y(this.scaledEffects||this.effects,this.progress,this.el)},e._updateElementProgress=function(t){this.progress=t,this.props.onProgressChange&&this.props.onProgressChange(this.progress),this.props.onChange&&this.props.onChange(this),this._setElementStyles()},e._setElementEasing=function(t){this.easing=v(t)},e._updatePositionHorizontal=function(t){if(!this.limits)return this;var e=E(this.limits.startX,this.limits.endX,t.x);if(this._updateElementIsInView(e),!e)return this;var i=x(this.limits.startX,this.limits.totalX,t.x,this.easing);return this._updateElementProgress(i),this},e._updatePositionVertical=function(t){if(!this.limits)return this;var e=E(this.limits.startY,this.limits.endY,t.y);if(this._updateElementIsInView(e),!this.isInView)return this;var i=x(this.limits.startY,this.limits.totalY,t.y,this.easing);return this._updateElementProgress(i),this},t}(),Y=function(){function t(t){var e=t.width,i=t.height;this.scrollContainer=t.scrollContainer,this.width=e,this.height=i}return t.prototype.setSize=function(t,e){return this.width=t,this.height=e,this},t}(),P=function(){function t(t,e){this.x=t,this.y=e,this.dx=0,this.dy=0}return t.prototype.setScroll=function(t,e){return this.dx=t-this.x,this.dy=e-this.y,this.x=t,this.y=e,this},t}();function M(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){return t=!0,!0}});window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}var Q=function(){function t(t){var e=t.scrollAxis,i=void 0===e?exports.ScrollAxis.vertical:e,s=t.scrollContainer;this.scrollAxis=i,this.elements=[],this._hasScrollContainer=!!s,this.viewEl=null!=s?s:window;var n=this._getScrollPosition();this.scroll=new P(n[0],n[1]),this.view=new Y({width:0,height:0,scrollContainer:this._hasScrollContainer?s:void 0}),this._ticking=!1,this._supportsPassive=M(),this._bindAllMethods(),this._addListeners(this.viewEl),this._setViewSize()}t.init=function(e){if("undefined"==typeof window)throw new Error("Looks like ParallaxController.init() was called on the server. This method must be called on the client.");return new t(e)};var e=t.prototype;return e._bindAllMethods=function(){var t=this;["_addListeners","_removeListeners","_getScrollPosition","_handleScroll","_handleUpdateCache","_updateAllElements","_updateElementPosition","_setViewSize","getElements","createElement","removeElementById","resetElementStyles","updateElementPropsById","update","updateScrollContainer","destroy"].forEach((function(e){t[e]=t[e].bind(t)}))},e._addListeners=function(t){t.addEventListener("scroll",this._handleScroll,!!this._supportsPassive&&{passive:!0}),window.addEventListener("resize",this._handleUpdateCache,!1),window.addEventListener("blur",this._handleUpdateCache,!1),window.addEventListener("focus",this._handleUpdateCache,!1),window.addEventListener("load",this._handleUpdateCache,!1)},e._removeListeners=function(t){t.removeEventListener("scroll",this._handleScroll,!1),window.removeEventListener("resize",this._handleUpdateCache,!1),window.removeEventListener("blur",this._handleUpdateCache,!1),window.removeEventListener("focus",this._handleUpdateCache,!1),window.removeEventListener("load",this._handleUpdateCache,!1)},e._getScrollPosition=function(){return[this._hasScrollContainer?this.viewEl.scrollLeft:window.pageXOffset,this._hasScrollContainer?this.viewEl.scrollTop:window.pageYOffset]},e._handleScroll=function(){var t=this._getScrollPosition();this.scroll.setScroll(t[0],t[1]),!this._ticking&&this.elements.length>0&&(this._ticking=!0,window.requestAnimationFrame(this._updateAllElements))},e._handleUpdateCache=function(){this._setViewSize(),this._updateAllElements({updateCache:!0})},e._updateAllElements=function(t){var e=this,i=(void 0===t?{}:t).updateCache;this.elements&&this.elements.forEach((function(t){i&&t.setCachedAttributes(e.view,e.scroll),e._updateElementPosition(t)})),this._ticking=!1},e._updateElementPosition=function(t){t.props.disabled||t.updatePosition(this.scroll)},e._setViewSize=function(){if(this._hasScrollContainer)return this.view.setSize(this.viewEl.offsetWidth,this.viewEl.offsetHeight);var t=document.documentElement,e=window.innerWidth||t.clientWidth,i=window.innerHeight||t.clientHeight;return this.view.setSize(e,i)},e.getElements=function(){return this.elements},e.createElement=function(t){var e=new X(l({},t,{scrollAxis:this.scrollAxis}));return e.setCachedAttributes(this.view,this.scroll),this.elements=this.elements?[].concat(this.elements,[e]):[e],this._updateElementPosition(e),e},e.removeElementById=function(t){this.elements&&(this.elements=this.elements.filter((function(e){return e.id!==t})))},e.updateElementPropsById=function(t,e){this.elements&&(this.elements=this.elements.map((function(i){return i.id===t?i.updateProps(e):i}))),this.update()},e.resetElementStyles=function(t){O(t)},e.update=function(){var t=this._getScrollPosition();this.scroll.setScroll(t[0],t[1]),this._setViewSize(),this._updateAllElements({updateCache:!0})},e.updateScrollContainer=function(t){this._removeListeners(this.viewEl),this.viewEl=t,this._hasScrollContainer=!!t,this.view=new Y({width:0,height:0,scrollContainer:t}),this._setViewSize(),this._addListeners(this.viewEl),this._updateAllElements({updateCache:!0})},e.destroy=function(){this._removeListeners(this.viewEl),this.elements&&this.elements.forEach((function(t){return O(t)})),this.elements=void 0},t}();exports.Element=X,exports.Limits=o,exports.ParallaxController=Q,exports.Rect=c,exports.Scroll=P,exports.View=Y,exports.createId=u,exports.getProgressAmount=x,exports.isElementInView=E,exports.parseElementTransitionEffects=w,exports.parseValueAndUnit=p,exports.resetStyles=O,exports.scaleBetween=_,exports.scaleEffectByProgress=S,exports.setElementStyles=y,exports.testForPassiveScroll=M; | ||
//# sourceMappingURL=parallax-controller.cjs.production.min.js.map |
@@ -193,3 +193,3 @@ import bezier from 'bezier-easing'; | ||
out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || defaultUnit; // @ts-expect-error | ||
out.unit = str.match(/[\d.\-+]*\s*(.*)/)[1] || defaultUnit; // @ts-expect-error | ||
@@ -508,3 +508,3 @@ var isValidUnit = VALID_UNITS.includes(out.unit); | ||
}; | ||
function createLimitsWithTranslationsForRelativeElements(rect, view, effects, scroll, shouldStartAnimationInitialInView) { | ||
function createLimitsWithTranslationsForRelativeElements(rect, view, effects, scroll, scrollAxis, shouldStartAnimationInitialInView) { | ||
// get start and end accounting for percent effects | ||
@@ -526,14 +526,20 @@ var translateX = effects.translateX || DEFAULT_VALUE; | ||
var endY = rect.bottom; | ||
var endX = rect.right; // let multiplierY = 1; | ||
// if (scrollAxis === ScrollAxis.vertical) { | ||
var endX = rect.right; | ||
var startMultiplierY = 1; | ||
var endMultiplierY = 1; | ||
var startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, view.height + rect.height); | ||
var endMultiplierY = startMultiplierY; // } | ||
// let multiplierX = 1; | ||
// if (scrollAxis === ScrollAxis.horizontal) { | ||
if (scrollAxis === ScrollAxis.vertical) { | ||
startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, view.height + rect.height); | ||
endMultiplierY = startMultiplierY; | ||
} | ||
var startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, view.width + rect.width); | ||
var endMultiplierX = startMultiplierX; // } | ||
// Apply the scale to initial values | ||
var startMultiplierX = 1; | ||
var endMultiplierX = 1; | ||
if (scrollAxis === ScrollAxis.horizontal) { | ||
startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, view.width + rect.width); | ||
endMultiplierX = startMultiplierX; | ||
} // Apply the scale to initial values | ||
if (startTranslateYPx < 0) { | ||
@@ -624,3 +630,3 @@ startY = startY + startTranslateYPx * startMultiplierY; | ||
function getShouldScaleTranslateEffects(props, effects) { | ||
function getShouldScaleTranslateEffects(props, effects, scrollAxis) { | ||
if (props.rootMargin || props.targetElement) { | ||
@@ -630,3 +636,3 @@ return false; | ||
if (!!effects.translateX || !!effects.translateY) { | ||
if (!!effects.translateX && scrollAxis === ScrollAxis.horizontal || !!effects.translateY && scrollAxis === ScrollAxis.vertical) { | ||
return true; | ||
@@ -673,3 +679,3 @@ } | ||
}); | ||
var shouldScaleTranslateEffects = getShouldScaleTranslateEffects(this.props, this.effects); | ||
var shouldScaleTranslateEffects = getShouldScaleTranslateEffects(this.props, this.effects, this.scrollAxis); | ||
@@ -687,3 +693,3 @@ if (typeof this.props.startScroll === 'number' && typeof this.props.endScroll === 'number') { | ||
if (shouldScaleTranslateEffects) { | ||
this.limits = createLimitsWithTranslationsForRelativeElements(this.rect, view, this.effects, scroll, this.props.shouldStartAnimationInitialInView); | ||
this.limits = createLimitsWithTranslationsForRelativeElements(this.rect, view, this.effects, scroll, this.scrollAxis, this.props.shouldStartAnimationInitialInView); | ||
this.scaledEffects = scaleTranslateEffectsForSlowerScroll(this.effects, this.limits); | ||
@@ -816,2 +822,3 @@ } else { | ||
supportsPassiveOption = true; | ||
return true; | ||
} | ||
@@ -818,0 +825,0 @@ }); // @ts-expect-error |
{ | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"license": "MIT", | ||
@@ -4,0 +4,0 @@ "main": "dist/index.js", |
# 🕹 Parallax Controller | ||
[![npm version](https://badge.fury.io/js/parallax-controller.svg)](https://badge.fury.io/js/parallax-controller) [![codecov](https://codecov.io/gh/jscottsmith/parallax-controller/branch/master/graph/badge.svg)](https://codecov.io/gh/jscottsmith/parallax-controller) | ||
[![NPM Version Latest](https://img.shields.io/npm/v/parallax-controller/latest)](https://www.npmjs.com/package/parallax-controller) | ||
[![NPM Downloads](https://img.shields.io/npm/dm/parallax-controller)](https://www.npmjs.com/package/parallax-controller) | ||
[![Codecov](https://codecov.io/gh/jscottsmith/parallax-controller/branch/master/graph/badge.svg)](https://codecov.io/gh/jscottsmith/parallax-controller) | ||
[![Test and Lint](https://github.com/jscottsmith/parallax-controller/actions/workflows/main.yml/badge.svg)](https://github.com/jscottsmith/parallax-controller/actions/workflows/main.yml) | ||
[![Size](https://github.com/jscottsmith/parallax-controller/actions/workflows/size.yml/badge.svg)](https://github.com/jscottsmith/parallax-controller/actions/workflows/size.yml) | ||
[![Coverage](https://github.com/jscottsmith/parallax-controller/actions/workflows/coverage.yml/badge.svg)](https://github.com/jscottsmith/parallax-controller/actions/workflows/coverage.yml) | ||
Core classes and controller for creating parallax scrolling effects. Designed to provide scroll based animations for elements relative to the view. Built for performance by caching important attributes that cause reflow and layout when accessing. | ||
@@ -6,0 +12,0 @@ |
@@ -88,3 +88,4 @@ import bezier from 'bezier-easing'; | ||
this.props, | ||
this.effects | ||
this.effects, | ||
this.scrollAxis | ||
); | ||
@@ -111,2 +112,3 @@ | ||
scroll, | ||
this.scrollAxis, | ||
this.props.shouldStartAnimationInitialInView | ||
@@ -113,0 +115,0 @@ ); |
@@ -9,3 +9,3 @@ import { ParsedValueEffect } from '../types'; | ||
import { getStartEndValueInPx } from './getStartEndValueInPx'; | ||
import { ParallaxStartEndEffects } from '../types'; | ||
import { ParallaxStartEndEffects, ScrollAxis, ValidScrollAxis } from '../types'; | ||
@@ -23,2 +23,3 @@ const DEFAULT_VALUE: ParsedValueEffect = { | ||
scroll: Scroll, | ||
scrollAxis: ValidScrollAxis, | ||
shouldStartAnimationInitialInView?: boolean | ||
@@ -45,20 +46,22 @@ ): Limits { | ||
// let multiplierY = 1; | ||
// if (scrollAxis === ScrollAxis.vertical) { | ||
let startMultiplierY = getTranslateScalar( | ||
startTranslateYPx, | ||
endTranslateYPx, | ||
view.height + rect.height | ||
); | ||
let endMultiplierY = startMultiplierY; | ||
// } | ||
// let multiplierX = 1; | ||
// if (scrollAxis === ScrollAxis.horizontal) { | ||
let startMultiplierX = getTranslateScalar( | ||
startTranslateXPx, | ||
endTranslateXPx, | ||
view.width + rect.width | ||
); | ||
let endMultiplierX = startMultiplierX; | ||
// } | ||
let startMultiplierY = 1; | ||
let endMultiplierY = 1; | ||
if (scrollAxis === ScrollAxis.vertical) { | ||
startMultiplierY = getTranslateScalar( | ||
startTranslateYPx, | ||
endTranslateYPx, | ||
view.height + rect.height | ||
); | ||
endMultiplierY = startMultiplierY; | ||
} | ||
let startMultiplierX = 1; | ||
let endMultiplierX = 1; | ||
if (scrollAxis === ScrollAxis.horizontal) { | ||
startMultiplierX = getTranslateScalar( | ||
startTranslateXPx, | ||
endTranslateXPx, | ||
view.width + rect.width | ||
); | ||
endMultiplierX = startMultiplierX; | ||
} | ||
@@ -65,0 +68,0 @@ // Apply the scale to initial values |
@@ -5,2 +5,3 @@ import { EffectNumber, EffectString } from '../types'; | ||
import { parseElementTransitionEffects } from './parseElementTransitionEffects'; | ||
import { ScrollAxis, ValidScrollAxis } from '..'; | ||
@@ -13,14 +14,21 @@ type Offset = string | number; | ||
y0: Offset, | ||
y1: Offset | ||
y1: Offset, | ||
scrollAxis: ValidScrollAxis = ScrollAxis.vertical | ||
) { | ||
return parseElementTransitionEffects({ | ||
translateX: [x0, x1] as EffectNumber | EffectString, | ||
translateY: [y0, y1] as EffectNumber | EffectString, | ||
}); | ||
return parseElementTransitionEffects( | ||
{ | ||
translateX: [x0, x1] as EffectNumber | EffectString, | ||
translateY: [y0, y1] as EffectNumber | EffectString, | ||
}, | ||
scrollAxis | ||
); | ||
} | ||
function createEffect(v1: Offset, v2: Offset, key: string) { | ||
const effect = parseElementTransitionEffects({ | ||
[key]: [v1, v2], | ||
}); | ||
const effect = parseElementTransitionEffects( | ||
{ | ||
[key]: [v1, v2], | ||
}, | ||
ScrollAxis.vertical | ||
); | ||
return effect; | ||
@@ -27,0 +35,0 @@ } |
@@ -0,93 +1,147 @@ | ||
import { ScrollAxis } from '..'; | ||
import { getShouldScaleTranslateEffects } from './getShouldScaleTranslateEffects'; | ||
describe('getShouldScaleTranslateEffects', () => { | ||
test(`returns false when root margin is provided`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{ | ||
rootMargin: { | ||
top: 10, | ||
bottom: 10, | ||
left: 10, | ||
right: 10, | ||
}, | ||
}, | ||
{} | ||
) | ||
).toEqual(false); | ||
describe('given getShouldScaleTranslateEffects()', () => { | ||
describe('when a root margin is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{ rootMargin: { top: 10, bottom: 10, left: 10, right: 10 } }, | ||
{}, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
test(`returns true when translate x is provided`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
translateX: { | ||
start: 10, | ||
end: 100, | ||
unit: 'px', | ||
}, | ||
} | ||
) | ||
).toEqual(true); | ||
describe('when axis is horizontal and', () => { | ||
describe('when translateX provided', () => { | ||
test(`then it returns true`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ translateX: { start: 10, end: 100, unit: 'px' } }, | ||
ScrollAxis.horizontal | ||
) | ||
).toEqual(true); | ||
}); | ||
}); | ||
describe('when translateY is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ translateY: { start: 10, end: 100, unit: 'px' } }, | ||
ScrollAxis.horizontal | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
describe('when translateY and translateX are provided', () => { | ||
test(`then it returns true`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
translateY: { start: 10, end: 100, unit: 'px' }, | ||
translateX: { start: 10, end: 100, unit: 'px' }, | ||
}, | ||
ScrollAxis.horizontal | ||
) | ||
).toEqual(true); | ||
}); | ||
}); | ||
}); | ||
describe('when axis is vertical and', () => { | ||
describe('when translateX provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ translateX: { start: 10, end: 100, unit: 'px' } }, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
describe('when translateY is provided', () => { | ||
test(`then it returns true`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ translateY: { start: 10, end: 100, unit: 'px' } }, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(true); | ||
}); | ||
}); | ||
describe('when translateY and translateX are provided', () => { | ||
test(`then it returns true`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
translateY: { start: 10, end: 100, unit: 'px' }, | ||
translateX: { start: 10, end: 100, unit: 'px' }, | ||
}, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(true); | ||
}); | ||
}); | ||
}); | ||
describe('when a target element is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{ targetElement: document.createElement('div') }, | ||
{}, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
test(`returns true when translate y is provided`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
translateY: { | ||
start: 10, | ||
end: 100, | ||
unit: 'px', | ||
describe('when a scale effect is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
scale: { start: 10, end: 100, unit: '' }, | ||
scaleX: { start: 10, end: 100, unit: '' }, | ||
scaleY: { start: 10, end: 100, unit: '' }, | ||
scaleZ: { start: 10, end: 100, unit: '' }, | ||
}, | ||
} | ||
) | ||
).toEqual(true); | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
test(`returns true when translate x and y is provided`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
translateX: { | ||
start: 10, | ||
end: 100, | ||
unit: 'px', | ||
describe('when a rotate effect is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
rotate: { start: 10, end: 100, unit: '' }, | ||
rotateX: { start: 10, end: 100, unit: '' }, | ||
rotateY: { start: 10, end: 100, unit: '' }, | ||
rotateZ: { start: 10, end: 100, unit: '' }, | ||
}, | ||
translateY: { | ||
start: 10, | ||
end: 100, | ||
unit: 'px', | ||
}, | ||
} | ||
) | ||
).toEqual(true); | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
test(`returns false when a target element is provided`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{ targetElement: document.createElement('div') }, | ||
{} | ||
) | ||
).toEqual(false); | ||
describe('when a opacity effect is provided', () => { | ||
test(`then it returns false`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ opacity: { start: 0, end: 1, unit: '' } }, | ||
ScrollAxis.vertical | ||
) | ||
).toEqual(false); | ||
}); | ||
}); | ||
test(`returns false for other effects`, () => { | ||
expect( | ||
getShouldScaleTranslateEffects( | ||
{}, | ||
{ | ||
scale: { | ||
start: 10, | ||
end: 100, | ||
unit: 'px', | ||
}, | ||
} | ||
) | ||
).toEqual(false); | ||
}); | ||
}); |
@@ -0,1 +1,2 @@ | ||
import { ScrollAxis, ValidScrollAxis } from '../types'; | ||
import { ParallaxElementConfig, ParallaxStartEndEffects } from '../types'; | ||
@@ -5,3 +6,4 @@ | ||
props: ParallaxElementConfig, | ||
effects: ParallaxStartEndEffects | ||
effects: ParallaxStartEndEffects, | ||
scrollAxis: ValidScrollAxis | ||
): boolean { | ||
@@ -12,3 +14,6 @@ if (props.rootMargin || props.targetElement) { | ||
if (!!effects.translateX || !!effects.translateY) { | ||
if ( | ||
(!!effects.translateX && scrollAxis === ScrollAxis.horizontal) || | ||
(!!effects.translateY && scrollAxis === ScrollAxis.vertical) | ||
) { | ||
return true; | ||
@@ -15,0 +20,0 @@ } |
@@ -10,3 +10,3 @@ import { ParsedValueEffect } from '..'; | ||
) { | ||
let { start: start, end: end, unit } = translate; | ||
let { start, end, unit } = translate; | ||
@@ -13,0 +13,0 @@ if (unit === '%') { |
export function createElementMock(properties = {}, methods = {}) { | ||
const element = document.createElement('div'); | ||
Object.keys(properties).map((key) => { | ||
Object.keys(properties).map(key => { | ||
Object.defineProperty(element, key, { | ||
@@ -11,3 +11,3 @@ // @ts-ignore | ||
Object.keys(methods).map((key) => { | ||
Object.keys(methods).map(key => { | ||
// @ts-ignore | ||
@@ -14,0 +14,0 @@ element[key] = methods[key]; |
@@ -42,3 +42,3 @@ import { | ||
// @ts-ignore | ||
out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || defaultUnit; | ||
out.unit = str.match(/[\d.\-+]*\s*(.*)/)[1] || defaultUnit; | ||
@@ -45,0 +45,0 @@ // @ts-expect-error |
@@ -7,2 +7,3 @@ export function testForPassiveScroll() { | ||
supportsPassiveOption = true; | ||
return true; | ||
}, | ||
@@ -9,0 +10,0 @@ }); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
394330
5222
37