__CAPGO_KEEP_0__ 插件:安装、设置 & 示例
返回插件
@capgo/capacitor-transitions
教程
@capgo/capacitor-transitions

Transitions

在不使用Ionic UI的情况下,添加Ionic风格的页面过渡和iOS边缘滑动返回手势

演示

动画 WebP 演示

一个 React 路由流程,展示 iOS 风格的 Capacitor 页面过渡作为动画 WebP 演示。

源文件
一个动画 React 页面过渡演示,展示在 Capacitor 风格的外壳中前进和后退导航
React 过渡流程

指南

过渡教程

在设备上测试

下载 Capgo 应用,然后扫描 QR code。

过渡插件预览二维码 code

使用 @capgo/capacitor-transitions

@capgo/capacitor-transitions 添加 Ionic 风格的路由过渡到 Capacitor 应用程序中,而不需要采用 Ionic UI。它在 web 层运行,保持您的现有路由,并且可以自动启用 iOS 边缘滑动返回手势,只在本机 Capacitor iOS 中有效。

安装

npm install @capgo/capacitor-transitions

没有本机同步步骤,因为该包不添加本机插件 code。

注册元素

import '@capgo/capacitor-transitions';

包裹您的页面

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

连接到路由器

在您的正常路由更新之前设置过渡方向:

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

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

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

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

React 子路径包含自定义元素的 JSX 类型定义。如果 TypeScript 还报告说 "does not exist on"、 cap-router-outlet 添加这个文件: JSX.IntrinsicElements对于 Vite、Create React App 和大多数 webpack React 应用,保持该文件在"is enough"下即可。对于 Next.js 或自定义 TypeScript 设置,请确保它被

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

启用滑动返回 src/ 使用 tsconfig.json:

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

来启用手势,只有当 __CAPGO_KEEP_0__ 报告一个原生 iOS 运行时时:

您也可以从 JavaScript 强制启用: swipe-gesture="auto" to enable the gesture only when Capacitor reports a native iOS runtime:

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

到按钮、滑块或抽屉上,不应启动边缘手势。

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

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

targetLanguage data-swipe-gesture-ignore protectedTokens

与原生导航一起使用

安装 @capgo/native-navigation 当原生层需要拥有导航栏或标签栏时:

npm install @capgo/native-navigation
npx cap sync

配置原生浏览器,然后将过渡的焦点保持在 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' },
  });
}

使用 cap-content 用于动画页面主体和原生导航 CSS 变量的边距:

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

不要将原生导航栏重复作为移动的网页头部。 @capgo/native-navigation 保持原生导航栏; @capgo/capacitor-transitions 在其下方动画页面内容。

完整参考

继续使用 @capgo/capacitor-transitions

如果您正在使用 使用 @capgo/capacitor-transitions 规划原生媒体和界面行为,连接它与 @capgo/capacitor-transitions @capgo/capacitor-transitions 的实现细节在 @capgo/capacitor-transitions 开始使用 @__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-transitions 的实现细节在 开始使用 使用 @capgo/capacitor-live-activities 原生能力在 使用 @capgo/capacitor-live-activities @capgo/capacitor-live-activities 为 @capgo/capacitor-live-activities 的实现细节 使用 @capgo/capacitor-video-player 为使用 @capgo/capacitor-video-player 的原生能力