Vue3的transition标签以及animate.css使用详解

一:前言

        在项目开发中,有一种特殊情况是使用动画过渡去完成某个效果。比如淡入淡出,或者在动画完成后执行某些操作等。在以前开发中我们通常会选择使用 CSS3 进行研发。但是这样会有很多不好的地方,比如最原始化的封装,以及复杂需求下的代码量庞大且冗余。再者就是本可以不使用 CSS 样式的文件又添加了 CSS 文件。这样是很奇怪的。

        因此我们现在在进行动画过渡可以使用别人写好提供给我们的 animate.css 样式。而在 Vue3 开发中,当我们需要在动画过渡前中后或者被中断的时候执行某些 JS 逻辑时,可以使用 transition 标签。接下来,让我们来看一下如何这两个如何使用吧!

二:使用

1、animate.css

        先放上 animate.css 的官网:

Animate.css | A cross-browser library of CSS animations.Animate.css is a library of ready-to-use, cross-browser animations for you to use in your projects. Great for emphasis, home pages, sliders, and attention-guiding hints.icon-default.png?t=N7T8https://animate.style/        进入官网后我们可以在右侧看到有很多动画的样式,随便点击一个样式后,中间的文字会进行相对应的变化。

        引入项目:

  • 首先打开项目,在项目根目录下打开 powershell 
  • 输入 npm install animate.css -S
  • 等待安装成功后,进入你需要使用的页面
  • 在文件内引入:import 'animate.css';
  • 在官网中复制喜欢的样式,放进你需要添加的标签的 class 中
  • 注意,上面这一步需要在复制的前面加上 animate_animated 才可以有效果
<div class="animate__animated animate__bounceOutDown" v-if="isShow">内容</div>


<script>
    // 引入animate.css
    import 'animate.css';
</script>

        这时候我们就可以看到效果了。animate.css 的使用是很简单的。

2、transition 标签

        这个标签是内置的,我们直接在 html 中书写即可,我们可以看到代码提示:这代表着,他是有多个接收值的,并且有多个内置方法。知道这些我们就方便写后面的代码了。

1)初始化代码

         这里是我们代码的初始化,代码效果如下图所示:点击按钮显示或者隐藏里面的元素

<template>
    <div class="home">
        <button @click="isShow = !isShow">切换状态</button>
        <transition>
            <div v-if="isShow" class="content"></div>
        </transition>
    </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';

const isShow = ref(false)
</script>

<style scoped>
.content {
    margin-top: 10px;
    width: 300px;
    height: 300px;
    background: pink;
}
</style>

2)第一种:直接使用变量进行控制

        这种是比较简单的方法,如下面代码所示,我们传了,进入和离开的样式。这样的优点是结合 animate.css 代码行数比较少,且具有较高的阅读性,方便后期修改和维护。但是有一个不好的地方就是,这样只是定义了单纯的动画过渡,如果书写逻辑将会很繁琐,需要定义 ref 等等,这里我就不举例了。因此产生了使用方法控制。

        <transition :duration="500"
            leave-active-class="animate__animated animate__bounceOutDown"
            enter-active-class="animate__animated animate__bounceInLeft">
            <div v-if="isShow" class="content"></div>
        </transition>
3)第二种:使用内置方法进行控制

        代码如下,我们可以看到,这八个内置方法其实是八个生命周期。以进入为例,四个分别是进入前,进入中,进入后,进入中断。这样我们可以在不同的周期中写不同的逻辑,是不是很方便了?

        这里额外注意一下,各个周期中的 el 是接收的这个 element 元素,另外有两个特殊的周期是 enter 和 leave 。这两个的参数中有接收 done 当执行了这个 done 方法后,才会执行 enter-after 声明周期。leave 同理。

<template>
    <div class="home">
        <button @click="isShow = !isShow">切换状态</button>
        <transition :duration="500"
            @before-enter="EnterBefore"
            @enter="EnterActive"
            @after-enter="EnterTo"
            @enter-cancelled="EnterCancelled"
            @before-leave="LeaveForm"
            @leave="Leave"
            @after-leave="LeaveTo"
            @leave-cancelled="LeaveCancell">
            <div v-if="isShow" class="content"></div>
        </transition>
    </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';

const isShow = ref(false)

