Vue3官网-过渡&动画(十)gsap、列表过渡(\<transition-group>、tag、FLIP技术、v-move、动态过度、可复用过渡)、状态过渡(第三方库gsap、把过渡放在子组件)

本文详细介绍了Vue3中的过渡和动画,包括列表过渡(<transition-group>使用、FLIP技术、动态过渡等)、状态过渡(借助gsap实现),展示了如何创建可复用的过渡组件,以及如何将过渡逻辑置于子组件中,为设计赋予生命。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue3官网-过渡&动画(十)gsap、列表过渡(<transition-group>、tag、FLIP技术、v-move、动态过度、可复用过渡)、状态过渡(第三方库gsap、把过渡放在子组件)

总结:

  • 补充

    • Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。

    • truthy(真值):在 JavaScript 中,truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。所有值都是真值,除非它们被定义为 假值(即除 false0""nullundefinedNaN 以外皆为真值)。括号内都是假值falsy。

    • .prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()

    • ==Event.preventDefault方法取消浏览器对当前事件的默认行为。==比如点击链接后,浏览器默认会跳转到另一个页面,使用这个方法以后,就不会跳转了;再比如,按一下空格键,页面向下滚动一段距离,使用这个方法以后也不会滚动了。该方法生效的前提是,事件对象的cancelable属性为true,如果为false,调用该方法没有任何效果。

    • vue:用组件(app.component)构建一个模板(template),并反复使用模板

    • 父组件、子组件

      • const app = Vue.createApp({
                  
          components: {
                  
            'component-a': ComponentA,
            'component-b': ComponentB
          }
        })
        
      • 上面代码中app为父组件,ComponentA和ComponentB为子组件

    • Vue中美元$符号的意思

      • 除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。
      • vue中$refs的作用?
        • 当我们需要获取一个dom元素进行操作的时候 可以利用原生js的getElementByXxx 而在vue中可以设置refs来获取这个dom元素
    • 第三方网站

      • greensock API(GSAP):是一套用于所有主流浏览器中制作高性能html5动画的工具。他们有一个很棒的 ease visualizer,帮助你建立精心制作的画架。
        • GSAP的全名是==GreenSock Animation Platform,这个名字是有些怪异(官网还在各种安利你加入它的Club),但它的确是一个从flash时代一直发展到今天的专业动画库。==参照优快云:https://blog.youkuaiyun.com/weixin_39939012/article/details/80833073
      • animate.css :集成第三方 CSS 动画库
      • CSS Triggers :来查看哪些属性会在动画时触发重绘。这个网站是用来告诉开发者不同内核浏览器对css属性修改的重绘/回流情况,开发者知道了这些细节可以提高页面性能。
    • JavaScript钩子

      • 添加 :css="false",也会让 Vue 会跳过 CSS 的检测,除了性能略高之外,这可以避免过渡过程中 CSS 规则的影响。
  • 列表过渡

    • 概述

      • 默认情况下,它不会渲染一个包裹元素,但是你可以通过 tag attribute 指定渲染一个元素。(例如<p>指段落,<ul>指网络链接)
      • 过渡模式(out-in,in-out)不可用,因为我们不再相互切换特有的元素。
      • 内部元素总是需要提供唯一的 key attribute 值。
      • CSS 过渡的类将会应用在内部的元素中,而不是这个组/容器本身。
    • 列表的进入/离开过渡

      • 补充

        • splice()方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。

          arr.splice(start, count, addElement1, addElement2, ...);
          

          splice的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。如果后面还有更多的参数,则表示这些就是要被插入数组的新元素。

        • 列表:使用v-for

        • 列表过渡:使用 <transition-group> 组件

    • 列表的移动过渡

      • FLIP技术

        • Vue 内部使用了一个叫 FLIP 的动画技术,它使用 transform 将元素从之前的位置平滑过渡新的位置。
        • 使用 FLIP 过渡的元素不能设置为 display: inline。作为替代方案,可以设置为 display: inline-block 或者将元素放置于 flex 布局中。
        • FLIP 动画不仅可以实现单维度的过渡,多维网格种的元素也同样可以过渡
      • v-move

        • 它会在元素的改变定位的过程中应用。像之前的类名一样,可以通过 name attribute 来自定义前缀,也可以通过 move-class attribute 手动设置。

        • .flip-list-move {
                      
            transition: transform 0.8s ease;
          }
          
    • 列表的交错过渡

      • 通过 data attribute 与 JavaScript 通信,就可以实现列表的交错过渡:
      • 数据属性指:el.dataset.index之类
    • 可复用的过渡

      • <transition> 或者 <transition-group> 作为根组件,然后将任何子组件放置在其中就可以了。
      • 使用 template
    • 动态过度

      • 首先,在 Vue 中即使是过渡也是数据驱动的!动态过渡最基础的例子是通过 name attribute 来绑定动态的值

        <transition :name="transitionName">
          <!-- ... -->
        </transition>
        
      • 其次,尽管所有过渡 attribute 都可以动态绑定,我们可用的不仅有 attribute。因为事件钩子是方法,它们可以访问任何上下文中的数据,这意味着根据组件的状态不同,你的 JavaScript 过渡可以有不同的表现。

      • 最后创建动态过渡的最终方案是组件通过接受 prop 来动态修改之前的过渡。

  • 状态过渡

    • 数据元素本身动效
      • 数据元素
        • 数字和运算
        • 颜色的显示
        • SVG 节点的位置
        • 元素的大小和其他的 property
      • 这些数据要么本身就以数值形式存储,要么可以转换为数值。有了这些数值后,我们就可以结合 Vue 的响应性和组件系统,使用第三方库(gsap)来实现切换元素的过渡状态。
  • 把过渡放在组件里

    • 管理太多的状态过渡会迅速增加组件实例的复杂度,幸好很多的动画可以提取到专用的子组件中。

    • 如下面所示,所有的数值过渡都自动存放在’animated-integer’组件中

      app.component('animated-integer', {
              
      

1. 列表过渡

目前为止,关于过渡我们已经讲到:

  • 单个节点
  • 多个节点,每次只渲染一个

那么怎么同时渲染整个列表,比如使用 v-for?在这种场景下,我们会使用 <transition-group> 组件。在我们深入例子之前,先了解关于这个组件的几个特点:

  • 默认情况下,它不会渲染一个包裹元素,但是你可以通过 tag attribute 指定渲染一个元素。
  • 过渡模式不可用,因为我们不再相互切换特有的元素。
  • 内部元素总是需要提供唯一的 key attribute 值。
  • CSS 过渡的类将会应用在内部的元素中,而不是这个组/容器本身。

列表的进入/离开过渡

现在让我们由一个简单的例子深入,进入和离开的过渡使用之前一样的 CSS 类名。

<div id="list-demo">
  <button @click="add">Add</button>
  <button @click="remove">Remove</button>
  <transition-group name="list" tag="p">
    <span v-for="item in items" :key="item" class="list-item">
      {
  { item }}
    </span>
  </transition-group>
</div>
const Demo = {
   
  data() {
   
    return {
   
      items: [1, 2, 3, 4, 5, 6, 7, 8, 9],
      nextNum: 10
    }
  },
  methods: {
   
    randomIndex() {
   
      return Math.floor(Math.random() * this.items.length)
    },
    add() {
   
      this.items.splice(this.randomIndex(), 0, this.nextNum++)
    },
    remove() {
   
      this.items.splice(this.randomIndex(), 1)
    }
  }
}

Vue.createApp(Demo).mount('#list-demo')
.list-item {
   
  display: inline-block;
  margin-right: 10px;
}
&lt;think&gt;好的,我现在需要帮助用户找到关于Vue3实现翻页时钟的示例代码或组件实现方法。首先,我要回顾用户提供的引用内容,看看有没有相关的资源。用户给的引用里有提到vue2-flip-countdown和Vue Flip Down组件,但这些都是针对Vue2的。用户需要的是Vue3的解决方案,所以可能需要考虑如何迁移这些组件到Vue3,或者寻找现有的Vue3组件。 接下来,用户提到的引用4是关于vue+canvas的倒计时插件,但也是Vue2的,不过可能其中的实现思路可以借鉴。比如使用canvas绘制翻页效果,或者利用CSS动画模拟翻页。这时候,我需要考虑Vue3的组合式API如何与这些技术结合。 然后,用户需要具体的示例代码或组件实现步骤。可能需要分步骤讲解:首先安装必要的依赖,比如Vue3和可能需要的动画库;然后创建组件的基本结构,使用CSS实现翻转动画;接着处理数字的变化逻辑,使用计算属性或watch来监听时间变化;最后集成到应用中。 还要考虑到Vue3的新特性,比如Composition API,如何利用setup函数来组织代码。另外,翻页效果可能需要使用CSS的transform和transition,或者更复杂的动画库如GSAP来实现平滑效果。 同时,用户可能希望组件是可复用的,所以需要设计props,比如倒计时的时间、样式配置等。另外,引用3提到的Vue Flip Down组件虽然是为Vue2设计的,但它的实现思路&mdash;&mdash;使用CSS翻转效果和动态更新数字&mdash;&mdash;可以应用到Vue3中,只是需要调整代码结构以适应Vue3的响应式系统。 最后,可能需要检查是否有现成的Vue3组件,比如在npm上搜索vue3-flip-countdown,或者GitHub上的开源项目。如果找不到,就需要指导用户如何自行实现,参考现有的Vue2组件进行迁移,并利用Vue3的新特性优化代码。&lt;/think&gt;以下是为您整理的Vue3实现翻页时钟的解决方案: ### 一、实现思路 1. **核心原理**:通过CSS33D变换实现数字翻转动画,结合Vue3的响应式系统动态更新时间 2. **关键技术**: - 使用`transform-style: preserve-3d`创建3D空间[^3] - 通过`requestAnimationFrame`实现流畅动画 - Vue3的`Composition API`管理时间状态 ### 二、基础实现示例 ```vue &lt;template&gt; &lt;div class=&quot;flip-clock&quot;&gt; &lt;div v-for=&quot;(digit, index) in timeDigits&quot; :key=&quot;index&quot; class=&quot;flip-unit&quot;&gt; &lt;div class=&quot;current&quot;&gt;{{ digit }}&lt;/div&gt; &lt;div class=&quot;next&quot;&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/template&gt; &lt;script setup&gt; import { ref, computed, onMounted } from &#39;vue&#39; const time = ref(new Date()) const timeDigits = computed(() =&gt; { return time.value.toLocaleTimeString().replace(/:/g, &#39;&#39;).split(&#39;&#39;) }) onMounted(() =&gt; { setInterval(() =&gt; { time.value = new Date() }, 1000) }) &lt;/script&gt; &lt;style&gt; .flip-clock { display: flex; gap: 10px; perspective: 1000px; } .flip-unit { position: relative; width: 60px; height: 100px; transform-style: preserve-3d; } .current, .next { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; justify-content: center; align-items: center; font-size: 3em; background: #333; color: white; border-radius: 5px; } .next { transform: rotateX(180deg); } .flip-unit.flipping .current { transform: rotateX(-180deg); transition: transform 0.6s; } .flip-unit.flipping .next { transform: rotateX(0deg); transition: transform 0.6s; } &lt;/style&gt; ``` ### 三、优化方案 1. **使用现成组件库**: - 推荐`vue3-flip-countdown`(需自行实现或寻找Vue3移植版) - 可参考Vue2组件`vue2-flip-countdown`进行升级[^2] 2. **高级动画实现**: ```javascript // 在setup中添加动画逻辑 const animateFlip = (element) =&gt; { element.classList.add(&#39;flipping&#39;) setTimeout(() =&gt; { element.classList.remove(&#39;flipping&#39;) }, 600) } watch(timeDigits, (newVal, oldVal) =&gt; { if (newVal.join(&#39;&#39;) !== oldVal.join(&#39;&#39;)) { const units = document.querySelectorAll(&#39;.flip-unit&#39;) units.forEach((unit, index) =&gt; { if (newVal[index] !== oldVal[index]) { animateFlip(unit) } }) } }) ``` ### 四、扩展功能建议 1. 添加`&lt;canvas&gt;`实现粒子特效(参考vue-canvas-countdown实现思路)[^4] 2. 集成国际化时间格式 3. 增加主题切换功能
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChrisP3616

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值