Skip to content
This repository was archived by the owner on Apr 14, 2020. It is now read-only.

Commit 68d5b60

Browse files
author
Michael Dougall
committed
feat(move): adds new prop to set stacking context on move motion
1 parent 143a40a commit 68d5b60

5 files changed

Lines changed: 38 additions & 25 deletions

File tree

packages/core/src/__docs__/2-getting-started/docs.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ and `false` when you consider it to be hidden.
319319
<Styled.Root>
320320
<Styled.ImageContainer>
321321
<Motion name={src} in={inn}>
322-
<Move>
322+
<Move zIndex={89}>
323323
{({ ref, style }) => (
324324
<Styled.Img
325325
src={src}
@@ -355,7 +355,7 @@ and `false` when you consider it to be hidden.
355355
</div>
356356

357357
<Motion name={src}>
358-
<Move>
358+
<Move zIndex={89} createStackingContext>
359359
{({ ref, style }) => <Styled.PageImage src={src} ref={ref} style={style} />}
360360
</Move>
361361
</Motion>

packages/core/src/lib/dom.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
export function eventListener<K extends keyof HTMLElementEventMap>(
2+
element: HTMLElement,
3+
event: K,
4+
cb: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any,
5+
options?: boolean | AddEventListenerOptions | undefined
6+
) {
7+
element.addEventListener<K>(event, cb, options);
8+
return () => element.removeEventListener(event, cb, options);
9+
}
10+
111
export function getDocumentScroll() {
212
const scrollTop =
313
document.documentElement && document.documentElement.scrollTop

packages/core/src/motions/FadeMove/index.tsx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export default class FadeMove extends React.Component<FadeMoveProps> {
7373
transformOrigin: '0 0',
7474
transform: 'translate3d(0, 0, 0) scale3d(1, 1, 1)',
7575
opacity: 1,
76-
// Elminate any margins so they don't affect the transition.
76+
// Eliminate any margins so they don't affect the transition.
7777
margin: 0,
7878
height: `${originTarget.size.height}px`,
7979
width: `${originTarget.size.width}px`,
@@ -87,14 +87,7 @@ export default class FadeMove extends React.Component<FadeMoveProps> {
8787
});
8888
};
8989

90-
beforeAnimate: MotionCallback = (data, onFinish, setChildProps) => {
91-
setChildProps({
92-
style: prevStyle => ({
93-
...prevStyle,
94-
opacity: 0,
95-
}),
96-
});
97-
90+
beforeAnimate: MotionCallback = (data, onFinish) => {
9891
onFinish();
9992

10093
return this.renderMotion(data);
@@ -105,17 +98,6 @@ export default class FadeMove extends React.Component<FadeMoveProps> {
10598
return this.renderMotion(data, { moveToTarget: true });
10699
};
107100

108-
afterAnimate: MotionCallback = (_, onFinish, setChildProps) => {
109-
setChildProps({
110-
style: prevStyle => ({
111-
...prevStyle,
112-
opacity: 1,
113-
}),
114-
});
115-
116-
onFinish();
117-
};
118-
119101
render() {
120102
const { children } = this.props;
121103

@@ -126,7 +108,6 @@ export default class FadeMove extends React.Component<FadeMoveProps> {
126108
payload: {
127109
beforeAnimate: this.beforeAnimate,
128110
animate: this.animate,
129-
afterAnimate: this.afterAnimate,
130111
},
131112
}}
132113
>

packages/core/src/motions/Move/__docs__/docs.mdx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,10 @@ import { Move } from '@element-motion/core';
4747
## Props
4848

4949
<Props of={Move} />
50+
51+
## Gotchas
52+
53+
Noticing that your in transit element isn't being stacked correctly?
54+
You'll want to create a [stacking context](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) by opting into `createStackingContext` which will set `position: relative` to the inflight element.
55+
56+
This should fix your stacking problems.

packages/core/src/motions/Move/index.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ export interface MoveProps extends CollectorChildrenProps {
5757
* Defaults to true.
5858
*/
5959
scaleY?: boolean;
60+
61+
/**
62+
* Will set "position: relative" on the element during a transition.
63+
* Useful for creating a stacking context to position the element where you want in the stack.
64+
* Use "zIndex" prop to set the appropriate position in the stack.
65+
*/
66+
createStackingContext?: boolean;
6067
}
6168

6269
export default class Move extends React.Component<MoveProps> {
@@ -74,7 +81,15 @@ export default class Move extends React.Component<MoveProps> {
7481
abort = noop;
7582

7683
beforeAnimate: MotionCallback = (data, onFinish, setChildProps) => {
77-
const { zIndex, useFocalTarget, transformX, transformY, scaleX, scaleY } = this.props;
84+
const {
85+
zIndex,
86+
useFocalTarget,
87+
transformX,
88+
transformY,
89+
scaleX,
90+
scaleY,
91+
createStackingContext,
92+
} = this.props;
7893

7994
if (process.env.NODE_ENV === 'development') {
8095
throwIf(
@@ -102,7 +117,7 @@ export default class Move extends React.Component<MoveProps> {
102117
style: prevStyles => ({
103118
...prevStyles,
104119
zIndex,
105-
opacity: 1,
120+
position: createStackingContext ? 'relative' : undefined,
106121
transformOrigin: '0 0',
107122
visibility: 'visible',
108123
willChange: combine('transform')(prevStyles.willChange),

0 commit comments

Comments
 (0)