Animation,Transition 与 Transform,以及 Vue 动画详解

一、CSS 动画基础:Transition 和 Transform 

1. transition 属性详解

transition: [property] [duration] [timing-function] [delay];
属性详解:
属性名说明示例
transition-property要过渡的属性名(可多个)transition-property: transform, opacity;
transition-duration动画持续时间(单位:s/ms)transition-duration: 0.3s;
transition-timing-function动画节奏函数(缓动曲线)transition-timing-function: ease-in-out;
transition-delay延迟时间transition-delay: 0.1s;
常用的 timing-function 取值:
效果
ease默认,慢-快-慢
linear匀速
ease-in加速进入
ease-out减速退出
ease-in-out先加速后减速
cubic-bezier(x1, y1, x2, y2)自定义贝塞尔曲线

示例:

.box { transition: transform 0.3s ease-in-out 0s; }

2. transform 属性详解

transform: function(value);

常见的变换函数及示例:
函数名功能示例
translate(x, y)平移(支持 px, %translate(10px, 20px)
translateX(x) / translateY(y)水平/垂直移动translateX(100%)
scale(x, y)缩放(默认中心点)scale(1.2, 1.2)
scaleX(x) / scaleY(y)单轴缩放scaleY(0.8)
rotate(angle)旋转,单位 degradrotate(45deg)
skew(x-angle, y-angle)倾斜skew(10deg, 5deg)
matrix(a, b, c, d, e, f)矩阵变换(高级)matrix(1, 0, 0, 1, 0, 0)
.box:hover { transform: scale(1.1) rotate(10deg) translateX(5px); }

animation :

它实际上是下面这些属性的缩写形式:

animation: 
animation-name 
animation-duration 
animation-timing-function 
animation-delay 
animation-iteration-count 
animation-direction 
animation-fill-mode 
animation-play-state;

你可以只写一部分,浏览器会使用默认值。


🔧 各子属性解释

子属性作用示例
animation-name指定要使用的关键帧名称fadeIn
animation-duration动画持续时间2s500ms
animation-timing-function动画节奏easelinearease-in-outcubic-bezier(...)
animation-delay动画延迟开始的时间1s
animation-iteration-count播放次数infinite12
animation-direction动画方向normalreversealternate
animation-fill-mode动画结束后元素状态forwardsbackwardsbothnone
animation-play-state控制动画播放或暂停runningpaused
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

.box {
  animation: fadeIn 2s ease-in-out forwards;
}

上面这段代码的意思是:元素 .box 在加载后会用 fadeIn 关键帧在 2 秒内从透明变为不透明,采用 ease-in-out 的节奏,并在动画结束后保持最后的状态(forwards)。

是不是觉得animation和transition很像,但是其实他们是有不同的应用场景的

场景推荐方案原因
简单状态变化(如悬停、点击)transition代码简洁,性能开销小
复杂动画序列(如弹跳、旋转)animation无需依赖外部状态,可独立控制
需要暂停 / 恢复动画animation + JS通过 animation-play-state: paused/running 控制
仅需触发一次的动画transition无需定义 @keyframes,更轻量

 总结

  1. 选 transition:如果动画是由用户交互(如点击、悬停)触发,且只需从 A 状态到 B 状态的简单过渡。
  2. 选 animation:如果动画需要自动播放、循环执行,或需要多阶段复杂控制(如弹跳、摇摆)。

二、Vue 动画详解

1. <transition> 组件的工作机制

Vue 会自动为进入和离开的元素添加 CSS 类名。

类名规范(假设 name="fade"):
类名生命周期说明
.fade-enter-from进入前初始状态(例如 opacity: 0)
.fade-enter-active进入期间设置过渡属性(如 transition)
.fade-enter-to进入后目标状态(例如 opacity: 1)
.fade-leave-from离开前当前状态(例如 opacity: 1)
.fade-leave-active离开期间设置离开的过渡属性
.fade-leave-to离开后目标状态(例如 opacity: 0)
<template>
  <button @click="show = !show">Toggle</button>
  <transition name="fade">
    <div v-if="show" class="box">Hello Vue!</div>
  </transition>
</template>

<style>
.fade-enter-from, .fade-leave-to {
  opacity: 0;
  transform: translateY(20px);
}
.fade-enter-to, .fade-leave-from {
  opacity: 1;
  transform: translateY(0);
}
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.4s ease, transform 0.4s ease;
}
</style>

2. <transition> 的配置属性

属性类型说明
nameString自动生成类名前缀
appearBoolean初次渲染是否应用动画
modeString动画切换顺序,out-inin-out
typeStringanimationtransition(可选)
durationNumber/Object自定义动画时长,防止“闪现”

 例子

<transition name="fade" mode="out-in" appear :duration="500">
  <div v-if="visible">展示内容</div>
</transition>

3. JavaScript 钩子函数

如果你不想依赖 CSS,可以完全使用 JavaScript 控制:

<transition
  @before-enter="beforeEnter"
  @enter="enter"
  @after-enter="afterEnter"
  @leave="leave"
>
  <div v-if="show">动画内容</div>
</transition>

<script>
export default {
  methods: {
    beforeEnter(el) {
      el.style.opacity = 0;
    },
    enter(el, done) {
      setTimeout(() => {
        el.style.transition = 'opacity 0.5s';
        el.style.opacity = 1;
        done(); // 动画完成时必须调用
      }, 0);
    },
    afterEnter(el) {
      console.log('进入动画完成');
    },
    leave(el, done) {
      el.style.transition = 'opacity 0.5s';
      el.style.opacity = 0;
      setTimeout(done, 500); // 动画持续时间匹配
    }
  }
};
</script>

 4. 列表动画 <transition-group>

<transition-group name="list" tag="ul">
  <li v-for="item in items" :key="item.id">{{ item.text }}</li>
</transition-group>

<style>
.list-enter-from, .list-leave-to {
  opacity: 0;
  transform: translateY(20px);
}
.list-enter-active, .list-leave-active {
  transition: all 0.3s ease;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值