WHAT - CSS Animationtion 动画系列(二)

news2024/12/24 8:10:58

目录

  • 一、循环波浪
  • 二、关键帧呼应
  • 三、关键帧顺接
  • 四、利用 transform-origin 做拉伸
  • 五、大元素可拆分多个小元素联动
  • 六、预留视觉缓冲
  • 七、随机感:动画周期设置
  • 八、抛物线:两个内外div实现x和y向量运动

今天我们主要学习动画实现要素。

一、循环波浪

利用 delay 时间差,导致波浪平滑错位。

可以使用 CSS Animation 和 animation-delay 属性来实现一排蓝色的 div 循环波浪效果。以下是一个示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Wave Animation</title>
<style>
  .wave-container {
    display: flex;
    justify-content: space-between;
    margin-top: 50px;
    width: 100%;
  }

  .wave {
    width: 50px;
    height: 50px;
    background-color: blue;
    animation: wave 1s linear infinite;
  }

  .wave:nth-child(2) {
    animation-delay: 0.2s;
  }

  .wave:nth-child(3) {
    animation-delay: 0.4s;
  }

  .wave:nth-child(4) {
    animation-delay: 0.6s;
  }

  .wave:nth-child(5) {
    animation-delay: 0.8s;
  }

  @keyframes wave {
    0% {
      transform: translateY(0);
    }
    50% {
      transform: translateY(-50px);
    }
    100% {
      transform: translateY(0);
    }
  }
</style>
</head>
<body>
  <div class="wave-container">
    <div class="wave"></div>
    <div class="wave"></div>
    <div class="wave"></div>
    <div class="wave"></div>
    <div class="wave"></div>
  </div>
</body>
</html>

在这个示例中,使用了五个蓝色的 div 元素 .wave 来表示波浪效果。通过设置不同的 animation-delay 来创建时间差,从而形成连续的波浪效果。 CSS 动画 wave 定义了元素的缩放动画,使得波浪效果连续播放。

请添加图片描述

二、关键帧呼应

双盒弹跳联动。

请添加图片描述

可以注意到上述非常丝滑的模拟了两个盒子在不同阶段的弹跳效果。

三、关键帧顺接

请添加图片描述

请添加图片描述

四、利用 transform-origin 做拉伸

transform-origin: 48% 100% 从下往上扩展/拉伸;transform-origin: 50% 5% 从上往下扩展/拉伸。

transform-origin 属性用于指定 CSS 变换的原点。默认情况下,变换的原点为元素的中心点 (50% 50%)。通过调整 transform-origin 的值,我们可以改变变换的起始位置,从而实现不同的效果。

  1. transform-origin: 48% 100%;:这个值将变换的原点设置为元素的底部中心。因此,当应用拉伸变换时,元素会从底部向上扩展。具体而言,变换会围绕元素底部边缘的水平中心点进行扩展。

  2. transform-origin: 50% 5%;:这个值将变换的原点设置为元素的顶部中心。因此,当应用拉伸变换时,元素会从顶部向下扩展。具体而言,变换会围绕元素顶部边缘的水平中心点进行扩展。

以下是具体的代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Stretch Animation</title>
<style>
  .stretch-container {
    display: flex;
    margin-top: 50px;
    width: 100%;
  }

  .stretch {
    width: 50px;
    height: 50px;
    background-color: blue;
    border-radius: 50%;
    animation: stretch 1s linear infinite alternate;
  }

  .stretch:nth-child(1) {
    transform-origin: 48% 100%;
  }

  .stretch:nth-child(2) {
    transform-origin: 50% 5%;
  }

  @keyframes stretch {
    0% {
      transform: scaleY(1);
    }
    100% {
      transform: scaleY(2);
    }
  }
</style>
</head>
<body>
  <div class="stretch-container">
    <div class="stretch"></div>
    <div class="stretch"></div>
  </div>
</body>
</html>

在这个示例中,有两个蓝色的 div 元素 .stretch,通过不同的 transform-origin 值,分别实现了从底部向上拉伸和从顶部向下拉伸的效果。

