Vue3 过渡动画效果

news2024/11/28 14:42:24

文章目录

  • Vue3 过渡动画效果
    • 概述
    • `<Transition>`组件
      • 简单使用
      • 为过渡效果命名
      • 自定义过渡class
      • JavaScript动画效果
      • 元素间过渡
    • `<transition-group>`组件
      • 列表动画
      • 状态动画

Vue3 过渡动画效果

概述

Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画:

  • <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。
  • <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入,移动,或移除时应用动画。

<Transition>组件

<Transition>是一个内置组件,它可以将进入和离开应用到通过默认插槽传递给它的元素或组件上。

进入或离开可以由以下的条件之一触发:

  • v-if 所触发的切换
  • v-show 所触发的切换

简单使用

在这里插入图片描述

  • v-enter-from:进入动画的起始状态。
  • v-enter-active:进入动画的生效状态。这个 class 可以被用来定义进入动画的持续时间、延迟与速度曲线类型。
  • v-enter-to:进入动画的结束状态。
  • v-leave-from:离开动画的起始状态。
  • v-leave-active:离开动画的生效状态。这个 class 可以被用来定义离开动画的持续时间、延迟与速度曲线类型。
  • v-leave-to:离开动画的结束状态。
<script>
export default {
    data() {
        return {
            show: false,
        }
    },
    methods: {
        handleClick() {
            this.show = !this.show;
        }
    }
}
</script>

<template>
    <div>
        <transition>
            <div v-if="show">hello world</div>
        </transition>
        <button @click="handleClick">切换</button>
    </div>
</template>
<style>
/* 入场效果 */
.v-enter-from {
    opacity: 0;
}

/* 定义过渡效果 */
.v-enter-active {
    transition: opacity 3s ease-out;
}

.v-enter-to {
    opacity: 1;
}

/* 出场效果 */
.v-leave-from {
    opacity: 1;
}

.v-leave-active {
    transition: opacity 3s ease-in;
}

.v-leave-to {
    opacity: 0;
}
</style>

为过渡效果命名

可以给 <Transition> 组件传一个 name prop 来声明一个过渡效果名:

<script>
export default {
    data() {
        return {
            show: false,
        }
    },
    methods: {
        handleClick() {
            this.show = !this.show;
        }
    }
}
</script>
<template>
    <div>
        <transition name="abc">
            <div v-if="show">hello world222</div>
        </transition>
        <button @click="handleClick">切换</button>
    </div>
</template>
<style>
@keyframes my-anim {
    0% {
        transform: translateX(50px);
    }

    50% {
        transform: translateX(-50px);
    }

    100% {
        transform: translateX(50px);
    }
}

.abc-enter-active {
    animation: my-anim 3s;
}

.abc-leave-active {
    animation: my-anim 3s ease-out;
}
</style>

自定义过渡class

可以向 <Transition> 传递以下的 props 来指定自定义的过渡 class:

  • enter-from-class
  • enter-active-class
  • enter-to-class
  • leave-from-class
  • leave-active-class
  • leave-to-class
<script>
export default {
    data() {
        return {
            show: false,
        }
    },
    methods: {
        handleClick() {
            this.show = !this.show;
        }
    }
}
</script>
<template>
    <div>
        <transition enter-active-class="myenter" leave-active-class="myleave">
            <div v-if="show">hello world333</div>
        </transition>
        <button @click="handleClick">切换</button>
    </div>
</template>
<style>
@keyframes my-anim {
    0% {
        transform: translateX(50px);
    }

    50% {
        transform: translateX(-50px);
    }

    100% {
        transform: translateX(50px);
    }
}

.myenter {
    animation: my-anim 3s;
}

.myleave {
    animation: my-anim 3s;
}
</style>

JavaScript动画效果

可以通过监听 <Transition> 组件事件的方式在过渡过程中挂上钩子函数。

添加一个 :css="false" prop。这显式地向 Vue 表明可以跳过对 CSS 过渡的自动探测。

对于 @enter@leave 钩子来说,回调函数 done 就是必须的。否则,钩子将被同步调用,过渡将立即完成。

<script>
export default {
    data() {
        return {
            show: false,
        }
    },
    methods: {
        handleClick() {
            this.show = !this.show;
        },
        handleBeforeEnter(el) {
            el.style.color = "red";
        },
        handleEnter(el, done) {
            let animation = setInterval(() => {
                let color = el.style.color;
                if (color === "red") {
                    el.style.color = "green";
                } else {
                    el.style.color = "red";
                }
            }, 1000)
            setTimeout(() => {
                clearInterval(animation);
                done(); //通知动画结束
            }, 3000)
        },
        handleAfterEnter(el) {
            alert("结束")
        },
    }
}
</script>
<template>
    <div>
        <transition :css="false" @before-enter="handleBeforeEnter" @enter="handleEnter" @after-enter="handleAfterEnter">
            <div v-if="show">hello world444</div>
        </transition>
        <button @click="handleClick">切换</button>
    </div>
</template>

元素间过渡

