WHAT - CSS Animationtion 动画系列(二)

目录

  • 一、循环波浪
  • 二、关键帧呼应
  • 三、关键帧顺接
  • 四、利用 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.xdnf.cn/news/1420455.html

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

相关文章

LLM推理入门指南③:剖析模型性能

在本系列文章《LLM推理入门指南①&#xff1a;文本生成的初始化与解码阶段》中&#xff0c;作者对Transformer解码器的文本生成算法进行了高层次概述&#xff0c;着重介绍了两个阶段&#xff1a;提示的处理阶段和逐个生成补全词元的多步生成阶段。在上一篇文章《LLM推理入门指南…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

愿岁月温柔以待你,爱你不止三千遍│活动进行中:以AI之名,时光陪伴

愿岁月温柔以待你&#xff0c;爱你不止三千遍│活动进行中&#xff1a;以AI之名&#xff0c;时光陪伴 在这个充满温馨的母亲节&#xff0c;我们很高兴地宣布&#xff0c;星鸾云A平台推出了一项特别活动&#xff1a;“以AI之名&#xff0c;时光陪伴”。我们相信&#xff0c;科技…

该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn 该从哪些方面提升系统的吞吐量&#xff1f; 我们平时自己做的项目一般没有用户量&#xff0c;都是练手项目&#xff0c;所以并不会在吞吐量上做出很多的优化&#xff0c;但是这样的话&#xff0c;又会导致项目和其他人相比并没有…

机器学习(1)

目录 1-1.西瓜书 1-2.课程定位 1-3.机器学习 1-4.典型的机器学习过程 1-5.机器学习理论 1-6.基本术语 1-7.归纳偏好 1-8.NFL定理 1-1.西瓜书 建议使用方式 1.初学机器学习的第一本书:通读、速读;细节不懂处略过&#xff0c;了解机器学习的疆域和基本思想&#xff0c;…

电路板维修【三】

自恢复保险丝&#xff1a; 自恢复保险丝属于慢断类型保险丝&#xff0c;自恢复保险丝的材料因为通电后发热&#xff0c;当电流过大发热到一定程度的时候&#xff0c;材料就不导电了&#xff0c;这个和普通的保险丝是一个道理&#xff0c;只不过普通的保险丝是一次型熔断而已。…

pair对组创建

创建方式1: pair<type,type> p(value1,value2); pair<string, int> p("Tom", 20); cout << "name:" << p.first << "age:" << p.second << endl; 创建方式2: pair<type,type> pmake_pair(v…

妙笔生花,创作无限——WonderPen妙笔 for Mac

写作&#xff0c;是灵感的流淌&#xff0c;是心灵的独白。WonderPen妙笔 for Mac&#xff0c;为您的灵感插上翅膀&#xff0c;让您的创作更加流畅自如。它拥有简洁直观的界面设计&#xff0c;让您的思绪在纯净的写作环境中自由飞翔。多种写作模式&#xff0c;满足您不同的创作需…

OFDM802.11a的FPGA实现(十三)加窗(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。 2.加窗 对OFDM符号“加窗”意味着令符号周期边缘的幅度…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现&#xff0c;项目以Web系统形式展示&#xff0c;利用Xpath爬虫爬取去哪儿网针对旅游业的需求&#xff0c;对国内热门旅游景点数据可视化系统&#xff0c;将爬取好的数据保存为CSV文件&#xff0c;再通过ORM框架导入MySQL数…

软件库V1.5版本iApp源码V3

软件库V1.5版本iApp源码V3 配置教程在【mian.iyu】的【载入事件】 更新内容&#xff1a; 1、分类对接蓝奏&#xff08;免费&#xff0c;付费&#xff0c;会员&#xff0c;广告&#xff09;&#xff0c;支持蓝奏文件描述设置为简介&#xff08;改动&#xff1a;首页.iyu&#…

【信道编码】2 卷积码、状态转移图、状态转移表、网格表示和码字路径

【信道编码】2 卷积码、状态转移图、状态转移表、网格表示和码字路径 写在最前面例题先行&#xff0c;原理随后示例&#xff1a;输入为01011100状态转移表状态转移图 卷积码的原理原理与结构工作流程误差纠正 &#xff08;2,1,2&#xff09;卷积编码器工作原理结构和示例状态转…

【神经网络】输出层的设计

文章目录 前言一、恒等函数和softmax函数恒等函数softmax 函数python实现softmax函数 二、实现softmax函数时的注意事项函数优化python实现 三、softmax函数的特征计算神经网络的输出输出层的softmax函数可以省略“学习”和“推理”阶段 四、输出层的神经元数量 前言 神经网络…

【SpringMVC 】什么是SpringMVC(三)?基于springmvc的文件上传、基于springmvc的拦截器、基于springmvc的邮件发送

文章目录 SpringMVC第五章1、SpringMVC文件上传1、基本步骤1-2345-82、邮件发送1、基本步骤1-234-5567-8 简单邮件带附件的邮件第六章1、拦截器的使用使用步骤232、调度的使用基本步骤1-56-8调度规则3、shiro安全框架核心概念基本语法1、基于ini文件的认证**测视类**2、基于rea…

【系统架构师】-选择题(十三)数据库基础

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

用户登录:断点看流程认证

参考原文Security认证流程 第一步:先认识一下令牌 开始断点 执行new UsernamePasswordAuthenticationToken 1.Authentication接口: 它的实现类&#xff0c;表示当前访问系统的用户&#xff0c;封装了用户相关信息。(我们实现类是UsernamePasswordAuthenticationToken) 点击…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中&#xff0c;实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

windows编译opencv4.9

opencv很多人在windows上编译感觉特别麻烦&#xff0c;没有linux下方便&#xff0c;设定以下三点&#xff0c;我们几乎会无障碍。 1 安装cuda&#xff0c;cudnn 安装好cuda&#xff0c;cudnn&#xff0c;把cudnn的头文件&#xff0c;库等等拷贝到cuda的安装目录下面&#xff…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中&#xff0c;我们经常需要从各种…