Vue知识点(5)-- 动画

CSS 动画是 Vue3 中实现组件动画效果的高效方式,主要通过 CSS transitionskeyframes 动画

CSS Keyframes(关键帧动画)

用来创建复杂的动画序列,可以精确控制动画的各个阶段。

核心语法:

@keyframes animationName {0% { /* 起始状态 */ }50% { /* 中间状态 */ }100% { /* 结束状态 */ }
}.cssClass{animation: name            // 动画名称 (对应 @keyframes 名称)(必需)duration        // 动画持续时间(必需)timing-function // 动画速度曲线delay           // 动画延迟时间iteration-count // 动画播放次数direction       // 动画播放方向fill-mode       // 动画前后如何应用样式play-state;     // 动画运行状态
}

每一个参数都可以单独的修改和使用

  1. animation-name (必需)
    指定要应用的 @keyframes 动画名称
@keyframes example {from { opacity: 0; }to { opacity: 1; }
}.element {animation-name: example;
}
  1. animation-duration (必需)
    定义动画完成一个周期所需时间
.element {animation-duration: 2s; /* 可以是秒(s)或毫秒(ms) */
}
  1. animation-timing-function
    定义动画的速度曲线
    描述
    ease默认值,慢快慢
    linear匀速
    ease-in慢开始
    ease-out慢结束
    ease-in-out慢开始和结束
    cubic-bezier(n,n,n,n)自定义贝塞尔曲线
    steps(n)分步动画
.element {animation-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1);
}
  1. animation-delay
    定义动画开始前的延迟时间
.element {animation-delay: 1s; /* 1秒后开始动画 */
}
  1. animation-iteration-count
    定义动画播放次数
    描述
    number具体次数 (如 2, 3.5)
    infinite无限循环
.element {animation-iteration-count: infinite;
}
  1. animation-direction
    定义动画播放方向
    描述
    normal默认,正向播放
    reverse反向播放
    alternate先正向后反向交替
    alternate-reverse先反向后正向交替
.element {animation-direction: alternate;
}
  1. animation-fill-mode
    定义动画执行前后如何应用样式
    描述
    none默认,不应用任何样式
    forwards保持最后一帧样式
    backwards应用第一帧样式
    both同时应用 forwards 和 backwards
.element {animation-fill-mode: forwards;
}
  1. animation-play-state
    控制动画的播放状态
    描述
    running默认,动画运行
    paused动画暂停
.element:hover {animation-play-state: paused;
}

案例实践:

//基于CSS class的动画
<template><div :class="{ shake: disabled }"><button @click="warnDisabled">Click me</button><span v-if="disabled">This feature is disabled!</span></div>
</template><script setup>
import { ref } from 'vue'
const disabled = ref(false)
const warnDisabled = () => {disabled.value = truesetTimeout(() => {disabled.value = false}, 1500)
}
</script><style scoped>
.shake {animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;transform: translate3d(0, 0, 0);
}
@keyframes shake {10%,90% {transform: translate3d(-1px, 0, 0);}20%,80% {transform: translate3d(2px, 0, 0);}30%,50%,70% {transform: translate3d(-4px, 0, 0);}40%,60% {transform: translate3d(4px, 0, 0);}
}
</style>

CSS Transitions(过渡动画)

用于在元素从一种状态转变为另一种状态时添加平滑的过渡效果。

核心语法:

.cssClass{transition: [property]       // 要过渡的CSS属性[duration]       // 过渡持续时间(必需)[timing-function] // 过渡速度曲线[delay];         // 过渡延迟时间
}
  1. transition-property(可选)
    指定应用过渡效果的 CSS 属性名称

常见可过渡属性:
color, background-color
opacity
transform (包括 translate, scale, rotate 等)
width, height
margin, padding
border 相关属性

.element {transition-property: opacity, transform;/* 或者 */transition-property: all; /* 所有可过渡属性 */
}
  1. transition-duration(必需)
    定义过渡效果持续时间
.element {transition-duration: 0.3s; /* 可以是秒(s)或毫秒(ms) */
}
  1. transition-timing-function
    定义过渡效果的速度曲线
    描述
    ease默认值,慢快慢
    linear匀速
    ease-in慢开始
    ease-out慢结束
    ease-in-out慢开始和结束
    cubic-bezier(n,n,n,n)自定义贝塞尔曲线
    steps(n)分步过渡
.element {transition-timing-function: cubic-bezier(0.68, -0.55, 0.27, 1.55);
}
  1. transition-delay(可选)
    定义过渡效果开始前的延迟时间
.element {transition-delay: 0.2s; /* 0.2秒后开始过渡 */
}

案例实践:

