UNPKG

press-plus

Version:
109 lines (84 loc) 2.6 kB
import { consoleInfo } from 't-comm/es/log/log'; // #ifdef H5 import './slide-in-right.scss'; // #endif export type TMode = 'fade-in' | 'slide-in-right' | 'slide-in-left' | 'slide-in-top' | 'slide-in-bottom' | 'zoom-out'; export type NavType = 'push' | 'replace' | 'back' | ''; export interface IOptions { mode?: TMode; duration?: number; router: any; log?: boolean; selector?: string; } export const navigateData = { NAV_TYPE: '', setNavType(navType: NavType) { this.NAV_TYPE = navType; }, getNavType() { return this.NAV_TYPE; }, }; const navigateMode = { push: 'slide-in-right', replace: 'slide-in-right', back: 'slide-in-right', '': '', }; export const pageAnimation = (options: IOptions = { mode: 'slide-in-right', duration: 300, router: {}, log: false, selector: 'uni-app', }) => { const { router, duration = 300, log = false, selector = 'uni-app' } = options; let pageClass: DOMTokenList | undefined; const animate: { mode: TMode | null; duration: number; } = { mode: null, duration }; const timers: { before: any, after: any } = { before: 0, after: 0 }; router.beforeEach((to: any, from: any, next: Function) => { const navType = navigateData.getNavType() as NavType; consoleInfo(log, 'navType', navType); consoleInfo(log, 'router', to, from, next); clearTimeout(timers.before); clearTimeout(timers.after); pageClass = document.querySelector(selector)?.classList; const navMode = navigateMode[navType] as TMode; if (!pageClass || !navMode) return next(); if (navMode) { animate.mode = navMode; pageClass.remove('back', `page-${animate.mode}--out`, `page-${animate.mode}--in`); const className = `page-${animate.mode}--out`; pageClass.add(className); // $app.style = `--redirect-duration: ${animate.duration}ms`; if (navType === 'back') { pageClass.add('back'); } timers.before = setTimeout(() => { if (pageClass) { pageClass.remove(className); } next(); }, animate.duration - 50); // 减去 50,不然会闪动 } }); router.afterEach(() => { if (!animate.mode || !pageClass) return; clearTimeout(timers.after); const className = `page-${animate.mode}--in`; pageClass.add(className); timers.after = setTimeout(() => { if (pageClass) { pageClass.remove(className); pageClass.remove('back'); } }, animate.duration); navigateData.setNavType(''); animate.mode = null; }); }; export default pageAnimation;