除了通过 v-if / v-show 切换一个元素,我们也可以通过 v-if / v-else / v-else-if 在几个组件间进行切换,只要确保任一时刻只会有一个元素被渲染即可。

如果你想在某个节点初次渲染时应用一个过渡效果,你可以添加 appear prop:

<script>
export default {
    data() {
        return {
            show: false,
        }
    },
    methods: {
        handleClick() {
            this.show = !this.show;
        }
    }
}
</script>
<template>
    <div>
        <transition mode="out-in" appear>
            <div v-if="show">hello</div>
            <div v-else="show">world</div>
        </transition>
        <button @click="handleClick">切换</button>
    </div>
</template>
<style>
.v-enter-to,
.v-leave-from {
    opacity: 1;
}

.v-enter-from,
.v-leave-to {
    opacity: 0;
}

.v-enter-active,
.v-leave-active {
    transition: opacity 1s ease-in;
}
</style>

<transition-group>组件

<transition-group>是一个内置组件,用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。

列表动画

<script>
export default {
    data() {
        return {
            list: [1, 2, 3]
        }
    },
    methods: {
        handleClick() {
            this.list.unshift(this.list.length + 1);
        }
    }
}
</script>
<template>
    <div>
        <transition-group>
            <span class="list-item" v-for="item in list" :key="item">{{ item }}</span>
        </transition-group>
        <button @click="handleClick">添加</button>
    </div>
</template>
<style>
.list-item {
    display: inline-block;
    margin-right: 10px;
}

.v-enter-from {
    opacity: 0;
    transform: translateY(30px);
}

.v-enter-to {
    opacity: 1;
    transform: translateY(0);
}

.v-enter-active {
    transition: all 0.5s ease-in;
}

.v-move {
    transition: all 0.5s ease-in;
}
</style>

状态动画

<script>
export default {
    data() {
        return {
            animNum: 1
        }
    },
    methods: {
        handleClick() {
            if (this.animNum < 10) {
                let interval = setInterval(() => {
                    this.animNum++;
                    if (this.animNum === 10) {
                        clearInterval(interval);
                    }
                }, 100);
            }
        }
    }
}
</script>
<template>
    <div>
        <transition-group>
            <div>{{ animNum }}</div>
        </transition-group>
        <button @click="handleClick">添加</button>
    </div>
</template>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中服云设备全生命周期管理系统4.0全新升级,震撼登场!

6月2日&#xff0c;中服云设备全生命周期管理系统4.0将在中服云官方视频号线上直播震撼发布。在此次线上直播发布会上&#xff0c;中服云将详细地介绍设备全生命周期管理系统4.0版本的全新特性和创新功能。同时邀请了业内权威售前顾问、设备管理工程师和合作伙伴&#xff0c;共…

降低FTP服务器速度的解决方案(Filezilla等)

我最近发现&#xff0c;尽管有70Mbps&#xff08;8.75MB / s&#xff09;的互联网连接和1Gbps&#xff08;125MB / s&#xff09;的专用服务器可以从中下载&#xff0c;但我似乎只能从FTP服务器上以大约16.8Mbps&#xff08;2.1MB / s&#xff09;的速度下载。在一个线程上。但…

深入篇【Linux】学习必备:理解文件权限

深入篇【Linux】学习必备&#xff1a;理解文件权限 Ⅰ.Linux权限的概念Ⅱ.Linux权限管理①.文件访问者的分类(访问者的身份)②.文件类型和访问权限(文件本身的事物属性)1.文件类型&#xff1a;2.基本权限: ③.文件权限值的表示方法1.字符表示方法2.八进制数值表示法 ④.文件访问…

【活动回顾】Databend 数据库表达式框架设计与实现 @GOTC

5月28日&#xff0c;“全球开源技术峰会 GOTC 2023 ”圆满落幕。在本次会上&#xff0c;Databend 数据库的 优化器 研发工程师 骆迪安作为嘉宾中的一员&#xff0c;在 rust 专题专区分会场进行了一次主题为《 Rust 实现的先进 SQL Parser 与高效表达式执行框架 — Databend 数…

多语言跨境商城源码,出海跨境商城软件开发模式平台

一、多语言跨境商城模式 多商家模式&#xff1a;容纳不同的商家 多用户模式&#xff1a;用户之社区&#xff0c;用户交互&#xff0c;分享和推广 支持扩展&#xff1a;使用现代化的技术架构和设计&#xff0c;包括支持并发访问、分布式数据存储等功能。 采用常用技术&#x…

合工大Java大作业1:货物进销管理系统

问题描述 编写一个Inventory.java完成以下功能&#xff08;没有学过Java文件处理之前&#xff0c;各位同学可以使用硬编码将数据放进两个Vector变量里。等学过Java文件处理之后&#xff0c;再补充数据文件读取部分&#xff09;&#xff1a; 1&#xff0e;程序首先打开并读取In…

SpringMVC源码分析:SpringMVC九大组件分析(三)

一、概述 SpringMVC九大组件如下图&#xff0c;我将一个个进行介绍。各个组件使用的入口DispatcherServlet.doDispatch是各个组件使用的入口&#xff0c;我们大部分代码都是从这里开始进入的。 二、MultipartResolver 下面是MultipartResolver组件具体的使用流程&#xff0c;…

