【愚公系列】《循序渐进Vue.js 3.x前端开发实践》038-使用CSS3创建动画(keyframes动画)

server/2025/2/1 23:02:01/
标题详情
作者简介愚公搬代码
头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎👍点赞、✍评论、⭐收藏

文章目录

  • 🚀前言
  • 🚀一、使用CSS3创建动画(keyframes动画)
    • 🔎1. HTML 部分
    • 🔎2. CSS 部分
      • 🦋2.1 `@keyframes` 动画定义
      • 🦋2.2 `demo` 类
      • 🦋2.3 `demo-ani` 类
    • 🔎3. Vue 部分
    • 🔎4. 交互流程
    • 🔎5. 总结


🚀前言

在网页设计中,动画不仅能吸引用户的注意力,还能有效提升用户体验,使得界面更加生动和互动。随着 CSS3 的发展,开发者们可以轻松地通过 CSS 动画为网页增添动感效果。其中,@keyframes 动画是实现复杂动画效果的强大工具,允许我们定义动画的不同阶段,以及这些阶段之间的过渡效果。

本篇文章将深入探讨如何使用 CSS3 的 @keyframes 创建动画。我们将介绍如何定义动画的关键帧、设置动画的持续时间、延迟、播放次数等属性,并通过实际示例展示如何将这些动画效果应用到网页元素上。无论是简单的平移动画、旋转效果,还是更复杂的多阶段动画,@keyframes 都能助你一臂之力。

🚀一、使用CSS3创建动画(keyframes动画)

🔎1. HTML 部分

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><title>关键帧动画</title>
</head>
<body><style>/* CSS 样式代码 */</style><div id="Application">  <div :class="cls" @click="run"> </div>   </div><script>/* Vue 代码 */</script>
</body>
</html>

在这里插入图片描述

🔎2. CSS 部分

🦋2.1 @keyframes 动画定义

@keyframes animation1 {0% {background-color: red;width: 100px;height: 100px;}25% {background-color: orchid;width: 200px;height: 200px;}75% {background-color: green;width: 150px;height: 150px;}100% {background-color: blue;width: 200px;height: 200px;}
}
  • @keyframes 定义了一个名为 animation1 的动画,它描述了在不同的时间点(0%, 25%, 75%, 100%)元素的变化。
    • 0%:初始状态,元素的背景颜色是红色,宽高是 100px × 100px。
    • 25%:25% 的时候,背景颜色变成了 orchid(一种花卉的紫色),宽高变成了 200px × 200px。
    • 75%:75% 的时候,背景颜色变成绿色,宽高变成 150px × 150px。
    • 100%:最终状态,背景颜色变为蓝色,宽高恢复为 200px × 200px。

这个动画的核心是通过 @keyframes 来描述不同时间点元素的状态,从而实现过渡效果。

🦋2.2 demo

.demo {width: 100px;height: 100px;background-color: red;
}
  • demo 类定义了初始的样式,元素的宽度和高度都是 100px,背景颜色为红色。

🦋2.3 demo-ani

.demo-ani {/* 设置关键帧动画名称 */animation-name: animation1;/* 设置动画时长 */animation-duration: 3s;/* 设置动画播放方式:渐入渐出 */animation-timing-function: ease-in-out;/* 设置动画播放的方向 */animation-direction: alternate;/* 设置动画播放的次数 */animation-iteration-count: infinite;/* 设置动画的播放状态 */animation-play-state: running;/* 设置播放动画的延迟时间 */animation-delay: 1s;/* 设置动画播放结束应用到元素的样式 */animation-fill-mode: forwards;background-color: red;width: 100px;height: 100px;
}
  • animation-name: animation1:设置元素的动画为之前定义的 animation1,即上面定义的 @keyframes 动画。
  • animation-duration: 3s:设置动画的总时长为 3 秒。
  • animation-timing-function: ease-in-out:设置动画的时间函数为 ease-in-out,意味着动画开始和结束时会有缓慢的过渡。
  • animation-direction: alternate:使动画在完成一个周期后反向播放,即先从 0%100%,再从 100%0%,不断交替。
  • animation-iteration-count: infinite:设置动画无限循环播放。
  • animation-play-state: running:设置动画的播放状态为运行。
  • animation-delay: 1s:设置动画在 1 秒后开始播放。
  • animation-fill-mode: forwards:设置动画完成后元素会保持动画结束时的状态。

🔎3. Vue 部分

