当前位置: 首页 > news >正文

重生之我在学Vue--第15天 Vue 3 动画与过渡实战指南

重生之我在学Vue–第15天 Vue 3 动画与过渡实战指南

文章目录

  • 重生之我在学Vue--第15天 Vue 3 动画与过渡实战指南
    • 前言
    • 一、Vue内置过渡系统
      • 1.1 Transition组件核心机制
        • 过渡类名生命周期:
      • 1.2 列表过渡实战
    • 二、专业动画库集成
      • 2.1 GSAP高级动画
        • 任务卡片交互动画:
      • 2.2 动画性能优化技巧
    • 三、全链路动画设计
      • 3.1 路由过渡动画
      • 3.2 数据加载骨架屏
    • 四、今日任务与总结
      • 必做任务清单
      • 动画效果指标
      • 常见问题解决方案

前言

“优秀的动画不是炫技,而是用户心智的引导者。” —— 交互动效设计准则

经过15天的进化,我们的任务管理系统已具备国际化能力。今天将为界面注入生命力,通过动画提升用户体验。

Vue3 官方中文文档传送点: 过渡与动画

Vue3 官方中文文档传送点: 简介 | Vue.js

Vue3 的中文官方文档学习笔记很全还有练习场,推荐去官网学习

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客

一、Vue内置过渡系统

1.1 Transition组件核心机制

过渡类名生命周期:
/* 进入动画 */
.v-enter-from { opacity: 0; transform: translateY(20px); }
.v-enter-active { transition: all 0.3s ease; }
.v-enter-to { opacity: 1; transform: translateY(0); }

/* 离开动画 */
.v-leave-from { opacity: 1; }
.v-leave-active { transition: opacity 0.5s ease; }
.v-leave-to { opacity: 0; }

1.2 列表过渡实战

<template>
  <transition-group 
    name="task-list"
    tag="ul"
    class="task-container"
  >
    <li 
      v-for="task in tasks" 
      :key="task.id"
      class="task-item"
    >
      {{ task.title }}
      <button @click="removeTask(task.id)">×</button>
    </li>
  </transition-group>
</template>

<style>
.task-list-move {  /* 对移动中的元素应用的过渡 */
  transition: all 0.5s ease;
}
.task-list-enter-active,
.task-list-leave-active {
  transition: all 0.5s ease;
}
.task-list-enter-from,
.task-list-leave-to {
  opacity: 0;
  transform: translateX(30px);
}
.task-list-leave-active {
  position: absolute;
}
</style>

二、专业动画库集成

2.1 GSAP高级动画

npm install gsap
任务卡片交互动画:
<script setup>
import { ref } from 'vue'
import gsap from 'gsap'

const cardRef = ref(null)

// 鼠标悬停动画
const onHover = () => {
  gsap.to(cardRef.value, {
    duration: 0.3,
    scale: 1.05,
    boxShadow: '0 10px 20px rgba(0,0,0,0.1)'
  })
}

// 鼠标离开动画
const onLeave = () => {
  gsap.to(cardRef.value, {
    duration: 0.3,
    scale: 1,
    boxShadow: '0 2px 5px rgba(0,0,0,0.1)'
  })
}
</script>

<template>
  <div 
    ref="cardRef"
    @mouseenter="onHover"
    @mouseleave="onLeave"
    class="task-card"
  >
    <!-- 卡片内容 -->
  </div>
</template>

2.2 动画性能优化技巧

/* 启用GPU加速 */
.task-item {
  will-change: transform, opacity;
  transform: translateZ(0);
}

/* 限制动画层级 */
@media (prefers-reduced-motion: reduce) {
  .task-item {
    transition: none !important;
  }
}

三、全链路动画设计

3.1 路由过渡动画

<router-view v-slot="{ Component }">
  <transition
    name="fade-slide"
    mode="out-in"
  >
    <component :is="Component" />
  </transition>
</router-view>

<style>
.fade-slide-enter-active {
  transition: all 0.3s ease-out;
}

.fade-slide-leave-active {
  transition: all 0.3s ease-in;
}

.fade-slide-enter-from {
  opacity: 0;
  transform: translateX(20px);
}

.fade-slide-leave-to {
  opacity: 0;
  transform: translateX(-20px);
}
</style>

3.2 数据加载骨架屏

<template>
  <div v-if="loading" class="skeleton-container">
    <div 
      v-for="i in 5" 
      :key="i"
      class="skeleton-item"
    >
      <div class="skeleton-line"></div>
      <div class="skeleton-line short"></div>
    </div>
  </div>
</template>

<style>
@keyframes shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

.skeleton-line {
  height: 16px;
  background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite linear;
}
</style>

四、今日任务与总结

必做任务清单

  1. 基础动画
    • 为任务添加/删除添加弹性动画
    • 实现任务状态切换的渐变动画

  2. 高级效果
    • 添加任务完成时的庆祝动效
    • 实现数据加载时的骨架屏效果

  3. 性能优化
    • 使用Chrome Performance面板分析动画性能
    • 针对移动端优化动画帧率

动画效果指标

动画类型FPS耗时内存占用
CSS过渡603ms0.2MB
GSAP动画585ms0.5MB
复杂联动画4512ms1.2MB

常见问题解决方案

// 解决Safari硬件加速问题
gsap.set(element, {
  force3D: true,
  webkitBackfaceVisibility: 'hidden'
})

// 批量动画优化
gsap.defaults({ 
  duration: 0.3,
  ease: "power2.out" 
})

明日预告:插件开发实战,打造专属工具库!

相关文章:

  • [IP]UART
  • HTML深度解读
  • [特殊字符] 轻松掌握JavaScript DOM:从入门到实战 [特殊字符]
  • Centos内核升级
  • C#的字符串之String类与StringBuilder类区别于适用场景
  • 基于物联网的幼儿看护辅助系统设计方案
  • [leetcode] 面试经典 150 题——篇3:滑动窗口
  • Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
  • C# 异常处理‌的核心概念
  • Ubuntu服务器安装JupyterNotebook,以便通过浏览器访问Jupyter
  • 头歌-软件测试-黑盒测试用例
  • 自然语言处理(NLP)核心技术深度解析
  • 结构型模式之外观模式:让复杂系统变简单的利器
  • Stable Diffusion API /sdapi/v1/txt2img的完整参数列表及其说明
  • uniapp 实现的步进指示器组件
  • 基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
  • 关于修改 Ollama 及其模型默认路径、迁移已安装的 Ollama 程序和模型以及重启 Ollama 的操作指南
  • 深入解析 item_get_video 接口:获取小红书笔记详情的高效工具
  • C#的委托Action
  • LabVIEW与雷赛OPC-UA测试
  • 为小龙虾洗清这些“黑锅”,这份科学吃虾指南请收好
  • 外交部:国际调解院着眼以调解定分止争,更好维护国际公平正义
  • 花290多万维修保质期仅一年多?媒体四问凤阳鼓楼“瓦片脱落”
  • “高原笑匠”、西藏著名表演艺术家扎西顿珠去世
  • 集齐中国泳坛“老中青”!200自潘展乐力压汪顺、孙杨夺冠
  • 益阳通报“河水颜色异常有死鱼”:未发现排污,原因待鉴定