1+ /**
2+ * Used in the function below to store references of clean-up functions.
3+ * Used to ensure only one transitionend function exists at any time.
4+ * @type {WeakMap<object, any> }
5+ */
6+ const animateStylesCleanupMap = new WeakMap ( ) ;
7+
18/**
29 * Fade out the given element.
310 * @param {Element } element
411 * @param {Number } animTime
512 * @param {Function|null } onComplete
613 */
714export function fadeOut ( element , animTime = 400 , onComplete = null ) {
15+ cleanupExistingElementAnimation ( element ) ;
816 animateStyles ( element , {
917 opacity : [ '1' , '0' ]
1018 } , animTime , ( ) => {
@@ -19,6 +27,7 @@ export function fadeOut(element, animTime = 400, onComplete = null) {
1927 * @param {Number } animTime
2028 */
2129export function slideUp ( element , animTime = 400 ) {
30+ cleanupExistingElementAnimation ( element ) ;
2231 const currentHeight = element . getBoundingClientRect ( ) . height ;
2332 const computedStyles = getComputedStyle ( element ) ;
2433 const currentPaddingTop = computedStyles . getPropertyValue ( 'padding-top' ) ;
@@ -41,6 +50,7 @@ export function slideUp(element, animTime = 400) {
4150 * @param {Number } animTime - Animation time in ms
4251 */
4352export function slideDown ( element , animTime = 400 ) {
53+ cleanupExistingElementAnimation ( element ) ;
4454 element . style . display = 'block' ;
4555 const targetHeight = element . getBoundingClientRect ( ) . height ;
4656 const computedStyles = getComputedStyle ( element ) ;
@@ -56,13 +66,6 @@ export function slideDown(element, animTime = 400) {
5666 animateStyles ( element , animStyles , animTime ) ;
5767}
5868
59- /**
60- * Used in the function below to store references of clean-up functions.
61- * Used to ensure only one transitionend function exists at any time.
62- * @type {WeakMap<object, any> }
63- */
64- const animateStylesCleanupMap = new WeakMap ( ) ;
65-
6669/**
6770 * Animate the css styles of an element using FLIP animation techniques.
6871 * Styles must be an object where the keys are style properties, camelcase, and the values
@@ -84,23 +87,28 @@ function animateStyles(element, styles, animTime = 400, onComplete = null) {
8487 }
8588 element . style . transition = null ;
8689 element . removeEventListener ( 'transitionend' , cleanup ) ;
90+ animateStylesCleanupMap . delete ( element ) ;
8791 if ( onComplete ) onComplete ( ) ;
8892 } ;
8993
9094 setTimeout ( ( ) => {
91- requestAnimationFrame ( ( ) => {
92- element . style . transition = `all ease-in-out ${ animTime } ms` ;
93- for ( let style of styleNames ) {
94- element . style [ style ] = styles [ style ] [ 1 ] ;
95- }
95+ element . style . transition = `all ease-in-out ${ animTime } ms` ;
96+ for ( let style of styleNames ) {
97+ element . style [ style ] = styles [ style ] [ 1 ] ;
98+ }
9699
97- if ( animateStylesCleanupMap . has ( element ) ) {
98- const oldCleanup = animateStylesCleanupMap . get ( element ) ;
99- element . removeEventListener ( 'transitionend' , oldCleanup ) ;
100- }
100+ element . addEventListener ( 'transitionend' , cleanup ) ;
101+ animateStylesCleanupMap . set ( element , cleanup ) ;
102+ } , 15 ) ;
103+ }
101104
102- element . addEventListener ( 'transitionend' , cleanup ) ;
103- animateStylesCleanupMap . set ( element , cleanup ) ;
104- } ) ;
105- } , 10 ) ;
105+ /**
106+ * Run the active cleanup action for the given element.
107+ * @param {Element } element
108+ */
109+ function cleanupExistingElementAnimation ( element ) {
110+ if ( animateStylesCleanupMap . has ( element ) ) {
111+ const oldCleanup = animateStylesCleanupMap . get ( element ) ;
112+ oldCleanup ( ) ;
113+ }
106114}
0 commit comments