请添加图片描述
请添加图片描述

五、大元素可拆分多个小元素联动

比如人物举着信封入场,可以信封和手做额外的附属动画,放大动作幅度。

请添加图片描述
图片来源:陈*真@腾讯

六、预留视觉缓冲

动画循环时可以设置 80% - 100% 关键帧之间不变。

预留视觉缓冲的目的是在动画循环的过程中,使得动画的最后一帧保持一段时间,以给用户提供视觉缓冲,使动画更加平滑和自然。在 CSS 中,可以通过设置关键帧动画的某些关键帧保持一段时间来实现预留视觉缓冲。

例如,在动画的 80% 到 100% 之间保持最后一帧的状态,可以让动画在结束阶段缓缓减速,给用户一个更平滑的动画效果。

以下是一个具体的示例,展示了如何在动画的 80% 到 100% 之间保持最后一帧的状态:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Animation with Visual Buffering</title>
<style>
  .box {
    width: 100px;
    height: 100px;
    background-color: blue;
    position: relative;
    animation: move 2s linear infinite;
  }

  @keyframes move {
    0% {
      transform: translateX(0);
    }
    80% {
      transform: translateX(200px);
    }
    100% {
      transform: translateX(200px);
    }
  }
</style>
</head>
<body>
  <div class="box"></div>
</body>
</html>

在这个示例中,动画从 0% 到 80% 的阶段进行了水平移动,然后在 80% 到 100% 的阶段保持了最后一帧的状态,即元素位于水平方向上的最终位置。

这样做可以使得动画在结束阶段缓缓减速,给用户一个更平滑的动画体验。

七、随机感:动画周期设置

多个元素同时运动,可以设置不同 duration 和 delay。除⾮时间是各粒⼦时间的最⼩公倍数,否则不会回归到初始状态,从⽽产⽣随机感。

在多个元素同时运动时,如果它们具有不同的 durationdelay,它们的动画周期不会是一个固定的整数倍关系,因此它们不会在同一时刻回归到初始状态,从而产生了一种随机感。

这是因为当动画周期不是一个固定的整数倍关系时,各个元素的动画在同一时刻处于不同的阶段,导致它们的动画效果看起来更加错落有致、自然多样。

以下是一个具体示例,展示了如何通过设置不同的 durationdelay,使得多个元素同时运动,产生随机感的动画效果:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Random Motion</title>
<style>
  .box {
    width: 50px;
    height: 50px;
    background-color: blue;
    position: absolute;
    border-radius: 50%;
  }

  .box:nth-child(1) {
    animation: move1 2s linear infinite;
    top: 100px;
    left: 100px;
  }

  .box:nth-child(2) {
    animation: move2 3s linear infinite;
    top: 200px;
    left: 200px;
  }

  @keyframes move1 {
    0% {
      transform: translateX(0);
    }
    100% {
      transform: translateX(200px);
    }
  }

  @keyframes move2 {
    0% {
      transform: translateY(0);
    }
    100% {
      transform: translateY(200px);
    }
  }
</style>
</head>
<body>
  <div class="box"></div>
  <div class="box"></div>
</body>
</html>

在这个示例中,有两个蓝色的圆形 .box 元素,它们分别通过不同的 animation 属性设置了不同的动画效果(move1move2),并且具有不同的起始位置和动画持续时间。

因此,它们的动画周期不是一个固定的整数倍关系,从而产生了一种随机感的动画效果。

八、抛物线:两个内外div实现x和y向量运动

主要就是利用两个内外div实现x向量运动和y向量运动,y向量运动引入贝塞尔曲线,即可实现适当曲线运动。

在上一篇我们在学习贝塞尔曲线时实现过。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Parabolic Motion</title>
<style>
  .ball {
    width: 50px;
    height: 50px;
    background-color: red;
    position: absolute;
    border-radius: 50%;
    animation: horizontalMove 2s linear forwards, verticalMove 2s cubic-bezier(.74,.2,.95,.47) forwards;
  }
  @keyframes horizontalMove {
    0% {
      left: 0;
    }
    100% {
      left: 200px;
    }
  }
  @keyframes verticalMove {
    0% {
      top: 0;
    }
    100% {
      top: 200px;
    }
  }