【UE打包apk过程遇到的报错】

教程遇到的问题UE5 打包android提示 sdk未设置解决方案 UE5打包apk 报错 ERROR: cmd.exe failed with args :app:assembleDebug解决方案 我在打包的时候&#xff0c;日志中的报错信息如下&#xff08;每个人的报错信息可能不一样&#xff0c;根据报错日志找对应的解决方案&…

扼流圈天线是如何解决RTK的误差源

扼流圈天线是一种用于GPS定位的天线&#xff0c;它将电流流过一圈线圈来产生电磁场&#xff0c;这个电磁场可以用来接收卫星信号。扼流圈天线的优势在于它可以有效地减少多径干扰和多路传播所造成的误差&#xff0c;从而提高定位精度。 对于RTK定位来说&#xff0c;扼流圈天线可…

__LINE__打印出来的值与source insight不一致

一个project里面有几百个文件&#xff0c;有些&#xff0c;__LINE__ 和pc上看到的值总是不一致 在这个函数前重新定义一下line

h5调用微信支付报错,商家存在未配置的参数,请联系商家解决

报错&#xff1a; 商家存在未配置的参数&#xff0c;请联系商家解决 原因&#xff1a; 发起微信支付的域名和项目域名不一致 确认原因&#xff1a; 发起微信支付的域名是需要在微信支付平台&#xff08;微信商户&#xff09;进行h5域名的添加配置 项目的域名是 发送请求的…

VS code使用及插件(python、vue)

VS code使用及插件&#xff08;python、vue&#xff09; 说明一、下载及安装二、vs code 常规设置三、 pyhton插件四、 vue相关插件 说明 本教程主要内宅vs code使用及vue、python插件vs code 常规设置pyhton插件vue相关插件 一、下载及安装 二、vs code 常规设置 注&#…

vscode配置nodejs

文章目录 前言Nodejs在vscode中的配置1、扩展插件Code RunnerJavaScript(ES6) code snippetLive Server 2、创建配置文件3、调整配置文件内容 前言 npm ERR! enoent This is related to npm not being able to find a file. ‘vue-cli-service’ 不是内部或外部命令&#xff…

内网安全:域内信息收集

目录 环境搭建 域基础知识 工作组和域 现实背景 常规信息收集 方式一&#xff1a;操作系统命令执行 常用总结 方式二&#xff1a;使用CS插件 关键信息收集 密码抓取测试 自动化信息收集工具 ADFind BloodHound域分析使用(渗透流程信息) 从今天开始&#xff0c;将…

第七章 文件和数据格式化

文章目录 第七章 文件和数据格式化7.1 文件的使用7.1.1 文件的类型7.1.2 文件的打开和关闭7.1.3 文件的读写 7.2 数据组织的维度7.2.1 一维数据7.2.2 二维数据7.2.3 高维数据 7.3 一维数据的处理7.3.1 一维数据的表示7.3.2 一维数据的存储7.3.3 一维数据的处理 7.4 二维数据的处…

VS2019 WPF制作OTA上位机(四)串口收发数据

首先说一下&#xff0c;这个上位机是模拟服务器对嵌入式设备发起通信进行OTA升级。如下图所示 上位机发送过程&#xff1a;服务器将数据发送到云端&#xff0c;云端是通信模块的&#xff0c;比如移动/电信的云平台&#xff0c;云端将数据传给通信模块&#xff0c;比如NB模块&a…

【PCIE701】基于PCIE总线架构的高性能数据预处理平台

板卡概述 PCIE701是北京青翼科技的一款基于PCI Express总线架构的高性能数据预处理FMC载板&#xff0c;板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1个X8 PCIe主机接口&#xff0c;板卡采用Xilinx的高性能Kintex-7系列FPGA作为实时处理器&#xff0c;实现…

知识付费小程序搭建 为有价值的知识买单

以前我们学习写作遇到难题的时候&#xff0c;总喜欢上网搜一下参考资料&#xff0c;但是不知具体从何时起&#xff0c;很多平台内容查看都要钱了。这说明知识付费已经深入到我们的生活中了。再加上疫情爆发这几年&#xff0c;很多教育培训机构都抓住风口&#xff0c;开发了线上…

知乎运营分析平台 — 舰桥平台如何通过 Apache Doris 实现查询速度 10+ 倍提升?

导读&#xff1a;知乎为实现精细化运营&#xff0c;提高运营效率&#xff0c;依赖 Apache Doris 构建了内部统一的运营分析平台——舰桥平台&#xff0c;主要应用于事实接入层、事实建模层和事实运算层等架构核心层的建设&#xff0c;并持续对导入、查询等方面进行性能调优&…

5. 缓存

5. 缓存 5.1.缓存-缓存介绍 MyBatis官方文档 MyBatis 包含一个非常强大的查询缓存特性&#xff0c;它可以非常方便地配置和定制。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存&#xff0c;一级缓存和二级缓存。 默认情况下&#xff0c;只有一级缓存&…