CSS3 动画 animation 入门学习笔记 之 属性详解

文章目录

  • 简单介绍 CSS 动画
  • CSS 动画的作用
  • CSS 动画语法介绍
  • CSS 动画属性
    • animation-name
    • animation-duration
    • animation-delay
    • animation-direction
    • animation-iteration-count
    • animation-play-state
    • animation-timing-function
    • animation-fill-mode
    • animation

简单介绍 CSS 动画

引用 MDN 对 CSS 动画的说明:

  • CSS 动画模块(CSS Animation)可以让你通过使用关键帧对 CSS 属性的值进行动画处理,例如背景位置和变换。
  • 每个关键帧都描述了动画元素在动画序列中的某个特定时间应该如何呈现。
  • 你可以使用动画模块中的属性来控制动画的持续时间、重复次数、延迟启动等方面。

简单讲,CSS 动画是用于实现元素从一个 CSS 样式配置转换到另一个 CSS 样式配置的呈现效果。

CSS 动画的作用

CSS 动画使得您能够实现一些难以置信的效果点缀您的页面或者应用程序。(MDN)

CSS 动画语法介绍

动画语法包括两个部分:

  • 描述动画的样式规则。
  • 指定动画开始、结束以及中间点样式的关键帧。

示例代码:

/* 指定动画的样式规则 */
.div {width: 200px;height: 200px;animation: change 3s;
}/* 指定动画开始、结束点样式的关键帧。 */
@keyframes change {0% {background-color: #f00;}100% {background-color: #fff;}
}

结合上例,对一个元素创建动画,需要在元素的 CSS 选择器上使用animation属性或其子属性来配置动画时长、动画呈现方式及其他动画运行时相关参数,而动画在不同时间点的关键帧的表现样式则需要通过@keyframes来配置。

CSS 动画属性

animation-name

指定由 @keyframes 定义动画名称标识,多个使用逗号隔开。

animation-duration

设置动画一个周期的时长,值必须为正数或 0,单位:秒(s)或毫秒(ms)。
示例:说明:本文示例代码由 vue3 + element-plus 构建

<template><el-card header="animation-duration"><div class="ani-box slow" :class="{ running: playState }"><div>10s</div></div><div class="ani-box fast" :class="{ running: playState }"><div>3s</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template><style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;text-align: center;line-height: 80px;color: wheat;font-size: 20px;margin-bottom: 20px;}.ani-box.slow {animation-duration: 10s;}.ani-box.fast {animation-duration: 3s;}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(500px);}}
</style><script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-duration

animation-delay

设置延时,指定从应用动画到元素开始执行之前等待的时间,值可以是负值,单位:秒(s)或毫秒(ms)。

  • 默认值为 0s,表示动画应立即开始。
  • 正值表示动画应在指定的时间量过去后开始。
  • 负值会导致动画立即开始,但是从动画循环的某个时间点开始。

示例代码:

<template><el-card header="animation-delay"><div class="ani-box default" :class="{ running: playState }"><div>0s</div></div><div class="ani-box positive" :class="{ running: playState }"><div>5s</div></div><div class="ani-box negative" :class="{ running: playState }"><div>-5s</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 80px;color: wheat;font-size: 20px;margin-bottom: 20px;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;animation-duration: 10s;animation-timing-function: linear;}.ani-box.default {animation-delay: 0s;}.ani-box.positive {animation-delay: 5s;}.ani-box.negative {animation-delay: -5s;}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(500px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-delay

animation-direction

设置动画是正向播放、反向播放、还是在正向和反向之间交替播放。可选值:

  • normal:动画在每个循环中正向播放。即每次动画循环时,动画将重置为起始状态并重新开始。默认值。
  • reverse:动画在每个循环中反向播放。即每次动画循环时,动画将重置为结束状态并重新开始。
  • alternate:动画在每个循环中正反交替播放,第一次是正向播放。
  • alternate-rever:动画在每个循环中正反交替播放,第一次是反向播放。

示例代码:

<template><el-card header="animation-direction"><div class="ani-box normal" :class="{ running: playState }"><div>normal</div></div><div class="ani-box reverse" :class="{ running: playState }"><div>reverse</div></div><div class="ani-box alternate" :class="{ running: playState }"><div>alternate</div></div><div class="ani-box alternate-reverse" :class="{ running: playState }"><div>alternate-reverse</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 1;display: flex;align-items: center;justify-content: center;color: wheat;font-size: 16px;margin-bottom: 20px;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;animation-duration: 2s;animation-timing-function: linear;animation-iteration-count: 4;}.ani-box.normal {animation-direction: normal;}.ani-box.reverse {animation-direction: reverse;}.ani-box.alternate {animation-direction: alternate;}.ani-box.alternate-reverse {animation-direction: alternate-reverse;}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(500px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-direction

animation-iteration-count

设置动画在停止前应播放的次数。可选值:

  • infinite:无限循环播放动画。
  • 数值:动画重复次数,默认 1,可以是小数,如 0.5 将动画播放一半,负值无效。

示例代码:

<template><el-card header="animation-iteration-count"><div class="ani-box half" :class="{ running: playState }"><div>0.5次</div></div><div class="ani-box once" :class="{ running: playState }"><div>1次</div></div><div class="ani-box twice" :class="{ running: playState }"><div>2次</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 80px;color: wheat;font-size: 20px;margin-bottom: 20px;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;animation-duration: 6s;animation-timing-function: linear;}.ani-box.half {animation-iteration-count: 0.5;}.ani-box.once {animation-iteration-count: 1;}.ani-box.twice {animation-iteration-count: 2;}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(500px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-iteration-count

animation-play-state

设置动画运行状态,运行或暂停。可选值:

  • running:设置动画为运行状态。
  • paused:设置动画为暂停状态。

示例代码:

<template><el-card header="animation-play-state"><div class="ani-box running">51BLOG</div><el-alerttitle="鼠标悬浮时运行动画,离开时暂停动画。":closable="false"show-icontype="warning"></el-alert></el-card>
</template>
<style lang="scss" scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 4px;text-align: center;line-height: 80px;color: wheat;font-size: 16px;text-shadow: 1px 2px 1px red;margin-bottom: 30px;cursor: pointer;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;animation-duration: 5s;animation-timing-function: linear;}.ani-box:hover {animation-play-state: running;}@keyframes move {0% {transform: rotate(0);}100% {transform: rotate(360deg);}}
</style>

