使用vue实现css过渡和动画

article/2025/3/13 4:53:55

一、过渡和动画的区别

  • 过渡:通常用来表示元素上属性状态的变化。
  • 动画:通常用来表示元素运动的情况。

二、使用Vue实现基础得css过渡与动画

1. 动画

/* css */
@keyframes leftToRight {0% {transform: translateX(-100px);}50% {transform: translateX(-50px);}100% {transform: translateX(0);}
}
.animation {animation: leftToRight 3s;
}
// js
const app = Vue.createApp({data() {return {animate: {animation: true}}},methods: {handleClick(){this.animate.animation = !this.animate.animation}},template: `<div :class='animate'>hello</div><button @click='handleClick'>切换</button>`
});

2. 过渡

/* css */
.transition {transition: background-color 3s linear 0s;
}.gold {background-color: gold;
}.cyan {background-color: cyan;
}
// js
const app = Vue.createApp({data() {return {animate: {transition: true,gold: true,cyan: false}}},methods: {handleClick() {this.animate.gold = !this.animate.gold;this.animate.cyan = !this.animate.cyan;}},template: `<div :class='animate'>hello</div><button @click='handleClick'>切换</button>`
});

  • 以上是通过设置class属性实现的,同样通过设置style属性也可以实现:
/* css */
.transition {transition: background-color 3s linear 0s;
}
// js
data() {return {transition: 'transition',styleObject: {backgroundColor: 'gold'}}
},
methods: {handleClick() {if(this.styleObject.backgroundColor === 'gold'){this.styleObject.backgroundColor = 'cyan';}else{this.styleObject.backgroundColor = 'gold';}}
},
template: `<div :class='transition' :style='styleObject'>hello</div><button @click='handleClick'>切换</button>
`

三、使用transition标签实现单元素/组件的过渡和动画效果

1. transition 的基本介绍

  • <transition> 元素作为单个元素/组件的过渡效果。
  • <transition> 只会把过渡效果应用到其包裹的内容上,而不会额外渲染 DOM 元素,也不会出现在可被检查的组件层级中。

2. transition 的过渡class

在进入/离开的过渡中,会有 6 个 class 切换:

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

3. 过渡示例

  • 将需要过渡的元素使用transition标签包裹。
  • 设置过渡需要的class,可从以上六种class中选择。
/* css */
/* .v-enter-from {opacity: 0;
}
.v-enter-active {transition: opacity 1s ease;
}
.v-enter-to {opacity: 1;
}
.v-leave-from {opacity: 1;
}
.v-leave-active {transition: opacity 1s ease;
}
.v-leave-to {opacity: 0;
} */
/* 简写 */
.v-enter-from, .v-leave-to{opacity: 0;
}
.v-enter-active, .v-leave-active{transition: opacity 1s ease;
}
// js
const app = Vue.createApp({data() {return {show: true}},methods: {handleClick() {this.show = !this.show;}},template: `<transition><div v-if='show'>hello</div></transition><button @click='handleClick'>切换</button>`
});

4. 动画示例

  • 使用动画效果只需要修改css部分,js部分功能不变。
/* css */
@keyframes shake-in {0% {transform: translateX(-50px);}50% {transform: translateX(50px);}100% {transform: translateX(0px);}
}
@keyframes shake-out {0% {transform: translateX(50px);}50% {transform: translateX(-50px);}100% {transform: translateX(0px);}
}
.v-enter-active{animation: shake-in 1s ease-in;
}
.v-leave-active{animation: shake-out 1s ease-in-out;
}

5. transition的name属性

  • name - string :用于自动生成 CSS 过渡类名,不写默认是v。
  • name设置为hy,对应的class名称也要改为hy开头。
// js
<transition name='hy'><div v-if='show'>hello</div>
</transition>
/* css */
.hy-enter-from, .hy-leave-to{opacity: 0;
}
.hy-enter-active, .hy-leave-active{transition: opacity 1s ease;
}

6. 自定义过渡类名

我们可以通过以下 attribute 来自定义过渡类名:

  • enter-from-class
  • enter-active-class
  • enter-to-class
  • leave-from-class
  • leave-active-class
  • leave-to-class

他们的优先级高于普通的类名,这对于 Vue 的过渡系统和其他第三方 CSS 动画库,如 Animate.css. 结合使用十分有用。

// 首先引入样式文件
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />const app = Vue.createApp({data() {return {show: true}},methods: {handleClick() {this.show = !this.show;}},// 以自定义过渡类名的方式去添加动画样式template: `<transition name='hy' enter-active-class='animate__animated animate__bounce'leave-active-class='animate__animated animate__bounce'><div v-if='show'>hello</div></transition><button @click='handleClick'>切换</button>`
});