const EnterBefore = (el:Element)=>{
    console.log('进入前');

}
const EnterActive = (el:Element,done:Function)=>{
    console.log('进入中');
    setTimeout(()=>{
        done() // 执行完成,要等待三秒钟才会执行下面这个过度完成的方法
    },3000)
}
const EnterTo = (el:Element)=>{
  console.log('过度完成');
}
const EnterCancelled = (el:Element)=>{
  console.log('过渡效果被打断');
}

// 离开
const LeaveForm = (el:Element)=>{
  console.log('离开之前');
}
const Leave = (el:Element,done:Function)=>{
  console.log('离开过度曲线');
  setTimeout(()=>{
    done() // 执行完成,要等待三秒钟才会执行下面这个过度完成的方法
  },3000)
}
const LeaveTo = (el:Element)=>{
  console.log('离开完成');
}
const LeaveCancell = (el:Element)=>{
  console.log('离开被打断');
}
</script>

4)使用 jasp 进行优化
  • 使用 npm i gsap -S 安装jasp
  • 在项目中使用 import jasp from 'gasp' 导入

        项目代码优化如下,我们本次只使用三个生命周期。这时,我们看到的应该是一个在左上角缩放的图,由于没有装转 git 工具,因此这里不放效果 git 图。各位小伙伴可以在项目里 安装 animate 和 gasp 后直接将下面的代码复制进页面即可看到效果。

<template>
    <div class="home">
        <button @click="isShow = !isShow">切换状态</button>
        <transition :duration="500"
            @before-enter="EnterBefore"
            @enter="EnterActive"
            @leave="Leave">
            <div v-if="isShow" class="content"></div>
        </transition>
    </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import gsap from 'gsap' // npm i gsap -S

const isShow = ref(false)

const EnterBefore = (el:Element)=>{
    console.log('进入前');
        gsap.set(el,{
        width:0,
        height:0
    })
}
const EnterActive = (el:Element,done:gsap.Callback)=>{
    console.log('进入中');
    gsap.to(el,{
        width:300,
        height:300,
        onComplete:done // 加载完成后调用 done 方法
    })
}


// 离开
const Leave = (el:Element,done:gsap.Callback)=>{
    console.log('离开过度曲线');
    gsap.to(el,{
        width:0,
        height:0,
        onComplete:done
    })
}

</script>

<style scoped>
.content {
    margin-top: 10px;
    background: pink;
}
</style>

三:结尾

        过渡效果可以说在开发中算是比较重要的一部分。熟练的掌握图像过渡可以更加合理贴切的显示与隐藏,在视觉上给用户更好的体验。并且书写逻辑也方便,可以类似断点的形式去定位问题出现的地方。好啦以上就是本文的全部内容,希望能够对各位小伙伴有所收获哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/198839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot实现图片上传和展示

Spring Boot实现图片上传和展示 本文将介绍如何使用Spring Boot框架搭建后端服务&#xff0c;实现接收前端上传的图片并保存到resources/images目录下。同时&#xff0c;我们还将展示如何在前端编写一个HTML页面&#xff0c;实现上传图片和从resources/images目录下获取图片并…

Minecraft Modding 模组制作-自定义方块

目录 自定义方块一般方块定义物品所属类注册方块注册方块对应物品添加材质添加各面不同的材质本地化 更多样的方块的实现方式会在之后陆续更新参考打赏 注意&#xff1a;本文代码只表现个人实现方式及习惯&#xff0c;本文解释只体现个人理解&#xff0c;不一定符合规范&#x…

【并发编程】ConcurrentHashMap底层结构和原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

MySQL进阶知识:二

目录 视图 基本语法 视图的更新 视图的作用 存储过程 介绍 存储过程基本语法 存储过程的变量 系统变量 用户自定义变量 局部变量 存储过程的判断逻辑 存储过程的参数 存储过程中的流程控制 存储过程中的循环 while的基本语法 repeat的基本语法 loop的基本语法…

Flink-执行拓扑图与作业调度

算子与作业提交 一、Flink执行模式1.流执行模式2.批执行模式 二、Flink拓扑图1.基本概念2.拓扑图生成过程 三、拓扑生成和优化1.应用程序2.逻辑视图3.算子链4.Task Slots 四、作业调度1.调度2.拓扑图数据结构3.Job状态转化4.Task状态转化 总结参考链接 一、Flink执行模式 Flin…

Python语言学习笔记之四(Python文档化)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 Python文档化是指在Python代码中添加注释和文档字符串&#xff0c;以提供有关代码的详细信息和说明。 文档的…

