跳过主要内容
返回插件
@capgo/capacitor-transitions
教程
@capgo/capacitor-transitions

过渡

添加Ionic风格页面过渡和iOS边缘滑动返回手势,且无需Ionic UI

演示

WebP 动画演示

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

源资产
一个 React 页面过渡演示,展示在 Capacitor 风格的 shell 中的前进和后退导航
React 过渡流

指南

过渡教程

在设备上测试

下载Capgo应用,然后扫描code二维码

过渡插件预览二维码code

使用@capgo/capacitor-transitions

@capgo/capacitor-transitions 为不采用Ionic UI的Capacitor应用添加Ionic风格的路由过渡。它在web层运行,保留您的现有路由,并且可以在原生Capacitor iOS中自动启用一个iOS边缘滑动返回手势。

安装

npm install @capgo/capacitor-transitions

There is no native sync step because the package does not add native plugin 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仍然报告 cap-router-outlet 不存在于 JSX.IntrinsicElements,请添加以下文件:

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

对于Vite、Create React App和大多数webpack React应用,保持该文件在 src/ 下面即可。对于Next.js或自定义TypeScript设置,请确保它被包含在 tsconfig.json:

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

启用滑动返回

使用 swipe-gesture="auto" 仅在Capacitor报告本机iOS运行时时启用手势:

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

您也可以从JavaScript强制启用:

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

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

手势在过渡期间跟随手指,然后在用户释放时完成或取消。添加 data-swipe-gesture-ignore 到不应启动边缘手势的按钮、滑块或抽屉。

与本机导航一起使用

安装 @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_KEEP_0__/__CAPGO_KEEP_1__-live-activities 的原生能力 @capgo/capacitor-live-activities 为 @capgo/capacitor-live-activities 的实现细节,以及 使用 @capgo/capacitor-video-player 为使用 @capgo/capacitor-video-player 的原生能力 Using @capgo/capacitor-video-player for the native capability in Using @capgo/capacitor-video-player.