@capgo/capacitor-transitions

中文文档
8.3.9发布于 2026/11/09MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 6.6万

Capacitor apps 的框架不可知页面转换 - iOS 风格的没有意见的导航

中文使用文档
文档目录25 节
  1. *免费开始*
  2. 演示
  3. 特征
  4. 兼容性
  5. 安装
  6. 快速启动
  7. 香草 JavaScript / Web 组件
  8. 反应
  9. 阴道
  10. 丝绒
  11. 固态
  12. 角质
  13. 用 @ capgo/ native- 导航
  14. API 参考
  15. 构成部分
  16. 过渡方向
  17. 导航动作
  18. 帮助函数
  19. 过渡管理员
  20. 浏览器支持
  21. 设计哲学
  22. 实例
  23. 反应示例
  24. 移动Demo App
  25. 许可证

@ capgo/ 电容过渡

Capgo - Build Capacitor apps with AI, ship updates instantly

队长:在几分钟内向您的Capacitor用户推进修正,在没有Mac的情况下构建签名的iOS和Android应用程序,以及 卷回一击.

*免费开始*

14天无限自由审判. 不需要信用卡

🤖 建筑与AI编码代理? 安装 Capgo 技能 所以克劳德代码,代码,光标,副驾驶,或双子座CLI知道如何安装和使用 @capgo/capacitor-transitions 在您的电容应用程序中: npx skills add Cap-go/capgo-skills。然后问你的经纪人: 加上@capgo/电容-过渡到我的电容软件上 代理设置指南 • 妇女 主机磁共振

Capacitor apps的架构-不可知页面转换. iOS-style discovery without opinions.

演示

Demo of capacitor-transitions in action

特征

  • 框架不可知论 - 与React、Vue、Angular、Svelte、Solid和任何其他框架合作
  • iOS & Android 动画 - 将平台适当转换出方框
  • 网络动画 API - 平滑的GPU加速动画
  • 查看过渡 API - 支持浏览器的可选渐进增强
  • 无设计意见 - 只是过渡逻辑,你带来自己的风格
  • 协调过渡 - 标题、内容和页脚合在一起
  • 页面缓存 - 将页面保留在DOM中,以便立即回向导航
  • 音效风格 iOS 刷回 - 与Capacitor本地iOS自动启用的可选边缘手势
  • 生命周期钩 - 将进入,将进入, 将离开,将离开事件

兼容性

此插件与他最新版本上的所有电容器版本兼容

安装

您可以使用我们的 AI 辅助设置安装插件 。 使用以下命令将 Capgo 技能添加到您的 AI 工具 :

npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-plugins

然后使用下列提示:

Use the `capacitor-plugins` skill from `cap-go/capacitor-skills` to install the `@capgo/capacitor-transitions` plugin in my project.

如果您更喜欢手动设置,请通过运行以下命令来安装插件,并遵循下面的平台特定指令:

npm install @capgo/capacitor-transitions

快速启动

香草 JavaScript / Web 组件

<cap-router-outlet platform="auto">
  <cap-page>
    <cap-header slot="header">
      <h1>My Page</h1>
    </cap-header>
    <cap-content slot="content">
      <p>Page content here</p>
    </cap-content>
    <cap-footer slot="footer">
      <nav>Tab bar</nav>
    </cap-footer>
  </cap-page>
</cap-router-outlet>
import '@capgo/capacitor-transitions';

// Navigate programmatically
const outlet = document.querySelector('cap-router-outlet');
outlet.push(newPageElement);
outlet.pop();
outlet.setRoot(newRootElement);
outlet.setRoot(onboardingDoneElement, { direction: 'forward' });

// For router-driven replace/reset flows, reset the stack but keep a forward slide.
outlet.setNavigation('root', 'forward');
yourRouter.replace('/home');

反应

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

// Initialize once at app startup
initTransitions({ platform: 'auto' });

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

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

  return (
    <cap-router-outlet ref={outletRef}>
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/details/:id" element={<DetailsPage />} />
      </Routes>
    </cap-router-outlet>
  );
}

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

  useEffect(() => {
    if (pageRef.current) {
      return setupPage(pageRef.current, {
        onDidEnter: () => console.log('entered'),
      });
    }
  }, []);

  const goToDetails = (id: number) => {
    setDirection('forward');
    navigate(`/details/${id}`);
  };

  const finishOnboarding = () => {
    setNavigation('root', 'forward');
    navigate('/home', { replace: true });
  };

  return (
    <cap-page ref={pageRef}>
      <cap-header slot="header">
        <h1>Home</h1>
      </cap-header>
      <cap-content slot="content">
        <button onClick={() => goToDetails(1)}>Go to Details</button>
      </cap-content>
      <cap-footer slot="footer">
        <nav>Tab bar</nav>
      </cap-footer>
    </cap-page>
  );
}