//状态驱动的动画
<template><div@mousemove="onMousemove":style="{ backgroundColor: `hsl(${x}, 80%, 50%)` }"class="movearea"><p>Move your mouse across this div...</p><p>x: {{ x }}</p></div>
</template><script setup>
import { ref } from 'vue'
const x = ref(0)
const onMousemove = (e) => {x.value = e.clientX
}
</script><style scoped>
.movearea {transition: 0.3s background-color ease;
}
</style>

transform

transform 是 CSS 中用于对元素进行 2D 或 3D 变换的强大属性,它可以改变元素的形状、位置和方向而不影响文档流。

可以组合多个变换函数,空格分隔,从右向左依次执行

transform: rotate(45deg) scale(1.2) translateX(50px);
/* 先平移 → 然后缩放 → 最后旋转 */

2D

  1. 位移(Translate)
transform: translateX(50px);     /* 水平移动 */
transform: translateY(-20px);    /* 垂直移动 */
transform: translate(50px, 20px); /* 同时XY移动 */
  1. 旋转(Rotate)
transform: rotate(45deg);       /* 顺时针旋转45度 */
transform: rotate(-90deg);      /* 逆时针旋转90度 */
  1. 缩放(Scale)
transform: scale(1.5);          /* 均匀放大1.5倍 */
transform: scaleX(0.5);         /* 水平缩小一半 */
transform: scaleY(1.2);         /* 垂直放大1.2倍 */
transform: scale(1.2, 0.8);     /* 水平放大,垂直缩小 */
  1. 倾斜(Skew)
transform: skewX(15deg);        /* 水平倾斜 */
transform: skewY(-10deg);       /* 垂直倾斜 */
transform: skew(15deg, -10deg); /* 同时XY倾斜 */

3D

  1. 3D位移
transform: translateZ(100px);     /* Z轴移动 */
transform: translate3d(50px, 20px, 100px); /* XYZ移动 */
  1. 3D旋转
transform: rotateX(45deg);       /* 绕X轴旋转 */
transform: rotateY(30deg);       /* 绕Y轴旋转 */
transform: rotateZ(15deg);       /* 绕Z轴旋转 */
transform: rotate3d(1, 1, 0, 45deg); /* 自定义轴旋转 */
  1. 3D缩放
transform: scaleZ(1.5);         /* Z轴缩放 */
transform: scale3d(1.2, 1.2, 1.5); /* XYZ缩放 */
  1. 透视(Perspective)
transform: perspective(500px) rotateY(45deg);

指定观察者与 z=0 平面的距离
值越小,透视效果越强(类似广角镜头)
值越大,透视效果越弱(类似长焦镜头)
必须为正数

相关属性

  1. transform-origin
    设置变换的基准点(默认是元素中心)
transform-origin: 50% 50%;     /* 默认值 */
transform-origin: left top;    /* 左上角 */
transform-origin: 20px 30px;   /* 具体坐标 */
transform-origin: bottom right 50px; /* 3D变换时Z轴 */
  1. transform-style
    指定子元素是否保留3D位置
transform-style: flat;         /* 默认,子元素不保留3D位置 */
transform-style: preserve-3d;  /* 子元素保留3D位置 */
  1. perspective
    设置3D变换的视距
perspective: 1000px;          /* 在父元素上设置 */
  1. backface-visibility
    定义元素背面是否可见
backface-visibility: visible;  /* 默认,背面可见 */
backface-visibility: hidden;   /* 背面不可见 */

案例实践:

//3d翻转卡片
<template><div class="flip-container"><div class="flipper"><div class="front">正面</div><div class="back">背面</div></div></div>
</template><style scoped>
.flip-container {perspective: 100px;background: #644a68;
}
.flipper {transition: transform 3s;transform-style: preserve-3d;font-size: 30px;
}
.flip-container:hover .flipper {transform: rotateY(180deg);
}
.front,
.back {backface-visibility: hidden;
}
.back {transform: rotateY(180deg);
}
</style>

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

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

相关文章

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool

使用LangChain Agents构建Gradio及Gradio Tools(6)——创建自己的GradioTool 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.6 创建自己的GradioTool16.6.1 创建步骤16.6.2 创建示例StableDiffusionTool参考文献本章目录如下: 《使用LangChain Agents构建Grad…

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **refresh_video_timer 函数**4. **WinMain 函数**主要功能及工作流程&#xff1a;总结&#xff1a; 1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基础教学:随机抽取花名册,不能重复

一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…

软考 系统架构设计师系列知识点 —— 设计模式之抽象工厂模式

本文内容参考&#xff1a; 软考 系统架构设计师系列知识点之设计模式&#xff08;2&#xff09;_系统架构设计师中考设计模式吗-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致谢&#xff01; Abstract Fac…

P2040 打开所有的灯

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏&#xff0c;目的是打开九盏灯所有的灯&#xff0c;这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren)&#xff0c;点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开…

