Lebih cepat ke konten utama
Kembali ke plugin
Transisi/@capgo/capacitor
Tutorial
Transisi/@capgo/capacitor

Transisi

Tambahkan transisi halaman gaya Ionic dan sentuhan balik iOS tanpa antarmuka Ionic

Demo

Contoh Animasi WebP

Aliran Penerapan React yang menampilkan transisi halaman iOS-style Capacitor sebagai contoh animasi WebP.

Sumber Aset
Contoh animasi transisi halaman React yang menampilkan navigasi maju dan mundur dalam shell Capacitor-style
Aliran Transisi React

Petunjuk

Tutorial Transisi

Menggunakan @capgo/capacitor-transisi

@capgo/capacitor-transitions menambahkan transisi rute Ionic-style ke aplikasi Capacitor tanpa menerima UI Ionic. Ini berjalan di lapisan web, menjaga router yang ada, dan dapat mengaktifkan secara otomatis gestur gesek samping iOS hanya di dalam Capacitor iOS native.

Instal

npm install @capgo/capacitor-transitions

Tidak ada langkah sinkron native karena paket ini tidak menambahkan plugin native code.

Daftarkan elemen-elemen

import '@capgo/capacitor-transitions';

Bungkus halaman-halaman Anda

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-header slot="header">
      <h1>Inbox</h1>
    </cap-header>

    <cap-content slot="content">
      <button>Open message</button>
    </cap-content>

    <cap-footer slot="footer">
      <nav>Tabs</nav>
    </cap-footer>
  </cap-page>
</cap-router-outlet>

Hubungkan ke router

Tetapkan arah transisi sebelum Anda memperbarui rute normal:

import { setDirection } from '@capgo/capacitor-transitions/react';

setDirection('forward');
router.push('/message/42');

setDirection('back');
router.back();

Contoh React

import { useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import { initTransitions, setDirection, setupPage, setupRouterOutlet } from '@capgo/capacitor-transitions/react';
import '@capgo/capacitor-transitions';

initTransitions({ platform: 'auto' });

export function AppShell() {
  const outletRef = useRef<HTMLElement>(null);

  useEffect(() => {
    if (!outletRef.current) return;
    setupRouterOutlet(outletRef.current, { platform: 'auto', swipeGesture: 'auto' });
  }, []);

  return <cap-router-outlet ref={outletRef}>{/* routes */}</cap-router-outlet>;
}

export function InboxPage() {
  const navigate = useNavigate();
  const pageRef = useRef<HTMLElement>(null);

  useEffect(() => {
    if (!pageRef.current) return;
    return setupPage(pageRef.current);
  }, []);

  return (
    <cap-page ref={pageRef}>
      <cap-header slot="header">
        <h1>Inbox</h1>
      </cap-header>
      <cap-content slot="content">
        <button
          onClick={() => {
            setDirection('forward');
            navigate('/message/42');
          }}
        >
          Open message
        </button>
      </cap-content>
    </cap-page>
  );
}

Subpath React termasuk tipe JSX untuk elemen-elemen kustom. Jika TypeScript masih melaporkan bahwa cap-router-outlet tidak ada pada JSX.IntrinsicElements, tambahkan file ini:

// src/capgo-transitions.d.ts
import '@capgo/capacitor-transitions/react';

Untuk Vite, Create React App, dan sebagian besar aplikasi React webpack, menjaga file tersebut di src/ sudah cukup. Untuk Next.js atau pengaturan TypeScript kustom, pastikan termasuk dalam daftar tersebut oleh tsconfig.json:

{
  "include": ["src", "src/capgo-transitions.d.ts"]
}

Aktifkan swipe back

Gunakan swipe-gesture="auto" untuk mengaktifkan gerakan hanya ketika Capacitor melaporkan runtime iOS native:

<cap-router-outlet swipe-gesture="auto"></cap-router-outlet>

Anda juga dapat memaksanya dari JavaScript:

const outlet = document.querySelector('cap-router-outlet');

outlet?.setSwipeGesture(true);
outlet?.setSwipeGesture(false);
outlet?.setSwipeGesture('auto');

Gerakan mengikuti jari selama transisi, kemudian menyelesaikan atau membatalkan ketika pengguna melepaskannya. Tambahkan data-swipe-gesture-ignore pada tombol, slider, atau drawer yang tidak boleh memulai gerakan edge.

Gunakan bersama navigasi native

Pasang @capgo/native-navigation ketika layer native harus menguasai navbar atau tabbar:

npm install @capgo/native-navigation
npx cap sync

Konfigurasi chrome native, kemudian tahan transisi fokus pada halaman WebView:

import { NativeNavigation } from '@capgo/native-navigation';
import { setDirection } from '@capgo/capacitor-transitions/react';
import { router } from './router';

await NativeNavigation.configure({
  contentInsetMode: 'css',
});

await NativeNavigation.setNavbar({
  title: 'Inbox',
  backButton: { visible: false },
});

await NativeNavigation.addListener('navbarBack', () => {
  setDirection('back');
  router.back();
});

async function openMessage(id: string) {
  setDirection('forward');
  router.push(`/message/${id}`);

  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });
}

Gunakan cap-content untuk tubuh halaman animasi dan variabel CSS native-navigasi untuk insets:

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-content slot="content" fullscreen>
      <main class="native-page">Inbox content</main>
    </cap-content>
  </cap-page>
</cap-router-outlet>
.native-page {
  padding-top: var(--cap-native-navigation-top);
  padding-bottom: var(--cap-native-navigation-bottom);
}

Jangan duplikasi navbar asli sebagai header web yang bergerak. @capgo/native-navigation menjaga bar asli; @capgo/capacitor-transitions menggerakkan konten halaman di bawahnya.

Referensi Lengkap

Teruskan dari Menggunakan @capgo/capacitor-transisi

Jika Anda menggunakan Menggunakan @capgo/capacitor-transisi untuk merencanakan perilaku media dan antarmuka asli, hubungkannya dengan @capgo/capacitor-transisi untuk detail implementasi di @capgo/capacitor-transisi, Mulai untuk detail implementasi di Mulai, Menggunakan @capgo/capacitor-aktivitas-hidup untuk kemampuan asli di Menggunakan @capgo/capacitor-aktivitas-hidup, @capgo/capacitor-aktivitas-hidup untuk detail implementasi di @capgo/capacitor-aktivitas-hidup, dan Menggunakan @capgo/capacitor-pemain-video untuk kemampuan asli di Menggunakan @capgo/capacitor-pemain-video.