Vue transition实现点赞动画效果

爱心效果

材料:爱心图标两个,没有我这种 icon 组件的用 png 图片代替

<transition :name=" isLike ? 'zoom' : '' " mode="out-in">
    <!-- 爱心图标 -->
    <icon data="@icon/like.svg" color="#FF0000" v-if="isLike" key="like"></icon>
    <icon data="@icon/unlike.svg" color="#333333" v-else key="unlike"></icon>
</transition>


这里注意当两个切换的组件名称一致时,需要加 key 属性,以区分两个组件,否则动画不会生效因为在点赞时有动画,取消点赞不要动画,所以 transition 的 name 属性需要根据 isLike 变量变化,当 isLike 为 true 时,给他 zoom 动画,否则不给动画。动画模式是 out-in 即先出后进。原来的图标先从大变小,然后新图标再从小变大。

接下来写 css

/** 动画进行时的class **/
.zoom-enter-active, .zoom-leave-active {
    transition: all .15s cubic-bezier(0.42, 0, 0.34, 1.55);
}

/** 设置进场开始的状态和离场结束的状态,都是缩放到0 **/
.zoom-enter, .zoom-leave-to {
    transform: scale(0);
}

/** 设置进场结束的状态和离场开始的状态, 都是缩放到1 **/
.zoom-enter-to, .zoom-leave {
    transform: scale(1);
}

 

根据官方文档描述,.name-enter-active 和 .name-leave-active 会在动画进行时设置到 icon 组件的 class 中,所以这里我们设置 transition 的动画属性,时间以及曲线。

因为我们需要在放大时略微比 scale(1) 要大一点再回到正常大小,所以要自定义动画曲线 cubic-bezier(0.42, 0, 0.34, 1.55) 。这个曲线怎么来的呢?

打开 chrome 的调试面板,随便找个 dom 设置 transition-timing-function: ease; 然后点击 ease 旁边的曲线小图标

 拖动拉杆就可以调整曲线

在动画快结尾的时候,使曲线超出结束点即可。

 

 

然后复制曲线面板下面的值 cubic-bezier(0.25, 0.1, 0.27, 1.32) 即可。

更多关于动画时间曲线的知识,这里就不赘述了,网上有很多相关知识。

关于缩放部分,按照上述 css 设定以及 mode="out-in" 动画模式是先出后进,在点赞时。

  1. 原来的爱心开始离场,此时原来爱心缩放状态为 1,即大小的 100%
  2. 爱心离场动画进行中,此时开始从 1 缩放到 0,即大小的 0%
  3. 原爱心离场完成,新爱心开始进场,此时新爱心缩放状态为 0
  4. 新爱心进场动画进行中,此时开始从 0 动画缩放到结束状态 1

当取消点赞的时候,isLike 为 false,transition 的 name 就等于空字符串,此时就不会有动画了。

数字滚动动画

因为只是数字的变化,因此 transition 里只需要一个 div 即可。只是要注意 div 设置 key,以标识数据变动。

<div class="like-num-wrapper">
    <transition :name="item.is_like ? 'plus' : 'minus'">
        <div
                class="like-num"
                :style="{color: item['is_like'] ? 'red': '#333'}"
                :key="item['like_num']"
        >
            {{item['like_num']}}
        </div>
    </transition>
</div>


  .like-num-wrapper {
    position: relative;
    margin-left: 16px;
    text-align: end;
    font-size: 13px;
    height: 17px;
    overflow-y: hidden;

    .like-num {
      top: 0;
      left: 0;
      position: relative;
      line-height: 17px;
    }
  }

 需要注意我们为了好计算上下滚动的距离,所以需要把数字的高度定死在 17px,接下来写 transition 的动画 class。我们通过点赞状态来判断应该用那一套动画,点赞时 transition 的 name 是 plus ,取消点赞时是 minus 

// 点赞数字+1动画
.plus-enter-active, .plus-leave-active {
  transition: all .3s ease-in;
}

.plus-enter, .plus-leave {
  transform: translateY(0);
}

.plus-enter-to, .plus-leave-to {
  transform: translateY(-17px);
}

// 点赞数字-1动画
.minus-enter-active, .minus-leave-active {
  transition: all .3s ease-in;
}

.minus-enter {
  transform: translateY(-34px);
}

.minus-enter-to {
  transform: translateY(-17px);
}

.minus-leave {
  transform: translateY(0);
}

.minus-leave-to {
  transform: translateY(17px);
}

 

点赞动画

点赞动画很简单,在点赞时会在老的数字div下面生成一个新数字div。此时只需要让他们都往上移动 17px 即可。

因为取消点赞是数字从上往下滚动,所以需要让数字 1 的初始位置在 2 上面。所以写出如下代码,设定数字 1 的动画初始位置

.minus-enter {
  transform: translateY(-34px);
}

 

为什么是 -34px ?因为数字div的高度是 17px 往上移 17px 会和 2 重叠,那么数字 1 再往上移动 17px 就会出现在 2 的上面。-17-17 = 34 这一切都发生在电光火石之间。

接下来在 .minus-enter-to 中位移到 -17px 就可以实现 1 往下滚动到 2 这个效果了。

数字 2 的离场动画就简单多了 直接从 0 到 17px 就可以滚出去了。

至此整个点赞效果就完成了

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Vue 3的路由跳转添加动画效果,你可以通过使用Vue的过渡组件来实现。 首先,在你的Vue组件中,使用`<router-view>`标签来渲染路由组件。然后,在需要添加动画效果的地方,使用Vue的过渡组件包裹住对应的元素。 下面是一个示例代码,演示如何在路由切换时添加淡入淡出的动画效果: ```html <template> <transition name="fade"> <router-view></router-view> </transition> </template> <style> .fade-enter-active, .fade-leave-active { transition: opacity 0.5s; } .fade-enter, .fade-leave-to { opacity: 0; } </style> ``` 在上述代码中,我们使用了`<transition>`组件包裹了`<router-view>`标签,然后根据路由切换时的状态,在对应的CSS类中定义了动画效果。具体来说,`.fade-enter-active`和`.fade-leave-active`类定义了动画过渡的时间和属性(这里使用了opacity属性),而`.fade-enter`和`.fade-leave-to`类则定义了进入和离开时的初始和最终状态。 你可以根据自己的需求,在过渡组件内定义不同的CSS类来实现不同的动画效果,比如滑动、缩放等。 同时,确保在你的路由配置中,启用了过渡效果。在使用Vue Router时,你可以通过设置`<router-view>`标签的`v-slot`来自定义过渡效果。 ```html <template> <transition name="fade"> <router-view v-slot="{ Component }"> <transition :name="getTransitionName"> <component :is="Component"></component> </transition> </router-view> </transition> </template> <script> export default { computed: { getTransitionName() { // 根据路由配置返回对应的过渡效果名称 // 比如根据路由的名称、路径等进行判断 return 'fade'; }, }, }; </script> ``` 在上述代码中,我们通过计算属性`getTransitionName`根据当前路由的配置返回对应的过渡效果名称,然后在`<transition>`组件中使用动态的`name`属性来实现不同的过渡效果。 这样,当你进行路由切换时,就会触发相应的过渡效果,并实现动画效果的添加。 希望这能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值