Skip to content

Instantly share code, notes, and snippets.

@focus-at
Last active March 13, 2023 09:41
Show Gist options
  • Save focus-at/971dde6e767aa47aa71b4fc3db0c9cac to your computer and use it in GitHub Desktop.
Save focus-at/971dde6e767aa47aa71b4fc3db0c9cac to your computer and use it in GitHub Desktop.

Revisions

  1. focus-at revised this gist Mar 13, 2023. 1 changed file with 19 additions and 19 deletions.
    38 changes: 19 additions & 19 deletions page-transition.ts
    Original file line number Diff line number Diff line change
    @@ -3,31 +3,31 @@ import { beforeNavigate, afterNavigate } from '$app/navigation';
    export const usePageTransition = () => {
    let resolver:any;

    const afterNavigateCallback = () => {
    // Хотя afterNavigate выполняется после afterNavigate, resolver может отсутствовать
    if (resolver) {
    resolver();
    resolver = null;
    }
    }
    const afterNavigateCallback = () => {
    // Хотя afterNavigate выполняется после afterNavigate, resolver может отсутствовать
    if (resolver) {
    resolver();
    resolver = null;
    }
    }

    beforeNavigate(async ({ from, to, type }) => {
    const isSamePage = from?.url.href == to?.url.href;
    const isSamePage = from?.url.href == to?.url.href;

    // FIXME на данный момент работает только popstate навигация и не работает link
    if (type != 'popstate') return;
    // FIXME на данный момент работает только popstate навигация и не работает link
    // if (type != 'popstate') return;

    // Выходим если не поддерживается, выходим если это таже страница
    if (!document.startViewTransition || isSamePage) return;
    // Выходим если не поддерживается, выходим если это таже страница
    if (!document.startViewTransition || isSamePage) return;

    // Создаем промис который разрешим после завешения навигации
    const navigationEndPromise = new Promise(resolve => resolver = resolve);
    // Создаем промис который разрешим после завешения навигации
    const navigationEndPromise = new Promise(resolve => resolver = resolve);

    // Запускаем переход и ждем завершения навигации
    document.startViewTransition(async () => {
    await navigationEndPromise;
    });
    // Запускаем переход и ждем завершения навигации
    document.startViewTransition(async () => {
    await navigationEndPromise;
    });
    });

    afterNavigate(afterNavigateCallback);
    afterNavigate(afterNavigateCallback);
    };
  2. focus-at revised this gist Mar 13, 2023. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions +layout.svelte
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    ...
    // Импортируем и запускаем
    // Импортируем и запускаем
    import { usePageTransition } from '$lib/page-transition';
    usePageTransition();
    usePageTransition();
    ...
  3. focus-at revised this gist Mar 13, 2023. 3 changed files with 3 additions and 3 deletions.
    2 changes: 1 addition & 1 deletion +layout.svelte
    Original file line number Diff line number Diff line change
    @@ -2,4 +2,4 @@
    // Импортируем и запускаем
    import { usePageTransition } from '$lib/page-transition';
    usePageTransition();
    ...
    ...
    2 changes: 1 addition & 1 deletion page-transition.ts
    Original file line number Diff line number Diff line change
    @@ -30,4 +30,4 @@ export const usePageTransition = () => {
    });

    afterNavigate(afterNavigateCallback);
    };
    };
    2 changes: 1 addition & 1 deletion style.css
    Original file line number Diff line number Diff line change
    @@ -49,4 +49,4 @@

    .back-transition::view-transition-new(root) {
    animation-name: fade-in, slide-from-left;
    }
    }
  4. focus-at revised this gist Mar 13, 2023. No changes.
  5. focus-at created this gist Mar 13, 2023.
    5 changes: 5 additions & 0 deletions +layout.svelte
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    ...
    // Импортируем и запускаем
    import { usePageTransition } from '$lib/page-transition';
    usePageTransition();
    ...
    33 changes: 33 additions & 0 deletions page-transition.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    import { beforeNavigate, afterNavigate } from '$app/navigation';

    export const usePageTransition = () => {
    let resolver:any;

    const afterNavigateCallback = () => {
    // Хотя afterNavigate выполняется после afterNavigate, resolver может отсутствовать
    if (resolver) {
    resolver();
    resolver = null;
    }
    }

    beforeNavigate(async ({ from, to, type }) => {
    const isSamePage = from?.url.href == to?.url.href;

    // FIXME на данный момент работает только popstate навигация и не работает link
    if (type != 'popstate') return;

    // Выходим если не поддерживается, выходим если это таже страница
    if (!document.startViewTransition || isSamePage) return;

    // Создаем промис который разрешим после завешения навигации
    const navigationEndPromise = new Promise(resolve => resolver = resolve);

    // Запускаем переход и ждем завершения навигации
    document.startViewTransition(async () => {
    await navigationEndPromise;
    });
    });

    afterNavigate(afterNavigateCallback);
    };
    52 changes: 52 additions & 0 deletions style.css
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    @keyframes fade-in {
    from { opacity: 0; }
    }

    @keyframes fade-out {
    to { opacity: 0; }
    }

    @keyframes slide-from-right {
    from { transform: translateX(30px); }
    }

    @keyframes slide-to-left {
    to { transform: translateX(-30px); }
    }

    @keyframes slide-from-left {
    to { transform: translateX(-30px); }
    }

    @keyframes slide-to-right {
    to { transform: translateX(30px); }
    }

    ::view-transition-old(root) {
    animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
    }

    ::view-transition-new(root) {
    animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
    }

    ::view-transition-old(root) {
    animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
    300ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
    }

    ::view-transition-new(root) {
    animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in, 300ms
    cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
    }

    /* Overrides for 'back' transitions */
    .back-transition::view-transition-old(root) {
    animation-name: fade-out, slide-to-right;
    }

    .back-transition::view-transition-new(root) {
    animation-name: fade-in, slide-from-left;
    }