这个变量要不要用volatile修饰呢?

正文 大家好&#xff0c;又见面了&#xff0c;我是bug菌~ 在嵌入式软件开发过程中&#xff0c;如果对volatile不熟&#xff0c;那可以你应该是个"假嵌入式程序员"&#xff0c;因为一个变量需不需要使用volatile考虑的场景挺多的&#xff0c;如果在某些场景下乱用&…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…

使用STM32微控制器实现光电传感器的接口和数据处理

光电传感器在许多领域中被广泛应用&#xff0c;例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案&#xff0c;包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤&#xff0c;并给出相应的代码示例。 一、引言 光…

深入浅出 Vue 中的插槽 slot

深入浅出 Vue 中的插槽 slot start 最近被问到好几次 Vue 中的插槽相关知识&#xff0c;掌握的还是有些不全面。抱着重新学习的心态&#xff0c;写这篇博客。首先对基础知识做一个回顾&#xff0c;然后再对源码实现做一个学习。作者&#xff1a;番茄编写时间&#xff1a;2023…

【藏经阁一起读】(78)__《Apache Tomcat 的云原生演进》

【藏经阁一起读】&#xff08;78&#xff09; __《Apache Tomcat 的云原生演进》 目录 __《Apache Tomcat 的云原生演进》 一、读后感 二、文章知识点摘要 2.1、Tomcat的技术内幕和在喜马拉雅的实践 2.2、GraalVM static compilation in web container application&…

企业级开发链表思路

项目结构 头文件代码 头文件代码LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #include <stdio.h> #include <stdlib.h> #include <iostream> // 链表小节点 typedef struct LINKBODE {struct LINKBODE* next;}LinkNode; // 遍历的函数指针 typedef …

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…

Python字典类型

目录 目标 版本 官方文档 简介 实战 创建 循环 常用方法 目标 掌握字典类型的使用方法&#xff0c;包括&#xff1a;创建、循环、常用方法等操作。 版本 Python 3.12.0 官方文档 Mapping Types — dicthttps://docs.python.org/3/library/stdtypes.html#mapping-type…

绝地求生:成长型皮肤异色定价是否有些夸张?

大家好&#xff0c;我闲游盒小盒子&#xff01; 自从26.2更新上架回归的黑市中四款成长型皮肤以后&#xff0c;能看到社区里很多玩家都分享抽中了自己心仪的成长型皮肤。 但是对于异色很少有人去实装&#xff0c;大多数玩家都是选择去分解异色换取五张图纸然后追求升级原皮等级…

【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。 用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击) 自定义阴影遮罩Mask&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

L型骨牌覆盖问题。

问题&#xff1a;解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。 思路&#xff1a; 棋盘覆盖实现的基本方法为分治法 当k0时(1ⅹ1棋盘)&#xff0c;及特殊方格&#xff0c;骨牌数为0 当k >0时&#xff0c;将2kⅹ2k棋盘分割为4个2k-1ⅹ2k-1子棋盘了 特殊方格位于4个较小…

【3D程序软件】SideFX与上海道宁一直为设计师提供程序化 3D动画和视觉效果工具,旨在创造高质量的电影效果

Houdini是一个 从头开始构建的程序系统 使艺术家能够自由工作 创建多次迭代 并与同事快速共享工作流程 Houdini FX为 视觉特效艺术家创作故事片 广告或视频游戏 凭借其基于程序节点的工作流程 Houdini FX可让 您更快地创建更多内容 从而缩短时间并 在所有创意任务中…

制作电脑微信双开快捷方式

一、介绍 电脑下载的微信正常只能打开一个&#xff0c;那有时候需要双开甚至多开微信我们需要怎么操作呢&#xff1f; 我这里就讲一个制作微信双开快捷键方式的办法&#xff0c;争对其他应用也是一样的原理。 二、制作过程 1、右击微信快捷方式 2、点击属性 3、复制目标 …

微服务实战系列之Cache

前言 欢迎来到Cache&#xff08;缓存&#xff09;的世界&#xff01; 自从世界第一台计算机诞生之日起&#xff0c;人们对效率的渴望逐步增强。从CPU到存储&#xff0c;从芯片到内存&#xff0c;一批又一批的先驱以一种孜孜不倦的“工匠”精神&#xff0c;为计算机运行效率的提…