反应 JSX TypeScript 设置

从 @capgo/capacitor-transitions/react 登记网络组件,并包括: cap-router-outlet, (中文(简体) ), cap-page, (中文(简体) ), cap-header, (中文(简体) ), cap-content,以及 cap-footer。在大多数反应项目中,上述示例中的导入就够了.

如果类型脚本仍然显示 Property 'cap-router-outlet' does not exist on type 'JSX.IntrinsicElements',添加项目申报文件:

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

然后确保 TypeScript 包含:

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

对于Vite, 创建 React App, 以及大多数 Webpack React App, 设置 capgo-transitions.d.ts 内部 src/ 够了。 下个J,放进去 src/ 或工程根并保留在 tsconfig.json。对于自定义的 TypeScript 或 Web package 设置, 单独设置 types/ 文件夹,将文件夹添加到 tsconfig.json数字 :

{
  "include": ["src", "types"]
}

阴道

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { useRouter } from 'vue-router';
import { initTransitions, setDirection, setupPage, setupRouterOutlet } from '@capgo/capacitor-transitions/vue';
import '@capgo/capacitor-transitions';

// Initialize once
initTransitions({ platform: 'auto' });

const router = useRouter();
const outletRef = ref(null);
const pageRef = ref(null);
let cleanup;

onMounted(() => {
  if (outletRef.value) {
    setupRouterOutlet(outletRef.value, { platform: 'auto' });
  }
  if (pageRef.value) {
    cleanup = setupPage(pageRef.value, {
      onDidEnter: () => console.log('entered'),
    });
  }
});

onUnmounted(() => cleanup?.());

const goToDetails = (id) => {
  setDirection('forward');
  router.push(`/details/${id}`);
};
</script>

<template>
  <cap-router-outlet ref="outletRef">
    <cap-page ref="pageRef">
      <cap-header slot="header">
        <h1>Home</h1>
      </cap-header>
      <cap-content slot="content">
        <button @click="goToDetails(1)">Go to Details</button>
      </cap-content>
    </cap-page>
  </cap-router-outlet>
</template>

丝绒

<script>
  import { routerOutlet, page, setDirection } from '@capgo/capacitor-transitions/svelte'
  import '@capgo/capacitor-transitions'

  function navigate(to, direction = 'forward') {
    setDirection(direction)
    // Use your router's navigate function
  }
</script>

<cap-router-outlet use:routerOutlet>
  <cap-page use:page={{ onDidEnter: () => console.log('entered') }}>
    <cap-header slot="header">
      <h1>Home</h1>
    </cap-header>
    <cap-content slot="content">
      <button on:click={() => navigate('/details/1')}>Go to Details</button>
    </cap-content>
  </cap-page>
</cap-router-outlet>

固态

import { onMount, onCleanup } from 'solid-js';
import { useNavigate } from '@solidjs/router';
import { initTransitions, setDirection, setupPage, setupRouterOutlet } from '@capgo/capacitor-transitions/solid';
import '@capgo/capacitor-transitions';

// Initialize once
initTransitions({ platform: 'auto' });

function HomePage() {
  const navigate = useNavigate();
  let pageRef;

  onMount(() => {
    if (pageRef) {
      const cleanup = setupPage(pageRef, {
        onDidEnter: () => console.log('entered'),
      });
      onCleanup(cleanup);
    }
  });

  const goToDetails = (id) => {
    setDirection('forward');
    navigate(`/details/${id}`);
  };

  return (
    <cap-page ref={pageRef}>
      <cap-header slot="header">
        <h1>Home</h1>
      </cap-header>
      <cap-content slot="content">
        <button onClick={() => goToDetails(1)}>Go to Details</button>
      </cap-content>
    </cap-page>
  );
}

角质

// app.component.ts
import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, ViewChild, AfterViewInit } from '@angular/core';
import '@capgo/capacitor-transitions';

@Component({
  selector: 'app-root',
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
  template: `
    <cap-router-outlet #outlet platform="auto">
      <router-outlet></router-outlet>
    </cap-router-outlet>
  `,
})
export class AppComponent {}

