一,过渡动画的实现

1,无过渡,直接变化

<template><div class="testBox"><div class="testCon" :style="{ width: width + 'px' }"></div><div class="testBtn" @click="clickBtn">点击按钮</div></div>
</template><script setup>
import { ref } from 'vue';
const width = ref(10);
const clickBtn = () => (width.value += 100);
</script><style lang="scss" scoped>
.testBox {overflow: hidden;height: 100vh;padding: 100px 50px;box-sizing: border-box;.testCon {height: 200px;background: pink;}.testBtn {margin-top: 10px;height: 60px;line-height: 60px;border: 1px solid #35aeff;background: #35aeff;border-radius: 10px;}
}
</style>

为了好讲述,只看一次点击。也就是开始时width:10px,结束时width:110px。在没有设置过渡的时候,变化是突兀的,生硬的。如下图:

2,设置过渡,设置时间和速率

过渡的实现。可以理解为:记录起始状态,然后添加一个从开始到结束的时间和速度。
主要就是利用css3的transition来设置。需要监听谁的属性变化,就写在谁的样式中

  .testCon {height: 200px;background: pink;transition: width 2s linear;//监听这个元素的width属性的变化,}

于是就会监听这个width属性,从开始到结束的变化,会被拉长到2s来线性变化。

当想要监听该元素所有元素的变动的时候,只要把属性改成all即可:

<template><div class="testBox"><div :class="['testCon', btnClick ? 'btnClick' : '']"></div><div class="testBtn" @click="clickBtn">点击按钮</div></div>
</template><script setup>
import { ref } from 'vue';
const btnClick = ref(false);
const clickBtn = () => {btnClick.value = true;
};
</script><style lang="scss" scoped>
.testBox {overflow: hidden;height: 100vh;padding: 100px 50px;box-sizing: border-box;.testCon {width: 100px;height: 100px;background: pink;}.btnClick {height: 200px;width: 200px;background: red;transition: all 2s linear;}.testBtn {margin-top: 10px;height: 60px;line-height: 60px;border: 1px solid #35aeff;background: #35aeff;border-radius: 10px;}
}
</style>

主要是从这个样式:

.testCon {width: 100px;height: 100px;background: pink;
}

变成:

  .btnClick {height: 200px;width: 200px;background: red;transition: all 2s linear;}

这样一来,就会给该元素所有变动的属性增加过渡变化的效果:

也就是说,过渡主要是transition这个css样式产生的效果,

transition :transition-property(执行变换的属性) || transition-duration(执行变换的时间) || transition-timing-function(执行变换的速率) || transition-delay(延迟变换的时间);

transition-property(执行变换的属性)

transition-property 可取的值
none 没有属性会获得过渡效果
all 所有属性都将获得过渡效果,也是其默认值
property CSS 属性名称列表,逗号隔开

transition-duration(执行变换的时间

过渡的持续时间,取值time为数值,单位为s(秒)或者ms(毫秒),其默认值是0,也就是变换时是即时的。

transition-timing-function(执行变换的速率)

描述
linear 相同速度开始至结束
ease 慢速开始,然后变快,然后慢速结束
ease-in 慢速开始
ease-out 慢速结束
ease-in-out 慢速开始和结束
cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中定义自己的值。可能的值是 0 至 1 之间的数值。

transition-delay(延迟变换的时间)

默认是0,也就是立即执行,若有设置值,则是延迟执行过渡。
需要注意的是,不是所有的CSS属性都支持transition,可以支持的具体的效果可以看这里。

二,animation 和 keyframe 的组合实现动画

过渡动画,只能定义首尾两个状态。而animation可以自定义多个帧的状态之间的过渡效果。从而实现真正的动画。

1,animation的取值

描述
animation-name 规定需要绑定到选择器的 keyframe 名称
animation-duration 规定完成动画所花费的时间,以秒或毫秒计
animation-timing-function 规定动画的速度曲线
animation-delay 规定在动画开始之前的延迟,默认值为0
animation-iteration-count 规定动画应该播放的次数,默认值为1
animation-direction 规定是否应该轮流反向播放动画,默认值是正向

2,keyframe

@keyframes 就是让程序员设置一定序列的动画帧,然后提供给animation使用的。
使用方法:
当使用百分比用法时:

@keyframes 动画名字{0% { top: 0; left: 0px}50% { top: 30px; left: 20px; }100% { top: 0; left: 30px;}
}

使用的方法如下:

<template><div class="testBox"><div class="testCon"></div></div>
</template><script setup></script><style lang="scss" scoped>
.testBox {overflow: hidden;height: 100vh;padding: 100px 50px;box-sizing: border-box;.testCon {animation: testAni 3s ease-in-out infinite;}
}
@keyframes testAni {0% {width: 50px;height: 50px;background: #cd4a48;border-radius: 50px;}50% {width: 100px;height: 100px;background: #e72365;border-radius: 0;}100% {width: 50px;height: 50px;background: #04aef1;border-radius: 50px;}
}
</style>

实现的效果:

当使用from-to用法时:

@keyframes preloader {from {transform: rotate(0deg);//其实这里写的就是支持过渡动画的属性啦}to {transform: rotate(360deg);}
}

不同于transition,使用animation自动触发,无需事件触发。

三,transform变换

在制作动画的时候,常常要使用到属性变化。transform就是变形,主要包括旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix。

transform: none || transform-functions

none:表示不进么变换;transform-function表示一个或多个变换函数,用空格分开。
transform-function变换函数有以下几种:

1,旋转rotate

通过指定的角度参数对原元素指定一个2D rotation(2D 旋转),需先有transform-origin属性的定义(默认dom元素的中心)。transform-origin定义的是旋转的基点,其中angle是指旋转角度,如果设置的值为正数表示顺时针旋转,如果设置的值为负数,表示逆时针旋转。 如:transform:rotate(30deg):

<template><div class="testBox"><div class="testCon"></div></div>
</template><script setup></script><style lang="scss" scoped>
.testBox {overflow: hidden;height: 100vh;padding: 100px 50px;box-sizing: border-box;.testCon {width: 100px;height: 100px;animation: testAni 3s ease-in-out infinite;}
}
@keyframes testAni {0% {background: #04aef1;border-radius: 50px;}50% {background: #e72365;border-radius: 0;transform: rotate(180deg);}100% {background: #04aef1;border-radius: 50px;}
}
</style>

2,移动translate

移动translate我们分为三种情况:translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动);translateX(x)仅水平方向移动(X轴移动);translateY(Y)仅垂直方向移动(Y轴移动),如果是负值,则是反方向移动,当然,也可以用transform-origin来控制基准。

@keyframes testAni {0% {background: #04aef1;border-radius: 50px;}50% {background: #e72365;border-radius: 0;transform: rotate(180deg);transform: translate(50px, 50px);}100% {background: #04aef1;border-radius: 50px;}
}

实现的便是这样的效果:

3,scale缩放

scale(x,y)使元素水平方向和垂直方向同时缩放(也就是X轴和Y轴同时缩放);scaleX(x)元素仅水平方向缩放(X轴缩放);scaleY(y)元素仅垂直方向缩放(Y轴缩放),但它们具有相同的缩放中心点和基数,其中心点就是元素的中心位置,缩放基数为1,如果其值大于1元素就放大,反之其值小于1,元素缩小。同样的,它可以用transform-origin来控制基准。

  50% {background: #e72365;border-radius: 0;transform: scale(1.5, 2);}

4,扭曲skew

扭曲skew和translate、scale一样同样具有三种情况:skew(x,y)使元素在水平和垂直方向同时扭曲(X轴和Y轴同时按一定的角度值进行扭曲变形);skewX(x)仅使元素在水平方向扭曲变形(X轴扭曲变形);skewY(y)仅使元素在垂直方向扭曲变形(Y轴扭曲变形)。

 50% {background: #e72365;border-radius: 0;transform: skewX(30deg);}


单个的动画看起来有些死板,但是多种结合在一起,就会有神效:

<div id="preloader"><span></span><span></span><span></span><span></span>
</div>#preloader {position: relative;width: 42px;height: 42px;animation: preloader 5s infinite linear;
}
#preloader span {width: 20px;height: 20px;position: absolute;background: red;// display: block;animation: preloader_6_span 1s infinite linear;
}
#preloader span:nth-child(1) {background: #2ecc71;
}
#preloader span:nth-child(2) {left: 22px;background: #9b59b6;animation-delay: 0.2s; //延迟0.2s后开始动画
}
#preloader span:nth-child(3) {top: 22px;background: #3498db;animation-delay: 0.4s; //延迟0.4s后开始动画
}
#preloader span:nth-child(4) {top: 22px;left: 22px;background: #f1c40f;animation-delay: 0.6s; //延迟0.6s后开始动画
}
@keyframes preloader {from {transform: rotate(0deg);}to {transform: rotate(360deg);}
}
@keyframes preloader_6_span {0% {transform: scale(1);}50% {transform: scale(0.5);}100% {transform: scale(1);}
}

四,vue中的动画效果

1,普通的过渡动画

Vue 3 中提供了一些动画的封装,使用内置的 transition 组件来控制组件的动画。

按照官网的说法,就是被transition包裹的组件,会有这六种class的切换:

1,v-enter-from:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
2,v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
3,v-enter-to:定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡/动画完成之后移除。
4,v-leave-from:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
5,v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
6,v-leave-to:离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave-from 被移除),在过渡/动画完成之后移除。

具体 class 的名字,Vue 的官网有一个图给出了很好的解释,图里的 v-enter-from 中的 v,就是我们设置的 name 属性。
实际上,这个过程就是过渡动画的体现。当元素进入的那一帧,会添加v-enter-from的class,设置了初始状态。而v-enter-to则是元素开始进入到完成会添加的class,用来设置元素过渡的结束状态。v-enter-active则是整个过渡时间内会存在的class。
也就是上面那张图实际上是这样的:

于是,v-enter-active和v-leave-active就可以被用来定义进入过渡的过程时间,延迟和曲线函数。因为这两个类在过渡的时间内一直存在,过渡完成后才删除。
而v-enter-from和v-leave-to则可以用来设置动画的开始和结束。
另外两个可以不使用,而用元素自身的class替代:

<template><div id="demo"><button @click="data.noActivated = !data.noActivated">Toggle</button><transition name="fade"><p v-if="data.noActivated" class="test">hello</p></transition></div>
</template><script setup>
import { reactive } from "vue";
const data = reactive({noActivated: false
});
</script><style lang="scss" scoped>
.test {color: green;opacity: 1;
}
.fade-enter-active,
.fade-leave-active {transition: all 5s ease;
}
.fade-enter-from,
.fade-leave-to {color: black;opacity: 0;
}
</style>

实现的效果:


也就是在元素渲染的那段动画中:

1,fade-enter-from设置了初始状态
2,fade-enter-active设置了过渡的动画和时间
3,元素本身的class:test充当设置了最终状态。

从而实现了开始渲染的过渡动画效果。
而在元素移除的那段动画中:

1,元素本身的class:test充当设置了初始状态。
2,fade-leave-active设置了过渡的动画和时间
3,fade-leave-to设置了最终状态。

2,列表的进入/离开过渡动画

transition 元素作为单个元素/组件的过渡效果。transition 只会把过渡效果应用到其包裹的内容上,而不会额外渲染 DOM 元素,也不会出现在可被检查的组件层级中。它的这六个class就是放在这个子元素上的。所以列表渲染就不用这个,而是使用transition-grou来包裹,至于六种class则是添加在item上。用法和上文说的一样,我习惯用元素本身的class,来取代v-enter-to和v-leave-from。所以没设置这两个。

<template><div id="demo"><button @click="clickBtn">增加按钮</button><transition-group name="fade" tag="ul"><li v-for="(item, index) in data.testList" :key="index" class="test">{{ item.content }}</li></transition-group></div>
</template><script setup>
import { reactive } from "vue";
const data = reactive({testList: [{content: "第一个"}]
});
function clickBtn() {data.testList.push({content: "下一个"});
}
</script><style lang="scss" scoped>
.test {color: red;font-size: 18px;
}
.fade-enter-active,
.fade-leave-active {transition: all 2s ease;
}
.fade-enter-from,
.fade-leave-to {color: black;opacity: 0;transform: translateX(30px);
}
</style>

3,js动画配合transition

<template><div class="title"><input type="text" @keypress.enter="add" v-model="title" /><button @click="clear">清理</button></div><div class="content"><transition-group name="flip-list" tag="ul"><li v-for="(item, index) in todoList" :key="item.content"><input type="checkbox" v-model="item.done" /><span :class="[item.done ? 'inactive' : 'active']">{{ item.content }}</span><span class="remove-btn" @click="removeTodo($event, index)">❌</span></li></transition-group></div><span class="dustbin">												

vue中动画效果的实现相关推荐

  1. html 载入中,用纯CSS实现加载中动画效果

    今天要介绍的是用简单的CSS--只用CSS,不用Gif--制作"加载中-"动画效果.先看看效果: 上面的这个加载中效果,以前是用gif动图实现的,但随着CSS的进步,CSS动画功能 ...

  2. hide show vue 动画_(Vue动效)7.Vue中动画封装

    关键词:动画封装--进行可复用 一.如何封装? 1.使用:局部组件传递数据+局部组件中使用JS动画 2.原理:将动画效果完全第封装在一个名为<fade>的组件中,今后如要复用,只需要复制有 ...

  3. Vue倒计时动画效果

    这一次在b站看到一个博主做的一个倒计时的动画效果,跟着做了一下.以下是对此次项目的一些记录与总结. 该项目效果链接:Vue倒计时 HTML部分: <div id="app"& ...

  4. uniapp及vue中动画功能实现方案

    需求场景:实际开发过程中,我们经常遇到各类比较炫酷的动画开发,比如简单的echarts插件使用,animation动画等... 动画实现方案: 1.css动画,如gif,a-png,animation ...

  5. jquery中动画效果的函数

    在jquery中有很多的动画效果,我给大家分享了一下jquery中的动画函数 jQuery的效果函数列表: animate():对被选元素应用"自定义"的动画. clearQueu ...

  6. Vue中动画的实现 从基本动画,到炫酷动画。看这一篇就够了

    文章目录 Vue中的基本动画实现 动画类名的重定义 使用第三方的动画库 我就选择其中一个库做示范其他都一样 Vue中的基本动画实现 直接一点,基本动画的步骤 在需要加动画的地方,加入transitio ...

  7. android dialog加载中动画效果

    Java代码   //显示动画 Java代码   dialog = new Dialog(context, R.style.loading); dialog.setContentView(R.layo ...

  8. 使用vue制作动画效果

    1:使用v-enter,v-enter-to,v-enter-active,v-leave,v-leave-to,v-leave-active进行类名绑定,transition会直接找到这几个类名. ...

  9. vue中老虎机效果的简单实现-带立即停止功能

    持续更新中... 1. 新增 prizeNum: 3, // 可视区域每列展示的奖品数,展示为三列,每列三条数据,如下图 2. 新增动画过程中再次点击,直接抽奖结束,滚到对应中奖位置 vue前端-老虎 ...

  10. css3加载中动画效果,CSS3实现加载中的动画效果

    Loading 的菊花图形组合的不太好,基本上实现这个功能了 动画解析 这个动画用到的 CSS3 特性: transform 主要使用 transform 属性的 rotate,将线条组合成 Load ...

最新文章

  1. oracle存储while用mysql_oracle存储过程while
  2. 前端基础--jquery操作元素
  3. redis学习笔记(一): sds
  4. pycharm和vs code的使用体验
  5. Android通用开发笔记和高性能安卓开发框架源码
  6. 日期减三个月oracle_Oracle如何对日期时间进行加减操作呢?
  7. rake -T 列出所有RAKE 命令.
  8. java手动注册filter,SpringBoot如何注册Servlet、Filter、Listener的几种方式
  9. 一份帮助你更好地理解深度学习的资源清单
  10. VUE自学日志03-模板语法
  11. Java正则表达式应用总结
  12. 多大的计算机科学,科学网—大家计算机的屏幕尺寸都是多大的? - 刘洋的博文...
  13. 解决:浏览器无法及时更新css样式等改动
  14. 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
  15. 计算机算法实验报告二——递归
  16. Xposed 模块 Nnnen助手(Soul 抖音 皮皮虾Hook)
  17. 修改.srt格式字幕文件
  18. python操作Excel设置打印标题时碰到的一个小问题
  19. 人脸检测和识别的开源库总结
  20. hexo下next主题的优化

热门文章

  1. h3c交换机查看电源和风扇模块序列号
  2. Java 并发编程常识 —— by 梁飞
  3. 服务器获取真实客户端 IP [ X-Forwarded-For ]
  4. 解决linux 运行自动化脚本浏览器无法启动问题
  5. PHP使用Apache中的ab测试网站的压力性能及mpm介绍
  6. CriminalIntent项目开发
  7. 在Android studio环境下使用junit框架进行单元测试
  8. iOS 学习 - 24.全局跑马灯,支持后台回到前台
  9. Javascript中eval函数的用法
  10. 从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(三)?