UNPKG

@coreui/vue

Version:

UI Components Library for Vue.js

66 lines (52 loc) 1.75 kB
const execute = (callback: () => void) => { if (typeof callback === 'function') { callback() } } export const executeAfterTransition = ( callback: () => void, transitionElement: HTMLElement, waitForTransition = true, ) => { if (!waitForTransition) { execute(callback) return } const durationPadding = 5 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding let called = false const handler = ({ target }: { target: any }) => { if (target !== transitionElement) { return } called = true transitionElement.removeEventListener('transitionend', handler) execute(callback) } transitionElement.addEventListener('transitionend', handler) setTimeout(() => { if (!called) { triggerTransitionEnd(transitionElement) } }, emulatedDuration) } export const getTransitionDurationFromElement = (element: HTMLElement) => { if (!element) { return 0 } // Get transition-duration of the element let { transitionDuration, transitionDelay } = window.getComputedStyle(element) const floatTransitionDuration = Number.parseFloat(transitionDuration) const floatTransitionDelay = Number.parseFloat(transitionDelay) // Return 0 if element or transition duration is not found if (!floatTransitionDuration && !floatTransitionDelay) { return 0 } // If multiple durations are defined, take the first transitionDuration = transitionDuration.split(',')[0] transitionDelay = transitionDelay.split(',')[0] return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * 1000 } export const triggerTransitionEnd = (element: HTMLElement) => { element.dispatchEvent(new Event('transitionend')) }