import { canIUseAnimate } from '../common/version'; import { getRect } from '../common/utils'; function useAnimate(context, expanded, mounted, height) { const selector = '.van-collapse-item__wrapper'; if (expanded) { context.animate(selector, [ { height: 0, ease: 'ease-in-out', offset: 0 }, { height: `${height}px`, ease: 'ease-in-out', offset: 1 }, { height: `auto`, ease: 'ease-in-out', offset: 1 }, ], mounted ? 300 : 0, () => { context.clearAnimation(selector); }); return; } context.animate(selector, [ { height: `${height}px`, ease: 'ease-in-out', offset: 0 }, { height: 0, ease: 'ease-in-out', offset: 1 }, ], 300, () => { context.clearAnimation(selector); }); } function useAnimation(context, expanded, mounted, height) { const animation = wx.createAnimation({ duration: 0, timingFunction: 'ease-in-out', }); if (expanded) { if (height === 0) { animation.height('auto').top(1).step(); } else { animation .height(height) .top(1) .step({ duration: mounted ? 300 : 1, }) .height('auto') .step(); } context.setData({ animation: animation.export(), }); return; } animation.height(height).top(0).step({ duration: 1 }).height(0).step({ duration: 300, }); context.setData({ animation: animation.export(), }); } export function setContentAnimate(context, expanded, mounted) { getRect(context, '.van-collapse-item__content') .then((rect) => rect.height) .then((height) => { canIUseAnimate() ? useAnimate(context, expanded, mounted, height) : useAnimation(context, expanded, mounted, height); }); }