运行结果:
animation-play-state

animation-timing-function

设置动画在每个周期的持续时间内如何进行。支持三种类型值:

  • 关键字值
    • ease 默认值,表示动画在中间加速,在结束时减速。等同于 cubic-bezier(0.25, 0.1, 0.25, 1.0)
    • ease-in 表示动画一开始较慢,随着动画属性的变化逐渐加快,直至完成。等同于 cubic-bezier(0.42, 0, 1.0, 1.0)
    • ease-out 表示动画一开始较快,随着动画的进行逐渐减速。等同于 cubic_bezier(0, 0, 0.58, 1.0)
    • ease-in-out 表示动画一开始缓慢变化,随后加速变化,最后再次减速变化。等同于 cubic_bezier(0.42, 0, 0.58, 1.0)
    • linear 表示动画以匀速运动。等同于 cubic-bezier(0.0, 0.0, 1.0, 1.0)
    • step-start 等同于 steps(1, jump-start)
    • step-end 等同于 steps(1, jump-end)

      ease、ease-in、ease-out、ease-in-out、linear 称之为非阶跃(non-step)关键字值,代表了固定的四点值的三次贝塞尔曲线

示例代码:

<template><el-card header="animation-timing-function: ease"><div class="ani-box ease" :class="{ running: playState }"><div>ease</div></div><div class="ani-box ease-in" :class="{ running: playState }"><div>ease-in</div></div><div class="ani-box ease-out" :class="{ running: playState }"><div>ease-out</div></div><div class="ani-box ease-in-out" :class="{ running: playState }"><div>ease-in-out</div></div><div class="ani-box linear" :class="{ running: playState }"><div>linear</div></div><div class="ani-box cubic-bezier" :class="{ running: playState }"><div>cubic-bezier</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 1;display: flex;justify-content: center;align-items: center;color: wheat;font-size: 16px;margin-bottom: 20px;animation-name: move;animation-fill-mode: forwards;animation-play-state: paused;animation-duration: 10s;animation-timing-function: linear;}.ani-box.ease {animation-timing-function: ease;}.ani-box.ease-in {animation-timing-function: ease-in;}.ani-box.ease-out {animation-timing-function: ease-out;}.ani-box.ease-in-out {animation-timing-function: ease-in-out;}.ani-box.linear {animation-timing-function: linear;}.ani-box.cubic-bezier {animation-timing-function: cubic-bezier(0.19, 1, 0.86, 0.01);}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(800px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-timing-function-ease

  • 函数值
    • cubic-bezier(0.1, 0.7, 1, 0.1) 开发者自定义的三次贝塞尔曲线,其中 p1 和 p3 的值必须在 0 到 1 的范围内。
  • Step 函数关键字,语法:steps(n, <jumpterm>)
    语法解析:按照 n 个定格在过渡中显示动画迭代,每个定格等长时间显示。
    例如:如果 n 为 5,则有 5 个步骤。
    动画是否在 0%、20%、40%、60%、80%处,或 20%、40%、60%、80%、100%处暂停,或动画在 0%和 100%之间的 5 个定格,又或者在包括 0%和 100%的情况下设置 5 个定格(0%、25%、50%、75%、100%处),取决于 jumpterm 的值:
    • jump-start 表示一个左连续函数,因此第一个跳跃发生在动画开始时。
    • jump-end 表示一个右连续函数,因此第一个跳跃发生在动画结束时。
    • jump-none 两端都没有跳跃。
    • jump-both 在 0% 和 100% 标记处停留,有效地在动画迭代过程中添加一个步骤。
    • start 等同于 jump-start
    • end 等同于 jump-end
      示例代码:
<template><el-card header="animation-timing-function: steps(n, <jumpterm>)"><div class="ani-box jump-start" :class="{ running: playState }"><div>jump-start</div></div><div class="ani-box jump-end" :class="{ running: playState }"><div>jump-end</div></div><div class="ani-box jump-none" :class="{ running: playState }"><div>jump-none</div></div><div class="ani-box jump-both" :class="{ running: playState }"><div>jump-both</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 1;display: flex;justify-content: center;align-items: center;color: wheat;font-size: 16px;margin-bottom: 20px;animation-name: move;animation-fill-mode: none;animation-play-state: paused;animation-duration: 10s;}.ani-box.jump-start {animation-timing-function: steps(5, jump-start);}.ani-box.jump-end {animation-timing-function: steps(5, jump-end);}.ani-box.jump-none {animation-timing-function: steps(5, jump-none);}.ani-box.jump-both {animation-timing-function: steps(5, jump-both);}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(0px);}100% {transform: translateX(800px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-timing-function-steps

animation-fill-mode

设置动画在执行之前和之后如何将样式应用于其目标。可选值:

  • none 当未执行动画时,动画将不会将任何样式应用于目标,而是以已经赋予该元素的样式来显示。这是默认值。
  • forward 动画执行完之后,目标将保留由执行遇到的最后一个关键帧计算值,最后一个关键帧取决于 animation-direction 和 animation-iteration-count 的值。
  • backwards 动画将在应用于目标时(执行前)立即应用第一个关键帧中定义的值,并在 animation-delay 期间保留此值。第一个关键帧取决于 animation-direction 的值。
  • both 动画将遵循 forwards 和 backwards 的规则,从而在两个方向上扩展动画属性。

示例代码:

<template><el-card header="animation-fill-mode"><div class="ani-box none" :class="{ running: playState }"><div>none</div></div><div class="ani-box forwards" :class="{ running: playState }"><div>forwards</div></div><div class="ani-box backwords" :class="{ running: playState }"><div>backwards</div></div><div class="ani-box both" :class="{ running: playState }"><div>both</div></div><el-button type="primary" @click="handleAnimationRunning">播放动画</el-button></el-card>
</template>
<style scoped>.ani-box {width: 80px;height: 80px;background-color: darkcyan;border-radius: 40px;text-align: center;line-height: 80px;color: wheat;font-size: 16px;margin-bottom: 20px;animation-name: move;animation-play-state: paused;animation-duration: 5s;animation-timing-function: linear;animation-delay: 1s;}.ani-box.none {animation-fill-mode: none;}.ani-box.forwards {animation-fill-mode: forwards;}.ani-box.backwords {animation-fill-mode: backwards;}.ani-box.both {animation-fill-mode: both;}.ani-box.running {animation-play-state: running;}@keyframes move {0% {transform: translateX(200px);}100% {transform: translateX(500px);}}
</style>
<script setup>import { ref } from "vue";const playState = ref(false);const handleAnimationRunning = () => {playState.value = true;};
</script>

运行结果:
animation-fill-mode

animation

animation 是上面这些属性的一个简写属性形式。后续会单独写篇文章来详细介绍。

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

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

相关文章

基于深度学习的高精度80类动物目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度80类动物目标检测识别系统可用于日常生活中或野外来检测与定位80类动物目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的80类动物目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YO…

Matplotlib是什么

Matplotlib 是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂&#xff0c;深受广大技术爱好者喜爱。 NumPy 是 Python 科学计算的软件包&#xff0c;ndarray 则…

HTTP1.1 wireshark分析

目录 http1.1wireshark分析http 1.1 keep-alive的2次http请求wireshark分析http1.1 keep-alive过期的2次请求keep-alive报文 本地springboot启动一个简单的服务&#xff0c;然后请求测试 tcpdump -i lo0 -nnvv -w tmp.cap tcpdump 本地回环网卡 http1.1 HTTP/1.0 每进行一次…

蚂蚁集团开源可信隐私计算框架「隐语」:开放、通用

7 月 4 日,蚂蚁集团宣布面向全球开发者正式开源可信隐私计算框架 “隐语”。 隐语是蚂蚁集团历时 6 年自主研发,以安全、开放为核心设计理念打造的可信隐私计算技术框架,涵盖了当前几乎所有主流隐私计算技术。 据介绍,隐语内置 MPC、TEE、同态等多种密态计算虚拟设备,提…

操作系统练习:创建内核模块,并加载和卸载模块

说明 本文记录如何创建和编译一个内核模块&#xff0c;以及加载和卸载内核模块。为《操作系统概念(第九版)》第二章&#xff0c;关于“Linux内核模块”的练习题。 创建内核模块 注&#xff1a;我这里是基于阿里云的轻量应用服务器&#xff08;即当前博客服务器&#xff09; 首…

【Linux】分布式监控 Zabbix

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Zabbix 介绍zabbix 概述Zabbix 监控原理Zabbix 6.0 新特性Zabbix 6.0 功能组件 Zabbix 6.0 部署Zabbix 添加客户端主机Zabbix 自定义监控内容Zabbix 自动发现与自动…

Python+Requests+Excel接口测试实战

1、EXCEL文件接口保存方式&#xff0c;如图。 2、然后就是读取EXCEL文件中的数据方法&#xff0c;如下&#xff1a; 1 import xlrd2 3 4 class readExcel(object):5 def __init__(self, path):6 self.path path7 8 property9 def getSheet(self): 10 …

android更换开机动画

android11 路径&#xff1a;device / {vendor-name} / {platform-name} / {device-name} / system / bootanimation.zip 例&#xff1a;android \ device \ softwinner \ ceres \ ceres-b6 \ system \ bootanimation.zip android13 路径&#xff1a;device / softwinner / {PRO…

MyBatis全篇

文章目录 MyBatis特性下载持久化层技术对比 搭建MyBatis创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件测试功能加入log4j日志功能加入log4j的配置文件 核心配置文件的完善与详解MyBatis的增删改查测试功能 MyBatis获取参数值在IDEA中设置中配置文…

《TCP/IP网络编程》第3,4章学习记录

基础知识&#xff1a; struct sockaddr_in {sa_family_t sin_family; //地址族&#xff08;Address Family)uint16_t sin_port; //16位TCP/UDP端口号struct in_addr sin_addr; //32位IP地址char sin_zero[8]; //不使用 }sa_family_t包括&#xff1a; (1)AF_INET,IPv4网络协议…

Linux宝塔Mysql读写分离配置,两台服务器,服务器存在多个库

Linux宝塔Mysql读写分离配置&#xff0c;两台服务器&#xff0c;服务器存在多个库 一、主库操作 #登录数据库&#xff0c;用root登录方便&#xff0c;用其他账号会提示权限不足&#xff0c;需要登录root给予权限 mysql -u root -p 密码#创建一个账号&#xff0c;供从库用该账…

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…

网络编程 socket

目录 网络编程 套接字&#xff08;socket&#xff09;1. 认识端口号2. TCP协议3. UDP协议4. 网络字节序列5. 常见的套接字6. socket编程接口6.1 socket常见APIsocket函数recvfrom函数sendto函数read函数 从tcp socket中读取接收数据 6.2 sockaddr结构6.3 地址转换函数6.4 udp s…

JVM内存结构—— 程序计数器,虚拟机栈 解析

JVM的内存结构 1. 程序计数器(PC Register )寄存器 1.1 全称:Program Counter Register 1.2 作用 首先,java源代码 被 编译成 二进制的 字节码 (jvm指令) jvm跨平台就是这一套指令,linux 下,windows下指令都是一致的 指令 经过 解释器 把每一条指令 解释成 机器码…

SpringBoot项目从0到1配置logback日志打印

大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术相关的问题并整理成文&#xff0c;限于本人水平&#xff0c;如果文章和代码有表述不当之处&#xff0c;还请不吝赐教。 以下是正文&#xff01; 一、写文背景 我们在写后端…

安卓进度条:ProgressBar和Seekbar

一、ProgressBar进度条介绍 ProgressBar 是 Android 中的一个进度条控件&#xff0c;用于显示正在进行的任务的进度。它可以以水平或圆形的形式展示进度&#xff0c;并提供了多种样式和属性来满足不同的需求。 相关属性&#xff1a; android:progress&#xff1a;设置进度条的…

计数排序

计数排序 排序步骤 1、以最大值和最小值的差值加一为长度创建一个新数组 2、将索引为0对应最小值&#xff0c;索引为1对应最小值1&#xff0c;索引为2对应最小值2&#xff0c;以此类推&#xff0c;将索引对应最小值到最大值之间所有的值 3、遍历一遍&#xff0c;遇到一个数字…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式&#xff0c;简单的使用postman构造http请求&#xff0c;进一步了解https, 学习https的加密过程&#xff0c;了解对称密钥与非对称密钥对于加密是如何进行的&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…