Passer au contenu principal
Retour aux plugins
@capgo/capacitor-navigation-native
Tutoriel
@capgo/capacitor-navigation-native

Navigation native

Render native navbars, tabbars, and transition shells over a full-screen Capacitor WebView

Démonstration

Démonstrations WebP animées

Chrome de navigation native, sélection de la vignette, icônes SVG et options de style affichés en démonstrations WebP animées.

Ateliers source
Démonstration de shell de navigation native animée montrant le menu de navigation native, les vignettes et le contenu de la vue Web
Shell native
Flux de navigation native animé montrant la sélection de la vignette, la transition de push et le retour natif
Flux de tap
Démo d'icônes SVG natives animées montrant les icônes SVG en ligne, la teinte native, les étiquettes et la sélection de la vignette
Icônes SVG
Guide
Tutoriel sur la navigation native

Tester sur appareil

Téléchargez l'application __CAPGO_KEEP_0__, puis scannez le code QR __CAPGO_KEEP_1__.

Téléchargez __CAPGO_KEEP_0__ sur l'App Store

Download the Capgo app, then scan the QR code.

Lien QR de prévisualisation du plugin de navigation native code

En utilisant @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation renders native top navigation, bottom tab chrome, and route transition shells over a single full-screen Capacitor WebView. Your web framework still owns routes and content, while native owns the app frame.

Installer et synchroniser

npm install @capgo/capacitor-native-navigation
npx cap sync

Configurer la fenêtre native

import { NativeNavigation } from '@capgo/capacitor-native-navigation';

await NativeNavigation.configure({
  contentInsetMode: 'css',
  animationDuration: 360,
  colors: {
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
});

Afficher un menu de navigation native

await NativeNavigation.setNavbar({
  title: 'Inbox',
  subtitle: 'Native chrome',
  transparent: true,
  backButton: { visible: false },
  rightItems: [
    {
      id: 'compose',
      title: 'Compose',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',
      },
    },
  ],
});

Afficher un menu de onglets natifs

await NativeNavigation.setTabbar({
  selectedId: 'inbox',
  labelVisibilityMode: 'selected',
  icons: true,
  colors: {
    dynamic: true,
    tint: '#0f172a',
    inactiveTint: '#64748b',
  },
  tabs: [
    {
      id: 'inbox',
      title: 'Inbox',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="m4 13 4 4h8l4-4"/></svg>',
      },
    },
    {
      id: 'search',
      title: 'Search',
      icon: {
        svg: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m20 20-3-3"/></svg>',
      },
    },
  ],
});

Connecter les événements natifs à votre routeur

Les barres natives émettent une intention. Votre routeur effectue toujours le changement de route :

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

await NativeNavigation.addListener('navbarItemTap', ({ id }) => {
  if (id === 'compose') router.push('/compose');
});

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  router.push(`/${id}`);
});

Animer les changements de route

Utilisez une transaction de transition autour de la mise à jour de votre route web normale :

const transition = await NativeNavigation.beginTransition({
  direction: 'forward',
});

router.push('/message/42');
await router.ready?.();

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

await NativeNavigation.finishTransition({
  id: transition.id,
  direction: 'forward',
});

Ajoutez une transition de zoom

Utilisez les assistants de zoom pour les routes qui s'ouvrent à partir d'un carte, d'un élément de grille ou d'une prévisualisation de médias.

import { beginZoomTransition, finishZoomTransition } from '@capgo/capacitor-native-navigation';

const card = document.querySelector('[data-message-card]');
if (card) {
  const transition = await beginZoomTransition(card, { cornerRadius: 18 });

  router.push('/message/42');
  await router.ready?.();

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

  await finishZoomTransition(undefined, {
    id: transition.id,
    cornerRadius: 18,
  });
}

Faites du contenu avec des insets natifs

Lorsque contentInsetMode est css, le plugin écrit des variables CSS pour les barres natives :

.page {
  padding-top: var(--cap-native-navigation-top);
  padding-bottom: var(--cap-native-navigation-bottom);
}

Choix d'icônes

Les icônes sont descripteurs natifs, pas des nœuds React ou Vue. Utilisez SVG lorsque vous ne voulez pas charger des assets natifs :

const icon = {
  svg: '<svg viewBox="0 0 24 24"><path d="M3 10.5 12 3l9 7.5"/></svg>',
  template: true,
  ios: { sfSymbol: 'house.fill' },
  android: { resource: 'ic_menu_view' },
};

SVG en ligne prend en charge path, line, polyline, polygon, circle, et rectcouvre les ensembles d'icônes courants comme Lucide et Feather.

Combinez avec @capgo/capacitor-transitions

Utilisez la navigation native pour la barre de navigation native, la barre d'onglets, les insets de zone de sécurité et les événements d'intention native. Utilisez @capgo/capacitor-transitions pour la pile de pages WebView située sous ce chrome natif.

npm install @capgo/capacitor-native-navigation @capgo/capacitor-transitions
npx cap sync

Initialisez les deux packages une seule fois :

import { NativeNavigation } from '@capgo/capacitor-native-navigation';
import '@capgo/capacitor-transitions';
import { initTransitions, setupRouterOutlet, setDirection } from '@capgo/capacitor-transitions/react';

initTransitions({ platform: 'auto' });

const outlet = document.querySelector('cap-router-outlet');
if (outlet) {
  setupRouterOutlet(outlet, { platform: 'auto', swipeGesture: 'auto' });
}

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

Conservez la sortie de transition axée sur les pages, et non dupliquer les barres web :

<cap-router-outlet platform="auto" swipe-gesture="auto">
  <cap-page>
    <cap-content slot="content" fullscreen>
      <main class="page">Inbox content</main>
    </cap-content>
  </cap-page>
</cap-router-outlet>

Dirigez les deux packages à partir des mêmes actions de routage :

async function openMessage(id: string) {
  setDirection('forward');
  await router.push(`/messages/${id}`);
  await NativeNavigation.setNavbar({
    title: 'Message',
    backButton: { visible: true, title: 'Inbox' },
  });
}

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

await NativeNavigation.addListener('tabSelect', ({ id }) => {
  setDirection('root');
  router.push(`/${id}`);
});

Sélectionnez une couche d'animation par changement de route. Laissez @capgo/capacitor-transitions animer les poussées de page normales, et utilisez les aides de zoom de la navigation native uniquement pour les routes partagées ou de zoom.

Référence complète

Continuez à partir de l'utilisation de @capgo/capacitor-native-navigation

Si vous utilisez L'utilisation de @capgo/capacitor-native-navigation pour planifier le comportement des médias et de l'interface native, connectez-l’avec @capgo/capacitor-native-navigation pour les détails d'implémentation dans @capgo/capacitor-native-navigation, Prise en main pour les détails d'implémentation dans Prise en main, L'utilisation de @capgo/capacitor-live-activities pour la capacité native dans L'utilisation de @capgo/capacitor-live-activities, @capgo/capacitor-live-activities pour les détails d'implémentation dans @capgo/capacitor-live-activités, et En utilisant @capgo/capacitor-video-joueur pour la capacité native dans En utilisant @capgo/capacitor-video-joueur.