</style>
</head>
<body>
  <div class="ball"></div>
</body>
</html>

我们是实现了一个 div 在 left 和 top 两个方向属性上的不同速度的变化来模拟抛物线。

但假如我们定义了如下:

  @keyframes horizontalMove {
    0% {
      transform: translateX(0);
    }
    100% {
      transform: translateY(200px);
    }
  }
  @keyframes verticalMove {
    0% {
      transform: translateY(0);
    }
    100% {
      transform: translateY(200px);
    }
  }

主要就是利用x向量运动和y向量运动,x向量匀速运动,y向量运动引入贝塞尔曲线,即可实现适当曲线运动。

这种方法可以应用于各种场景,比如游戏中的角色移动、用户界面中的动态效果、数据可视化中的图表动画等。通过调整贝塞尔曲线的控制点,可以实现不同形状的曲线运动,从而满足不同的需求和设计目的。

以下是一个更普适的示例,演示了如何利用两个 div 元素和贝塞尔曲线来实现适当的曲线运动:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bezier Curve Animation</title>
<style>
  .outer {
    position: relative;
    width: 400px;
    height: 400px;
    border: 1px solid black;
    overflow: hidden;
  }

  .inner {
    position: absolute;
    width: 50px;
    height: 50px;
    background-color: blue;
    border-radius: 50%;
    animation: moveX 2s linear infinite, moveY 2s cubic-bezier(.74,.2,.95,.47) infinite;
  }

  @keyframes moveX {
    0% {
      left: 0;
    }
    100% {
      left: calc(100% - 50px);
    }
  }

  @keyframes moveY {
    0% {
      top: 0;
    }
    100% {
      top: calc(100% - 50px);
    }
  }
</style>
</head>
<body>
  <div class="outer">
    <div class="inner"></div>
  </div>
</body>
</html>

在这个示例中,.outer div 元素作为外部容器,限制活动范围.inner div 元素作为内部元素,利用两个不同的动画分别控制 x 向量和 y 向量的运动。在 y 向量的运动中,引入了贝塞尔曲线,使得动画呈现出适当的曲线运动效果。

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

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

相关文章

RAG讲解

现有的LLM已经具备了理解、生成、逻辑和记忆能力&#xff0c;RAG(Retrieval Augmented Generation)则是为其套上外挂&#xff0c;使LLM能够访问训练数据来源之外的权威知识库&#xff0c;并生成领域特定的内容&#xff0c;而无须重新训练模型。 RAG的优势 经济高效&#xff1a…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

HTML标签快速入门

文章目录 一、HTML语法规范1.1 基本语法概述1.2 标签关系 二、HTML基本结构标签2.1 第一个HTML网页2.2 基本结构标签总结 三、网页开发工具3.1 文档类型声明标签3.2 lang 语言种类3.3 字符集3.4 总结 四、HTML常用标签4.1 标签语义4.2 标题标签\<h1> - \<h6>&#…

RuvarOA协同办公平台 多处 SQL注入漏洞复现

0x01 产品简介 RuvarOA办公自动化系统是广州市璐华计算机科技有限公司采用组件技术和Web技术相结合,基于Windows平台,构建在大型关系数据库管理系统基础上的,以行政办公为核心,以集成融通业务办公为目标,将网络与无线通讯等信息技术完美结合在一起设计而成的新型办公自动…

NodeMCU ESP8266 操作 SSD1306 OLED显示屏详解(图文并茂)

文章目录 1 模块介绍2 接线介绍3 安装SSD1306驱动库4 源码分析4.1 硬件兼容性4.2 可能存在的问题总结1 模块介绍 我们将在本教程中使用的OLED显示屏是SSD1306型号:单色0.96英寸显示屏,像素为12864,如下图所示。 OLED显示屏不需要背光,这在黑暗环境中会产生非常好的对比度。…