7. 同时设置过渡和动画

  • 在一些场景中,你需要给同一个元素同时设置过渡和动画,比如 animation 很快的被触发并完成了,而 transition 效果还没结束。
  • 在这种情况中,你就需要使用 type attribute 并设置 animation 或 transition 来明确声明你需要 Vue 监听的类型。
  • type - string。指定过渡事件类型,侦听过渡何时结束。有效值为 "transition" 和 "animation"。默认 Vue.js 将自动检测出持续时间长的为过渡事件类型。

在transition时间更长时,使用type=‘transiton’的效果:

  • 可以发现animation先完成,但transition并没有终止会一致执行完,元素才消失。
/* css */
@keyframes shake-in {0% {transform: translateX(-50px);}50% {transform: translateX(50px);}100% {transform: translateX(0px);}
}@keyframes shake-out {0% {transform: translateX(50px);}50% {transform: translateX(-50px);}100% {transform: translateX(0px);}
}.v-enter-from,
.v-leave-to {color: red;
}.v-enter-active {animation: shake-in 1s ease-in;transition: color 3s ease-in;
}.v-enter-to, .v-leave-from {color: green;
}.v-leave-active {animation: shake-out 1s ease-in-out;transition: color 3s ease-in-out;
}
// js
const app = Vue.createApp({data() {return {show: true}},methods: {handleClick() {this.show = !this.show;}},template: `<transition type='transition'><div v-if='show'>hello</div></transition><button @click='handleClick'>切换</button>`
});

 在transition时间更长时,使用type=‘animation’的效果:

  • 可以发现animation完成后,transition也会立即终止,元素也消失了。
<transition type='animation'><div v-if='show'>hello</div>
</transition>

8. duration 属性

  • duration - number | { enter: number, leave: number }:指定过渡的持续时间。
  • 比css中设置的时间优先级更高。
  • 单位是:ms。
<transition :duration='100' ><div v-if='show'>hello</div>
</transition >
  • 你也可以定制进入和移出的持续时间:
<transition :duration='{ enter: 1000, leave: 3000 }' ><div v-if='show'>hello</div>
</transition >

9. 使用js实现动画

  • 当只用 JavaScript 过渡的时候,在 enter 和 leave 钩中必须使用 done 进行回调。否则,它们将被同步调用,过渡会立即完成。
  • 添加 :css="false",也会让 Vue 会跳过 CSS 的检测,除了性能略高之外,这可以避免过渡过程中 CSS 规则的影响。

想要用js实现动画,可以在transition的 attribute 中声明 JavaScript 钩子:

