메인 콘텐츠로 바로 가기
플러그인으로 돌아가기
@capgo/capacitor-native-navigation
튜토리얼
@capgo/capacitor-native-navigation

네이티브 네비게이션

네이티브 네비게이션을 사용하여 풀 스크린 Capacitor WebView 위에 네비게이션 바, 탭 바, 전환 셸을 렌더링합니다.

데모

Animated WebP 데모

WebP 애니메이션으로 렌더링 된 네이티브 네비게이션, 탭 선택, SVG 아이콘 및 스타일링 옵션.

원본 자산
네이티브 네비게이션 셸 데모
네이티브 네비게이션 바, 탭 및 WebView 콘텐츠를 보여주는 애니메이션 네이티브 셸 데모.
Animated native navigation tap flow showing tab selection, push transition, and native back
Tap flow
Animated native SVG icon demo showing inline SVG icons, native tint, labels, and tab selection
SVG icons
Animated native navigation options demo showing dynamic colors, selected labels, badges, and zoom transitions
Styling options

Guide

Native Navigation 사용하기

Using @capgo/capacitor-native-navigation

@capgo/capacitor-native-navigation Capacitor WebView 위에 native top navigation, bottom tab chrome, route transition shells을 렌더링합니다. 웹 프레임워크는 여전히 경로와 콘텐츠를 소유하고 있지만 native는 앱 프레임을 소유합니다.

설치 및 동기화

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

자연스러운 프레임 구성

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

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

자연스러운 네비게이션 바 렌더링

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>',
      },
    },
  ],
});

자연스러운 탭바 렌더링

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>',
      },
    },
  ],
});

네이티브 이벤트를 라우터에 연결

네이티브 바는 의도(intent)를 내뿜습니다. 그러나 라우터는 여전히 경로 변경을 수행합니다:

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}`);
});

경로 변경 애니메이션

일반 웹 경로 업데이트 주변에 전환 거래를 사용하세요:

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',
});

줌 전환 추가

카드, 그리드 아이템, 미디어 프리뷰에서 열리는 경로에 대해 전환 도우미를 사용하세요.

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,
  });
}

네이티브 인셋으로 콘텐츠를 패딩

그렇다면 contentInsetMode 그렇다면 css그렇다면 CSS 변수를 네이티브 바에 쓰기 위해 플러그인이 작동합니다:

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

아이콘 선택

아이콘은 React 또는 Vue 노드가 아닌 원시 설명자입니다. 원시 자산을 패키지하지 않으려면 SVG를 사용하십시오:

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는 path, line, polyline, polygon, circle, 및 rect,를 지원합니다. 이는 Lucide 및 Feather와 같은 일반적인 아이콘 세트를 커버합니다.

@capgo/capacitor-transitions와 combine합니다.

Native Navigation을 사용하여 원시 네비게이션 바, 탭 바, 안전 영역 인셋 및 원시 인텐트 이벤트를 사용하십시오. WebView 페이지 스택은 그 아래에 원시 크롬을 사용하십시오. @capgo/capacitor-transitions 두 패키지를 한 번만 초기화하십시오:

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

페이지에 전환 출력을 유지하고 웹 바를 중복하지 않도록 하십시오:

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',
});

같은 라우터 액션으로 두 패키지를 제어하십시오:

<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>

한 번에 하나의 애니메이션 레이어를 선택하십시오.

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}`);
});

페이지 전환 시 @capgo/capacitor-transitions animate normal page pushes, and use Native Navigation의 zoom helpers만 shared-element 또는 zoom routes에 사용하세요.

Full Reference

Using @capgo/capacitor-native-navigation

이 기능을 사용 중이라면 @capgo/capacitor-native-navigation @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-native-navigation @capgo/capacitor-native-navigation for the implementation detail in @capgo/capacitor-native-navigation, Using @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-native-navigation for the implementation detail in Getting Started, Using @capgo/capacitor-live-activities for the native capability in Using @capgo/capacitor-live-activities, @capgo/capacitor-live-activities for the implementation detail in @capgo/capacitor-live-activities, and Using @capgo/capacitor-video-player for the native capability in Using @capgo/capacitor-video-player.