Curator分布式锁

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 分布式锁服务宕机,…

实现二叉树的基本操作

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1我们先来模拟创建一个二叉树 public class TestBinaryTreee {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val val;}}public TreeNode …

Web入门——三栏布局页面

前置知识 内外边距 内边距(padding)&#xff1a; padding是元素边框与其内容之间的空间。也就是说&#xff0c;如果你给一个元素设置了内边距&#xff0c;这个空间会作为元素内容与元素边框之间的缓冲区域。设置内边距会使元素本身变大。例如padding:10px就创建了10像素的空间…

每日OJ题_贪心算法四④_力扣397. 整数替换

目录 力扣397. 整数替换 解析代码 力扣397. 整数替换 397. 整数替换 难度 中等 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需…

计算机网络复习-传输层

概念 传输层是进程与进程之间的通信使用端口(Port)来标记不同的网络进程端口(Port)使用16比特位表示(0~65535) UDP协议详解 UDP&#xff1a;用户数据报协议数据报&#xff1a;应用层传输过来的一个完整的数据不合并&#xff0c;不拆分 UDP的头部 UDP特点 UDP是无连接协…

picoCTF-Web Exploitation-Trickster

Description I found a web app that can help process images: PNG images only! 这应该是个上传漏洞了&#xff0c;十几年没用过了&#xff0c;不知道思路是不是一样的&#xff0c;以前的思路是通过上传漏洞想办法上传一个木马&#xff0c;拿到webshell&#xff0c;今天试试看…

【计算机网络】物理层 通信基础、奈氏准则、香农公式 习题2

下列说法中正确的是( )。 A. 信道与通信电路类似&#xff0c;一条可通信的电路往往包含一个信道 B.调制是指把模拟数据转换为数字信号的过程 C. 信息传输速率是指通信信道上每秒传输的码元数 D.在数值上&#xff0c;波特率等于比特率与每符号所含的比特数的比值 信息传输速率&a…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…

【Apache Doris】周FAQ集锦:第 3 期

【Apache Doris】周FAQ集锦&#xff1a;第 3 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

SpringBoot+Vue实现图片滑块和文字点击验证码

一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程&#xff0c;目前已可被机器暴力破解&#xff0c;应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码&#xff0c;采用行为验证码采用嵌入式集成方式&#xff0c;接入方便&#xff0c;安全&#…

速了解及使用布隆过滤器

布隆过滤器 介绍 概念&#xff1a;是一种高效查询的数据结构 作用&#xff1a;判断某个元素是否在一个集合中。&#xff08;但是会出现误判的情况&#xff09; 实现原理 加入元素&#xff1a; 当一个元素需要加入到布隆过滤器中时&#xff0c;会使用一组哈希函数对该元素进…

每周日发系统规划与管理师伴读脑图,今天是第4章

从第4章开始&#xff0c;系统规划与管理师的学习就正式步入了主题&#xff0c;考虑到我过去中断了2周&#xff0c;想必你的第4章教程已经看完了吧&#xff1f;

2024年天津市静海区教师招聘报名流程(建议电脑)

2024年天津市静海区教师招聘报名流程&#xff08;建议电脑&#xff09; #报名 #教师招聘 #教师招聘考试 #教招 #天津教师招聘 #天津教师招聘考试 #24年天津教师招聘 #24年天津市教师招聘考试 #天津市静海区教师招聘 #静海区教师招聘考试 #静海区教师编 #静海区#

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率&#xff08;线程处理请求的时间占比&#xff09;。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下&#xff0c;查看…

Ubuntu意外断电vmdk损坏--打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。

背景&#xff1a;电脑资源管理器崩溃卡死&#xff0c;强行断电重启&#xff0c;结果虚拟机打不开了&#xff0c;提示打不开磁盘“***.vmdk”或它所依赖的某个快照磁盘。 删除lck文件&#xff1a;失败vmware-vdiskmanager修复 &#xff1a;提示无法修复最终用 VMFS Recovery挂载…