const App = Vue.createApp({data() {return {cls: "demo"  // 初始类名为 "demo"};},methods: {run() {if (this.cls == "demo") {this.cls = "demo-ani"; // 如果当前是 "demo",点击时切换到 "demo-ani"} else {this.cls = "demo"; // 如果当前是 "demo-ani",点击时切换回 "demo"}}}
});App.mount("#Application");
  • data()data 返回一个对象,其中有一个属性 cls,初始值是 "demo",即 div 元素开始时使用 demo 类。

  • methods:定义了一个 run 方法,功能是切换 cls 的值:

    • 如果当前 clsdemo,则将其切换为 demo-ani,从而触发 CSS 动画。
    • 如果当前 clsdemo-ani,则将其切换回 demo,使动画停止。

    这个方法通过 Vue 的响应式系统使得 div 元素的类名发生变化,从而触发元素的样式和动画效果。

  • App.mount("#Application"):将 Vue 应用挂载到页面中 idApplication 的元素上。

🔎4. 交互流程

  1. 初始状态:

    • 页面加载时,div 元素的 class 被设置为 "demo",即该元素的初始状态是 100px × 100px 的红色方块。
    • 此时,CSS 动画不会启动,因为元素的类名是 demo,没有应用任何动画。
  2. 点击事件:

    • 当用户点击 div 元素时,run 方法被调用。此时,cls 的值从 "demo" 切换到 "demo-ani",意味着元素的类名发生了变化。
    • 切换到 demo-ani 后,div 元素会开始应用 demo-ani 类中的关键帧动画(@keyframes animation1),使得元素从红色变为紫色、绿色、蓝色,大小也发生变化,动画持续 3 秒,并且每次动画完成后会反向播放。
  3. 动画效果:

    • 由于 animation-direction 设置为 alternate,动画会在每次播放完毕后反向执行,即先从 0%100%,再从 100%0%,这使得动画不断循环。
    • animation-iteration-count: infinite 保证动画会无限次播放。
    • animation-fill-mode: forwards 确保动画结束后,元素保持动画结束时的状态。
  4. 切换回初始状态:

    • 如果点击时 cls 已经是 demo-ani,则它会切换回 demo 类,动画会停止,元素恢复到初始状态(100px × 100px 的红色方块)。

🔎5. 总结

这段代码通过 Vue 3 和 CSS 关键帧动画实现了一个动态的交互效果:

  • 使用 @keyframes 定义了一个复杂的动画,控制元素的颜色和大小变化。
  • Vue 负责在用户点击时切换 div 的类名,通过响应式绑定触发 CSS 动画。
  • 通过 animation-direction: alternateanimation-iteration-count: infinite 让动画不断循环并反向播放。

这是一种非常适合学习 CSS 动画与 Vue 的交互方式的示例,展示了如何结合 Vue 的数据绑定和 CSS 动画来实现灵活的用户界面效果。


http://www.ppmy.cn/server/164187.html

相关文章

Python 梯度下降法(五):Adam Optimize

文章目录 Python 梯度下降法&#xff08;五&#xff09;&#xff1a;Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 四、相关链接 Python 梯度下降法&#xff08;五&a…

【Android】问deepseek存储访问

这些天deepseek爆火&#xff0c;我们来问问android问题看看&#xff0c;如果问android中的应用怎么访问外部存储&#xff0c;回答的很清楚&#xff0c;但是如果问的深入一些&#xff0c;比如Android中是怎么控制让应用不能读取其他应用的外部存储文件的&#xff0c;回答的比较抽…

Java实现.env文件读取敏感数据

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行&#xff0c;提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…

小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索

摘要&#xff1a;随着互联网技术的不断发展&#xff0c;小程序电商已成为现代商业的重要组成部分。然而&#xff0c;如何在竞争激烈的市场中增强小程序内容的真实性&#xff0c;提高用户信任度&#xff0c;成为电商运营者面临的一大挑战。本文首先探讨了通过图片、视频等方式增…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

DeepSeek本地版安装简易教程(windows)

第一步&#xff1a;下载 第二步&#xff1a;安装 先安装ollama&#xff0c;安装完毕保持ollama运行&#xff0c;设置ollama通过防火墙&#xff0c;再安装deepseek&#xff0c;7b代表下载的r1版本&#xff0c;版本越高消耗资源越大 第三步&#xff1a;开放windows防火墙 第四步…

OpenAI掀桌子!免费版ChatGPT,提供o3-mini模型!

逆天免费用 今天凌晨&#xff0c;OpenAI联合创始人兼首席执行官Sam Altman宣布了一个大消息——免费版ChatGPT&#xff0c;将提供o3-mini模型&#xff01; 网页们纷纷不淡定了 看来OpenAI&#xff0c;这o3-mini还没正式上线呢&#xff0c;就免费开放使用了。 不过还是要感谢…

【Java数据结构】了解排序相关算法

基数排序 基数排序是桶排序的扩展&#xff0c;本质是将整数按位切割成不同的数字&#xff0c;然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…