@before-enter="beforeEnter"进入过渡前
@enter="enter"进入过渡时
@after-enter="afterEnter"进入过渡后
@enter-cancelled="enterCancelled"进入过渡被打断时
@before-leave="beforeLeave"离开过渡前
@leave="leave"离开过渡时
@after-leave="afterLeave"离开过渡后
@leave-cancelled="leaveCancelled"离开过渡被打断时
const app = Vue.createApp({data() {return {show: true}},methods: {handleClick() {this.show = !this.show;},handleBeforeEnter(el){el.style.color = 'red';},handleEnter(el, done){const timer = setInterval(()=>{if(el.style.color === 'red'){el.style.color = 'blue';}else{el.style.color = 'red';}}, 1000);setTimeout(()=>{clearInterval(timer);// 动画结束标志// 不执行done()的话,handleAfterEnter不会执行done();}, 3000)},handleAfterEnter(el){console.log('success');;}},template: `<transition :css='false'@before-enter='handleBeforeEnter'@enter='handleEnter'@after-enter='handleAfterEnter'><div v-if='show'>hello</div></transition><button @click='handleClick'>切换</button>`
});

四、组件和元素切换动画的实现

  • mode - string 控制离开/进入过渡的时间序列。
  • 有效的模式有 先出后进: "out-in" 和 先进后出:"in-out"默认同时进行。
  • 可以通过 appear attribute 设置节点在初始渲染的过渡。
/* css */
.v-enter-from,
.v-leave-to {opacity: 0;
}.v-enter-active,
.v-leave-active {transition: opacity 1s ease-in;
}.v-enter-to,
.v-leave-from {opacity: 1;
}
// js
const app = Vue.createApp({components: ['item-a', 'item-b'],data() {return {component: 'item-a'}},methods: {handleClick() {if (this.component === 'item-a') {this.component = 'item-b';} else {this.component = 'item-a';}}},template: `<transition mode='out-in' appear><component :is='component' /></transition><button @click='handleClick'>切换</button>`
});
app.component('item-a', {template: `<div>hello</div>`
});
app.component('item-b', {template: `<div>bye</div>`
});

五、列表动画

  • 使用 <transition-group> 组件,可以同时渲染整个列表。
  • 内部元素总是需要提供唯一的 key attribute 值。
  • CSS 过渡的类将会应用在内部的元素中,而不是这个组/容器本身。
  • <transition-group> 组件还有一个特殊之处。不仅可以进入和离开动画,还可以改变定位。要使用这个新功能只需使用新增的 v-move 类。
/* css */
.inline-block {display: inline-block;margin-right: 10px;
}.v-enter-from,
.v-leave-to {opacity: 0;transform: translateY(30px);
}.v-enter-active {transition: all 1s ease;
}.v-leave-active {position: absolute;
}.v-move {transition: all 1s ease;
}
// js
const app = Vue.createApp({data() {return {list: [1, 2, 3]}},methods: {handleClick() {this.list.unshift(this.list.length + 1);},handleClickLeave(){this.list.shift();}},template: `<transition-group><div class='inline-block' v-for='item in list' :key='item'>{{item}}</div></transition-group><button @click='handleClick'>添加</button><button @click='handleClickLeave'>删除</button>`
});

六、状态动画

  • 对于数据元素本身而言,通过数字和运算、颜色的显示、SVG 节点的位置、元素的大小和其他的 property 这些属性的变化,同样可以实现动画的效果。
  • 数字变化示例:
const app = Vue.createApp({data() {return {number: 1}},methods: {handleClick() {const timer = setInterval(() => {if (this.number >= 10) {clearInterval(timer)}else{this.number++;}}, 100);}},template: `<div>{{number}}</div><button @click='handleClick'>增加</button>`
});

 


http://chatgpt.dhexx.cn/article/EihVmZ3T.shtml

相关文章

CSS动画过渡

CSS动画过渡: 过渡transition,我们可以在不使用 Flash 动画或 JavaScript 的情况下&#xff0c;当元素从一种样式变换为另一种样式时为元素添加效果. 要实现这一点&#xff0c;必须规定两项内容&#xff1a;1.规定希望把效果添加到哪个 CSS 属性上&#xff0c;2.规定效果的时长…

CSS 过渡效果

简述: CSS过渡&#xff0c;就是样式发生变化时&#xff0c;可以看上去更自然&#xff0c;更柔和。想让哪个盒子有过渡样式&#xff0c;就把transition属性加在那个盒子上。 语法: 属性描述取值范围transition-property应用过渡效果的 CSS 属性名CSS属性都可以(all, width, co…

css的过渡特效

在web端&#xff0c;我们实现很多有意思的效果&#xff0c;比如&#xff1a;元素的淡入淡出、菜单滑入颜色切换等等效果。 那这些效果最简单的方式就是过渡【transitions】&#xff0c;过渡是一个变化时。css的过渡&#xff0c;可以使用‘ease’来描述这个变化的状态。 trans…

CSS transition(过渡效果)

1. transition-property transition-property 属性用来设置元素中参与过渡的属性名称&#xff0c;语法格式如下&#xff1a; transition-property: none | all | property; 参数说明如下&#xff1a; none&#xff1a;表示没有属性参与过渡效果&#xff1b;all&#xff1a;…

CSS——过渡与动画

1. 缓动效果 给过渡和动画加上缓动效果&#xff08;比如具有回弹效果的过渡过程&#xff09; 回弹效果是指当一个过渡达到最终值时&#xff0c;往回倒一点&#xff0c;然后再次回到最终值&#xff0c;如此往复一次或多次&#xff0c;并逐渐收敛&#xff0c;最终稳定在最终值。…

CSS过渡效果、变形效果以及动画

一、CSS的过渡&#xff1a;&#xff1a;从一个样式变化到另一个样式 1、transition-property&#xff1a;指定过渡的属性 属性值作用none没有任何属性会获得过渡效果all所有属性都将获得过渡效果property定义应用过渡效果的CSS属性名称&#xff0c;多个名称之间以逗号分隔 2…

CSS过渡,转换与动画

目录 过渡(transition) 转换(transform) 什么是转换 二维坐标系 移动&#xff08;translate&#xff09; 用translate实现居中 旋转&#xff08;rotate&#xff09; 设置旋转中心点 缩放&#xff08;scale&#xff09; 使用 设置缩放中心点 动画 用keyframes定义动…

CSS过渡-Transitions

目录 过渡三要素 过渡触发 属性&#xff1a; 实例运用&#xff1a; 1.过渡时间曲线动画 2.文字放大效果 3.手风琴 4. 米兔过渡 CSS transitions 可以决定哪些属性发生动画效果 (明确地列出这些属性)&#xff0c;何时开始 (设置 delay&#xff09;&#xff0c;持续多久 …

CSS过渡动画

css中实现动画有两种方式&#xff1a;transition过渡动画、 animation自定义动画。 transition 是 css3 新增的⼀个功能&#xff0c;可以实现元素不同状态间的平滑过渡&#xff08;当元素从⼀个状态进⼊到另⼀个状态时&#xff09;&#xff0c;经常⽤来制作⼀些动画效果。 之…

CSS中过渡效果(transition)

CSS中过渡效果&#xff08;transition&#xff09; 过渡&#xff08;无继承性&#xff09;1、transition-property属性2、transition-duration属性3、transition-timing-function属性4、transition-delay属性5、transition属性 兼容性练习总结 过渡&#xff08;无继承性&#x…

CSS过渡

CSS过渡 1. 什么是过渡2. 可以参与过渡的属性有哪些3. 缓动效果 1. 什么是过渡 在 CSS 中&#xff0c;过渡属性&#xff1a;transition 过渡可以为一个元素在不同样式之间变化自动添加 ”补间动画“ 相比于用 JavaScript 实现过渡&#xff0c;用 CSS 优点&#xff1a;  …

CSS系列之过渡 transition(CSS3)

文章の目录 1、transition1.1、概述1.2、值的组成 2、transition-property2.1、属性值 3、transition-duration3.1、属性值 4、transition-timing-function4.1、属性值 5、transition-delay5.1、属性值 写在最后 过渡&#xff08;transition)是CSS3中具有颠覆性的特征之一&…

CSS transition(过渡效果)详解

CSS transition&#xff08;过渡效果&#xff09;详解 通常当 CSS 的属性值更改后&#xff0c;浏览器会立即更新相应的样式&#xff0c;例如当鼠标悬停在元素上时&#xff0c;通过 :hover 选择器定义的样式会立即应用在元素上。在 CSS3 中加入了一项过渡功能&#xff0c;通过该…

#HTML5-CSS-transition-过渡特效

CSS过渡特效 概述   在CSS中用于设置过渡特效的属性是 transition&#xff0c;该属性允许CSS的属性值在一定的时间区间内平滑地过渡&#xff0c;这就拜托了我们在CSS3版本标准之前对“JavaScript”和“Flash”的依赖&#xff0c;使页面的性能得以提升。这种效果可以在鼠标悬…

Windows系统_ARM处理器无法打开客户端问题解决

问题现象&#xff1a;客户端无法打开 用户环境&#xff1a;Windows系统 ARM处理器 问题定位&#xff1a;兼容性问题 解决方法&#xff1a; 右键客户端&#xff0c;点击“属性”选择“兼容性”&#xff0c;点击“更改所有用户的设置” 选择“更改仿真设置” 勾选设置如下&a…

每日三问之rem与em区别、Vue Set基本用法与使用场景、手写call、apply、bind方法

rem与em区别 在css中单位长度用的最多的是px、em、rem&#xff0c;这三个的区别是&#xff1a; px是固定的像素&#xff0c;一旦设置了就无法因为适应页面大小而改变。em和rem相对于px更具有灵活性&#xff0c;他们是相对长度单位&#xff0c;意思是长度不是定死了的&#xf…

IntelliJ 代码规范检查设置

IntelliJ → Preferences → Code Style → Inspections 在这里可以设置各种文件格式的规范检查 安装了阿里代码规约插件以后就会多出一项 Ali-Check &#xff08;请先安装阿里的代码规约插件 IntelliJ 代码规范检查插件&#xff09; 为了让大家统一规范规则&#xff0c;我们…

macOS借助vmware隔离运行aTrust,实现宿主机“干净”连入局域网

aTrust是深信服原easyconnect的升级产品&#xff0c;重点打造了一个“零信任”的概念&#xff0c;就是这个概念让我头皮发麻&#xff0c;其在官网直接挂着 终端检测深入&#xff1a;支持进程级检测&#xff0c;可发现和阻止终端上非可信应用进程&#xff1b;在登录时、每一次访…

基于云开发的答题活动小程序v2.0-用云开发的聚合能力实现从题库中随机出题功能

项目技术栈 微信原生小程序云开发。为什么选择微信原生小程序进行开发呢&#xff1f;因为能够直接应用它的云开发能力吖。 我这里主要使用了云开发能力中的小程序端SDK&#xff0c;说白了就是在javascript中就能直接操作数据库。 本篇前言 基于云开发的答题活动小程序v2.0的…

国内唯一!腾讯零信任iOA入选全球UEM厂商全景图

近日&#xff0c;国际权威机构Forrester发布《The Unified Endpoint Management Landscape, Q3 2023》&#xff08;以下简称“报告”&#xff09;&#xff0c;对全球24家统一终端管理厂商进行了综合性评估&#xff0c;腾讯安全凭借零信任iOA在DEX&#xff08;数字化员工体验&am…