You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ant-design-vue/components/_util/openAnimation.js

50 lines
1.2 KiB

import cssAnimation from './css-animation'
import getRequestAnimationFrame, { cancelRequestAnimationFrame } from './getRequestAnimationFrame'
const reqAnimFrame = getRequestAnimationFrame()
function animate (node, show, done) {
let height
let requestAnimationFrameId
return cssAnimation(node, 'ant-motion-collapse', {
start () {
if (!show) {
node.style.height = `${node.offsetHeight}px`
node.style.opacity = 1
} else {
height = node.offsetHeight
node.style.height = 0
node.style.opacity = 0
}
},
active () {
if (requestAnimationFrameId) {
cancelRequestAnimationFrame(requestAnimationFrameId)
}
requestAnimationFrameId = reqAnimFrame(() => {
node.style.height = `${show ? height : 0}px`
node.style.opacity = show ? 1 : 0
})
},
end () {
if (requestAnimationFrameId) {
cancelRequestAnimationFrame(requestAnimationFrameId)
}
node.style.height = ''
node.style.opacity = ''
done()
},
})
}
const animation = {
enter (node, done) {
return animate(node, true, done)
},
leave (node, done) {
return animate(node, false, done)
},
}
export default animation