汉得企业级 PaaS 平台 H-ZERO 1.12.0 发布!四大维度升级,构建企业数字化新底座

汉得企业级 PaaS 平台&#xff08;以下简称"H-ZERO"&#xff09;是一款基于微服务架构的企业级数字化 PaaS 平台&#xff0c;可支持企业各类系统搭建、产品研发&#xff0c;帮助企业快速构架技术中台。 H-ZERO于2025年3月底正式发布 V1.12.0 &#xff0c;此次发布聚…

ReplicaSet、Deployment功能是怎么实现的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除&#xff0c;ReplicaSet 会…

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…

PyTorch教程:如何读写张量与模型参数

本文演示了PyTorch中张量&#xff08;Tensor&#xff09;和模型参数的保存与加载方法&#xff0c;并提供完整的代码示例及输出结果&#xff0c;帮助读者快速掌握数据持久化的核心操作。 1. 保存和加载单个张量 通过torch.save和torch.load可以直接保存和读取张量。 import to…

持续集成:GitLab CI/CD 与 Jenkins CI/CD 的全面剖析

一、引言 在当今快速迭代的软件开发领域,持续集成(Continuous Integration,CI)已成为保障软件质量、加速开发流程的关键实践。通过频繁地将代码集成到共享仓库,并自动进行构建和测试,持续集成能够尽早发现并解决代码冲突和缺陷。而 GitLab CI/CD 和 Jenkins CI/CD 作为两…

Python 序列构成的数组(序列的增量赋值)

序列的增量赋值 增量赋值运算符 和 * 的表现取决于它们的第一个操作对象。简单起 见&#xff0c;我们把讨论集中在增量加法&#xff08;&#xff09;上&#xff0c;但是这些概念对 * 和其他 增量运算符来说都是一样的。 背后的特殊方法是 iadd &#xff08;用于“就地加法”&…

GEO, TCGA 等将被禁用?!这40个公开数据库可能要小心使用了

GEO, TCGA 等将被禁用&#xff1f;&#xff01;这40个公开数据库可能要小心使用了 最近NIH公共数据库开始对中国禁用的消息闹得风风火火&#xff1a; 你认为研究者上传到 GEO 数据库上的数据会被禁用吗&#xff1f; 单选 会&#xff0c;毕竟占用存储资源 不会&#xff0c;不…

【如何自建MCP服务器?从协议原理到实践的全流程指南】

文章目录 如何自建MCP服务器&#xff1f;从协议原理到实践的全流程指南一、MCP协议是什么&#xff1f;核心架构 二、为什么要自建MCP服务器&#xff1f;1. 突破LLM的固有局限2. 实现个性化功能扩展3. 确保数据隐私安全 三、手把手搭建MCP服务器&#xff08;Python示例&#xff…

鸿蒙开发_ARKTS快速入门_语法说明_渲染控制---纯血鸿蒙HarmonyOS5.0工作笔记012

然后我们再来看渲染控制 首先看条件渲染,其实就是根据不同的状态,渲染不同的UI界面 比如下面这个暂停 开启播放的 可以看到就是通过if 这种条件语句 修改状态变量的值 然后我们再来看这个, 下面点击哪个,上面横线就让让他显示哪个 去看一下代码 可以看到,有两个状态变量opt…

【Java设计模式】第3章 软件设计七大原则

3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…

JVM即时编译(JIT)

JVM基础回顾 Java 作为一门高级程序语言&#xff0c;由于它自身的语言特性&#xff0c;它并非直接在硬件上运行&#xff0c;而是通过编译器(前端编译器)将 Java 程序转换成该虚拟机所能识别的指令序列&#xff0c;也就是字节码&#xff0c;然后运行在虚拟机之上的&#xff1b;…

刚体碰撞检测与响应(C++实现)

本文实现一个经典的物理算法&#xff1a;刚体碰撞检测与响应。这个算法用于检测两个刚体&#xff08;如矩形或圆形&#xff09;是否发生碰撞&#xff0c;并在碰撞时更新它们的速度和位置。我们将使用C来实现这个算法&#xff0c;并结合**边界框&#xff08;Bounding Box&#x…

常用的国内镜像源

常见的 pip 镜像源 阿里云镜像&#xff1a;https://mirrors.aliyun.com/pypi/simple/ 清华大学镜像&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 中国科学技术大学镜像&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣镜像&#xff1a;https://pypi.doub…

鸿蒙小案例-京东登录

效果 代码实现 Entry Component struct Index {build() {Column() {Row() {Image($r(app.media.jd_cancel)).width(20)Text(帮助).fontSize(16).fontColor(#666)}.width(100%).justifyContent(FlexAlign.SpaceBetween)Image($r(app.media.jd_logo)).height(250).width(250)// …