@@ -5,8 +5,18 @@ import {
55 Element ,
66} from 'parallax-controller' ;
77import { useController } from '../hooks/useController' ;
8+ import { removeUndefinedObjectKeys } from '../utils/removeUndefinedObjectKeys' ;
89
910export interface ParallaxProps {
11+ /**
12+ * A number to slowdown `n < 0` or speed up `n > 0` the scroll speed of an element
13+ *
14+ * Example:
15+ *
16+ * x={-1}
17+ *
18+ */
19+ speed ?: number ;
1020 /**
1121 * Start and end translation on x-axis in % or px. If no unit is passed percent is assumed. Percent is based on the elements width.
1222 *
@@ -121,19 +131,39 @@ export function Parallax(props: PropsWithChildren<ParallaxProps>) {
121131 useVerifyController ( controller ) ;
122132
123133 function _getElementOptions ( ) : CreateElementOptions {
134+ const useSpeedProp = typeof props . speed !== 'undefined' ;
135+ const isHorizontal = controller . scrollAxis == 'horizontal' ;
136+ const isVertical = controller . scrollAxis == 'vertical' ;
137+
138+ let translateX = props . x ;
139+ let translateY = props . y ;
140+
141+ if ( useSpeedProp && isHorizontal ) {
142+ translateX = [
143+ `${ ( props . speed || 0 ) * 10 } px` ,
144+ `${ ( props . speed || 0 ) * - 10 } px` ,
145+ ] ;
146+ }
147+
148+ if ( useSpeedProp && isVertical ) {
149+ translateY = [
150+ `${ ( props . speed || 0 ) * 10 } px` ,
151+ `${ ( props . speed || 0 ) * - 10 } px` ,
152+ ] ;
153+ }
154+
124155 return {
125156 elInner : refInner . current ,
126157 elOuter : refOuter . current ,
127- props : {
158+ props : removeUndefinedObjectKeys ( {
128159 disabled : props . disabled ,
129- // Defaults set in Parallax.defaultProps
130- translateX : props . x ,
131- translateY : props . y ,
160+ translateX,
161+ translateY,
132162 rotate : props . rotate ,
133163 rotateX : props . rotateX ,
134164 rotateY : props . rotateY ,
135165 rotateZ : props . rotateZ ,
136- } ,
166+ } ) ,
137167 } ;
138168 }
139169
@@ -167,6 +197,7 @@ export function Parallax(props: PropsWithChildren<ParallaxProps>) {
167197 props . rotateX ,
168198 props . rotateY ,
169199 props . rotateZ ,
200+ props . speed ,
170201 ] ) ;
171202
172203 const Outer = props . tagOuter ;
0 commit comments