Hero motion 跨页面让组件起飞

348 阅读3分钟

项目地址:hero-motion

记得还蛮早以前写过一篇介绍 FLIP 动画的,然后搁置了很久,平时写写业务也不知道哪里用得上,作为一个 vue 开发者做 b 端项目一般 Transform 一把梭就已经满足大部份需求了。

直到看到 antfu 很早之前一个录播,实现多个页面之间共享组件达到过渡的效果(实际上也看了有段时间了)也提到过 FLIP 的形式。

在想有没有可能牺牲一点灵活性封装一个更简洁的动画组件

他们都是怎么做的?

自己开工前当然还是需要了解一下现成的方案们,首当其冲的还是跨页面共享组件(但是感觉用起来不太方便就 pass 了

其次就是 FLIP 的形式,会牺牲一些效果,对过程更不可控,例子么就是大名鼎鼎的 framer motion 可以参考其中 shared layout 的部分

可惜好像 vue 生态里面好像没有类似的工具,当然也有可能是没发现 hhh

但是至少有 @vueuse/motion 还是方便了很多,即使是普通的页面加上动画交互也会友好很多喔,感觉可以算是 vue 生态下的 gsap

上手试试

话不多少,选个顺眼的 Vue.js 项目先用起来~ 当前还只支持 3.x 版本哦

pnpm add @vueuse/motion hero-motion

因为是基于 @vueuse/motion 的所以也需要一起安装一下,然后找到入口文件,在根节点外层包裹一个 HeroProvider

<script setup>
import { HeroProvider } from 'hero-motion'
</script>

<template>
  <HeroProvider>
    <RouterView />
  </HeroProvider>
</template>

这一步会在项目中注入一个 hero motion 的对象,用来收集项目的 layoutId 而有相同 id 的两个元素会根据 transition 中定义的方式进行过渡

然后找到需要过渡的元素:

<script setup>
import { Hero } from 'hero-motion'
</script>

<template>
  <Hero as="div" layout-id="ID" />
</template>

那么接下来,如果这个元素在多个页面中被使用到就可以欣赏到动画辣

用在哪?

说了这么多这到底哪些场景会用上呢?

虽然说到底还是看大家的想象力,但是我个人的话使用场景比较多的主要还是各种 cursor

不知道大家有没有碰到过 nuxt layout 中定义的过渡效果在 ssr 模式下有时候并不生效,这是因为 layout 的部分已经在服务端渲染好了,对于浏览器来说切换到另一个页面 cursor 已经固定了,那么通过 hero-motion 就能很好的避免这个问题

<script setup lang="ts">
import { Hero } from 'hero-motion'
</script>

<template>
  <Hero
    as="div"
    layout-id="sidebar-item-cursor"
  />
</template>

或者自己封装组件 tabs 的时候,光标想要流畅的从一个 tab 移动到另一个,如果不借助这个工具的话可能就要计算偏移量等等,而且明明 cursor 属于某个 tab 但是为了共享一个组件就不得不定义在外面,对代码结构也有很大影响。而这也同样能很好的被 hero-motion 解决

// Cursor.vue
<script setup lang="ts">
import { Hero } from 'hero-motion'
</script>

<template>
  <Hero
    as="div"
    layout-id="cursor"
  />
</template>

// Selector.vue
<script setup lang="ts">
import { Cursor } from './Cursor.vue'
</script>

<template>
	<div v-for="item in options" :key="item.key">
	  <div>
	    {{ name }}
	  </div>
	
	  <Cursor v-if="isActive" />
	</div>
<template>

最后

过渡动画什么的很容易就会被忽略了,毕竟同样也有很多可以曲线救国的方式

实在不行就和 UI/UX 设计们 battle 一下嘛

但是友好的交互方式真的会让人很有使用的欲望,想要好好做产品的时候难免会碰到实现难度、代码组织方式难两全的情况,那么不妨尝试一下 hero-motion

欢迎来我主页看看有啥感兴趣的嗷 ⇒ tmg0