// home.component.ts
@Component({
  selector: 'app-home',
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
  template: `
    <cap-page>
      <cap-header slot="header">
        <h1>Home</h1>
      </cap-header>
      <cap-content slot="content">
        <button (click)="goToDetails(1)">Go to Details</button>
      </cap-content>
    </cap-page>
  `,
})
export class HomeComponent {
  constructor(private router: Router) {}

  goToDetails(id: number) {
    this.router.navigate(['/details', id]);
  }
}

用 @ capgo/ native- 导航

使用 @capgo/native-navigation 当本地图层拥有导航栏或标签栏时,并使用 @capgo/capacitor-transitions 在WebView的页面内容 在原生铬下.

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

首先配置原生铬 :

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

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

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

将过渡输出集中在页面上, 而不是本地栏 :

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

从相同的路由器动作驱动两个软件包 :

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

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

async function finishOnboarding() {
  setNavigation('root', 'forward');
  router.replace('/inbox');

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

不要让本地的上巴再次移动 <cap-header>。原生导航保持条形原生;这个软件包可以动画网页正文.

API 参考

构成部分

<cap-router-outlet>

页面转换容器.

属性类型默认说明
platform'ios' | 'android' | 'auto''auto'动画风格
durationnumber平台默认动画持续时间( ms)
keep-in-dombooleantrue导航后在 DOM 中保留页面
max-cachednumber10保存缓存的最大页面
swipe-gestureboolean | 'auto''auto'启用边缘刷回手势 . 'auto' 仅在本地的 iOS Capacitor apps 中启用

方法:

  • push(element, config?) - 导航到新页面
  • pop(config?) - 导航回来
  • setRoot(element, config?) - 替换导航堆栈。 过 { direction: 'forward' } 用前向幻灯片重置堆栈.
  • setNavigation(action, direction?) - 为下一个路由器驱动的导航设置堆栈动作和动画方向
  • setSwipeGesture(true | false | 'auto') - 启用、禁用或自动检测边缘刷回手势

swipe-gesture="auto" 使用 Capacitor 的运行时间助手( )Capacitor.isNativePlatform() 财务报告和审定财务报表 Capacitor.getPlatform())并只允许本地iOS应用程序的手势. 使用 swipe-gesture="true" 强迫它上任何平台或 swipe-gesture="false" 来禁用它.

<cap-page>

带有页眉/内容/页脚槽的页面容器.

活动 :

  • cap-will-enter - 在页面可见之前
  • cap-did-enter - 在页面可见后
  • cap-will-leave - 在离开前
  • cap-did-leave - 在页后离开

<cap-header>

信头容器。 使用方式 slot="header" 内部 <cap-page>。 。 。 .

<cap-content>

主要可滚动内容区域. 使用方式 slot="content"。 。 。 .

属性类型默认说明
fullscreenbooleanfalse内容滚动到标题后
scroll-xbooleantrue启用水平滚动
scroll-ybooleantrue启用垂直滚动

脚印容器。 使用方式 slot="footer"。 。 。 .

过渡方向

方向说明
'forward'推动动画( iOS: 从右侧滑出)
'back'流行动画( iOS: 幻灯片向右)
'root'替换动画( 淡出)
'none'没有动画

导航动作

导航动作独立于视觉动画控制所记录的堆栈. 当路由器出现时, 这会有用 replace 或本地导航重置应感觉像前行页面推取,但不得留下刷回条目.

setNavigation('root', 'forward');
router.replace('/home');

setNavigation('root', 'forward') 清除导航后的过渡堆栈并播放前方动画。 刷新背面因没有前页而禁用 .

帮助函数

所有框架绑定导出这些帮助函数 :

// Initialize the transition system
initTransitions({ platform: 'auto' });

// Set the direction for the next navigation
setDirection('forward' | 'back' | 'root' | 'none');

// Set the stack action and animation direction for the next navigation
setNavigation('root', 'forward');
setNavigation('root'); // direction is optional and defaults to the same value as the stack action.

// Set up a router outlet element
setupRouterOutlet(element, options);

// Auto-enable the iOS edge swipe-back gesture in native Capacitor iOS apps
setupRouterOutlet(element, { swipeGesture: 'auto' });

// Force enable or disable from JavaScript
setupRouterOutlet(element, { swipeGesture: true });
setupRouterOutlet(element, { swipeGesture: false });

// Set up a page element with lifecycle callbacks (returns cleanup function)
setupPage(element, { onWillEnter, onDidEnter, onWillLeave, onDidLeave });

// Create a transition-aware navigate function
const transitionNavigate = createTransitionNavigate(navigate);
transitionNavigate('/path', 'forward');

过渡管理员

高级方案控制:

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

const controller = createTransitionController({
  platform: 'auto',
  duration: 400,
  useViewTransitions: true,
});

// Navigate
await controller.push(element, { direction: 'forward' });
await controller.pop({ direction: 'back' });
await controller.setRoot(element, { direction: 'root' });
await controller.setRoot(element, { direction: 'forward' });

// Lifecycle hooks
controller.registerLifecycle('page-id', {
  onWillEnter: (event) => console.log('Will enter', event),
  onDidEnter: (event) => console.log('Did enter', event),
  onWillLeave: (event) => console.log('Will leave', event),
  onDidLeave: (event) => console.log('Did leave', event),
});

浏览器支持

  • 有 Web 动画 API 支持的现代浏览器
  • 可选视图过渡 API (Chrome 111+, Edge 111+, Safari 18+) 支持
  • 旧浏览器的优雅回落

设计哲学

这个图书馆有意对造型无动于衷:

  1. 最小结构CSS - 你带了自己的视觉系统
  2. 无设计系统 - 任何UI库或自定义风格的作品
  3. 只是过渡 - 注重平滑的页面导航
  4. 框架不可知论 - 使用React、Vue、Angular、Svelte、Solid或vanilla JS

目标是在没有Ionic的设计系统或框架锁定的情况下提供Ionic质量的页面转换.

实例

见 /examples 完整示例目录 :

  • react-app - 用回放路由器反应
  • vue-app - Vue 3带Vue路由器
  • angular-app - 有角路由器的角
  • svelte-app - 斯维尔特5号
  • solid-app - 固态路由器
  • tanstack-app - 与 TanStack 路由器反应

反应示例

React 示例显示 iOS 风格的页面转换带有平滑动画:

React transition demo
React Home Page
主页
React Details Page
细节 页次
React Nested Page
粘贴页

特征显示:

  • 使用滑入动画的前进导航
  • 以滑出动画后导航
  • 多级别页面堆栈
  • 坐标头/内容/脚步过渡

要运行反应示例 :

cd examples/react-app
npm install
npm run dev

移动Demo App

该寄存器还包括一个Capacitor shell,用于在真实设备上测试回声演示并经过Capgo. 它使用应用代号 app.capgo.capacitor.transitions,应用程序名称 Capgo Transitions,以及 examples/react-app/dist 作为本地网络捆绑.

CLI控制器需要22号节点或更新.

将演示复制到本地项目:

npm install
npm run build:mobile
npx cap sync

要在当地运行它:

npx cap run ios
npx cap run android

要部署一个OTA捆绑到Capgo:

npm run build:mobile
npx @capgo/cli@latest bundle upload app.capgo.capacitor.transitions --channel dev --delta

许可证

麻省理工学院

版本与发布记录

@capgo/capacitor-transitions 共发布 31 个版本,首次发布于 2026/05/11;过去 12 个月发布了 31 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
8.3.9latest2026/11/09今天
8.3.82026/11/027 天前
8.3.72026/10/2613 天前
8.3.62026/10/2119 天前
8.3.52026/10/1525 天前
8.3.42026/10/1327 天前

关于 @capgo/capacitor-transitions 的常见问题

@capgo/capacitor-transitions 是什么?

Capacitor apps 的框架不可知页面转换 - iOS 风格的没有意见的导航

如何安装 @capgo/capacitor-transitions?

在项目目录运行 npm install @capgo/capacitor-transitions,或使用 pnpm add / yarn add / bun add。

@capgo/capacitor-transitions 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@capgo/capacitor-transitions 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@capgo/capacitor-transitions 可以商用吗?

@capgo/capacitor-transitions 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@capgo/capacitor-transitions 的下载量有多少?

根据 npm 官方下载统计,@capgo/capacitor-transitions 在 2026/10/09 – 2026/11/07 这 30 天内被下载 66,477 次,日均约 2,216 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@capgo/capacitor-transitions 还在维护吗?

最新版本 8.3.9 发布于 2026/11/09(今天);至今共发布 31 个版本,其中过去 12 个月发布了 31 个;首次发布于 2026/05/11。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。