CSS——过渡与动画

news2024/11/18 5:30:57

1. 缓动效果

给过渡和动画加上缓动效果(比如具有回弹效果的过渡过程)

回弹效果是指当一个过渡达到最终值时,往回倒一点,然后再次回到最终值,如此往复一次或多次,并逐渐收敛,最终稳定在最终值。

假设要用一个元素来模拟一个下落的小球,我们会把 transform 属性从 none 过渡到 translateY(350px) 来模拟这个下落过程。

1.1 弹跳动画

CSS 提供了一个 cubic-bezier()函数,允许我们指定自定义的调速函数。

  • 它接受四个参数,分别代表两个控制锚点的坐标值,我们通过这两个控制锚点来指定想要的贝塞尔曲线
  • 语法形式是这样的:cubic-bezier(x1, y1, x2, y2),其中 (x1, y1) 表示第一个控制锚点的坐标,而 (x2, y2) 是第二个。
  • 曲线片断的两个端点分别固定在(0,0) 和 (1,1),前者是整个过渡的起点(时间进度为零,动画进度为零),后者是终点(时间进度为 100%,动画进度为 100%)
<!DOCTYPE html>
<html><head><style> @keyframes bounce {60%, 80%, to {transform: translateY(400px);animation-timing-function: ease;}70% {transform: translateY(300px);}90% {transform: translateY(360px);}}.ball {width: 0;height: 0;padding: 1.5em;border-radius: 50%;margin: auto;background: red radial-gradient(at 30% 30%, #fdd, red);animation: bounce 2s cubic-bezier(0.1, 0.25, 1, 0.25) forwards;}body {background: linear-gradient(skyblue, white 450px, yellowgreen 0);min-height: 100vh;} </style></head><body><div class="ball"></div></body>
</html> 

1.2 弹性过渡

假设有一个文本输入框,每当它被聚焦时,都需要展示一个提示框。这个提示框用来向用户提供帮助信息,比如字段值的正确格式等

CSS 属性 transform-origin 更改一个元素变形的原点。

<!DOCTYPE html>
<html><head><style> input:not(:focus) + .callout:not(:hover) {/*隐藏.callout*/transform: scale(0);transition: 0.25s transform;}.callout {transition: 0.5s cubic-bezier(0.25, 0.1, 0.3, 1.5) transform;transform-origin: 1.4em -0.4em;}/* Styling */body {padding: 1.5em;font: 200%/1.6 Baskerville;}input {display: block;padding: 0 0.4em;font: inherit;}/*提示框样式*/.callout {position: absolute;max-width: 14em;padding: 0.6em 0.8em;border-radius: 0.3em;margin: 0.3em 0 0 -0.2em;background: #fed;border: 1px solid rgba(0, 0, 0, 0.3);box-shadow: 0.05em 0.2em 0.6em rgba(0, 0, 0, 0.2);font-size: 75%;}/*三角形的箭头*/.callout:before {content: "";position: absolute;top: -0.4em;left: 1em;padding: 0.35em;background: inherit;border: inherit;border-right: 0;border-bottom: 0;transform: rotate(45deg);} </style></head><body><label>Your username:<input value="leaverou"></input><span class="callout">Only letters, numbers, underscores (_) and hyphens (-) allowed!</span></label></body>
</html> 

2. 逐帧动画

以最常见的 “加载中” 的效果为例:

使用step()函数,它可以传入一个参数,表示此次动画是分几步完成的,例如,step(8) 表示此次动画是分8部完成,也就是总共8帧,且逐帧匀速去执行的。

<!DOCTYPE html>
<html><head><style> @keyframes loader {to {background-position: -800px 0;}}.loader {width: 100px;height: 100px;text-indent: 999px;overflow: hidden; /* Hide text */background: url(http://dabblet.com/img/loader.png) 0 0;animation: loader 1s infinite steps(8);} </style></head><body><div class="loader">Loading…</div></body>
</html> 

3. 闪烁效果

通过数次闪烁(不超过三次)来提示用户界面中有某处发生了变化。

  • 比如对整个元素进行闪烁(通过 opacity 属性),
  • 对文字的颜色进行闪烁(通过 color 属性),
  • 对边框进行闪烁(通过 border-color 属性),等等

animation-direction 的 唯 一 作 用 就 是 反 转 每 一 个 循 环 周 期(reverse),或第偶数个循环周期(alternate),或第奇数个循环周期(alternate-reverse)。它的伟大之处在于,它会同时反转调整函数,从而产生更加逼真的动画效果

<!DOCTYPE html>
<html><head><style> @keyframes blink-1 {/*让状态切换发生在每个循环周期的中间*/50% {color: transparent;}}@keyframes blink-2 {to {color: transparent;}}p {padding: 1em;background: gold;}.blink-smooth-1 {animation: 1s blink-1 3;}.blink-smooth-2 {animation: 0.5s blink-2 6;animation-direction: alternate;}.blink {animation: 1s blink-1 3 steps(1);} </style></head><body><p class="blink-smooth-1">Peek-a-boo!</p><p class="blink-smooth-2">Peek-a-boo!</p><p class="blink">Peek-a-boo!</p></body>
</html> 

4. 打字动画

一段文本中的字符逐个显现,模拟出一种打字的效果。

核心思路就是让容器的宽度成为动画的主体:把所有文本包裹在这个容器中,然后让它的宽度从 0 开始以步进动画的方式、一个字一个字地扩张到它应有的宽度。并不适用于多行文本

  • 用 white-space:nowrap; 来阻止文本折行
  • overflflow: hidden;,超出宽度的文本裁切掉
  • 逐帧动画steps()所需要的步进数量是由字符的数量来决定的
  • ch 单位,表示“0”字形的宽度。在等宽字体中,“0”字形的宽度和其他所有字形的宽度是一样的。
  • 用右边框来模拟光标效果,infinite 关键字循环闪烁光标
<!DOCTYPE html>
<html><head><style> @keyframes typing {from {width: 0;}}@keyframes caret {50% {border-right-color: transparent;}}h1 {font: bold 200% Consolas, Monaco, monospace;/*width: 8.25em;*/width: 15ch;white-space: nowrap;overflow: hidden;border-right: 0.05em solid;animation: typing 8s steps(15), caret 1s steps(1) infinite;} </style></head><body><h1>CSS is awesome!</h1></body>
</html> 

5. 状态平滑的动画——暂停动画

不是所有动画都是在页面一加载好就立即播放的。

通过动画来响应用户的动作。用户的动作会随时中断动画,而此时在默认情况下,动画只会立即停止播放,并生硬地跳回开始状态

有一个属性正好是为暂停动画的需求专门设计的:animation-play-state

<!DOCTYPE html>
<html><head><style> @keyframes panoramic {to {background-position: 100% 0;}}.panoramic {width: 150px;height: 150px;background: url("http://c3.staticflickr.com/3/2671/3904743709_74bc76d5ac_b.jpg");background-size: auto 100%;animation: panoramic 10s linear infinite alternate;animation-play-state: paused;}.panoramic:hover,.panoramic:focus {animation-play-state: running;} </style></head><body><div class="panoramic"></div></body>
</html> 

把动画加在 .panoramic 这条样式中,但是让它一开始就处于暂停状态,直到 :hover 时再启动动画。这再也不是添加和取消动画的问题了,而只是暂停和继续一个一直存在的动画,因此再也不会有生硬的 跳回现象了

6. 沿环形路径平移的动画

用CSS 动画来让一个元素沿着环形路径动起来

我们希望它只是沿着环形进行移动,同时保持自己本来的朝向

6.1 需要两个元素的解决方案

用内层的变形来抵消外层的变形效果

  • 对头像元素设置另一个旋转动画,让它以相反的方向自转一周,这两层旋转的作用会在头像上相互抵消,我们只会看到父元素旋转所产生的环绕动作
  • 让内层动画从父元素那里继承所有的动画属性,然后把动画名覆盖掉
<!DOCTYPE html>
<html><head><style> @keyframes spin {to {transform: rotate(1turn);}}.avatar {animation: spin 3s infinite linear;transform-origin: 50% 150px;}.avatar > img {animation: inherit;animation-direction: reverse;/*reverse 值,可以得到原始动画的反向版本*/}/* Anything below this is just styling */.avatar {width: 50px;margin: 0 auto;border-radius: 50%;overflow: hidden;}.avatar > img {display: block;width: inherit;}.path {width: 300px;height: 300px;padding: 20px;border-radius: 50%;background: #fb3;} </style></head><body><div class="path"><div class="avatar"><img src="http://lea.verou.me/book/adamcatlace.jpg" /></div></div></body>
</html> 

6.2 单个元素的解决方案

用两次位移变形(translate)来代替变形原点(transform-origin)的作用

每个transform-origin 都是可以被两个translate() 模拟出来的

transform: rotate(30deg);
transform-origin: 200px 300px;
/*等价*/
transform: translate(200px, 300px) rotate(30deg) translate(-200px, -300px);
transform-origin: 0 0; 

每个变形函数并不是只对这个元素进行变形,而且会把整个元素的坐标系统进行变形,从而影响所有后续的变形操作。

可以把两套动画合并为一套,并只用在 .avatar这一个元素上

把头像放在圆心并以此作为起点,我们就可以消除最开始的那两个位移操作了

<!DOCTYPE html>
<html><head><style> @keyframes spin {from {transform: rotate(0turn) translateY(-150px) translateY(50%)rotate(1turn);}to {transform: rotate(1turn) translateY(-150px) translateY(50%)rotate(0turn);}}.avatar {animation: spin 3s infinite linear;}/* Anything below this is just styling */.avatar {display: block;width: 50px;margin: calc(50% - 25px) auto 0;border-radius: 50%;overflow: hidden;}.path {width: 300px;height: 300px;padding: 20px;margin: 100px auto;border-radius: 50%;background: #fb3;} </style></head><body><div class="path"><img src="http://lea.verou.me/book/adamcatlace.jpg" class="avatar" /></div></body>
</html> 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

报表开发工具FastReport.NET的十大常见问题及解决方法

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载&#xff08;qun&#x…

Redis基础篇——SQL和NoSQL区别

文章目录认识 NoSQLSQL 和 NoSQL 的区别认识 NoSQL NoSQL&#xff0c;泛指非关系型的数据库。随着互联网web2.0网站的兴起&#xff0c;传统的关系数据库在处理web2.0网站&#xff0c;特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心&#xff0c;出现了很多…

熵及其相关概念

文章目录一、什么是熵&#xff1f;二、相对熵&#xff08;KL散度&#xff09;三、交叉熵四、条件熵&#xff0c;联合熵&#xff0c;互信息一、什么是熵&#xff1f; 熵&#xff0c;entropy&#xff0c;一个简简单单的字却撑起了机器学习的半壁江山&#xff0c;熵起源于热力学&a…

怎么做3D可视化?NebulaGraph Explorer 的图数据库可视化实践告诉你答案

前言 图数据可视化是现代 Web 可视化技术中比较常见的一种展示方式&#xff0c;NebulaGraph Explorer 作为基于 NebulaGraph 的可视化产品&#xff0c;在可视化图数据领域积累了许多经验&#xff0c;尤其是在图形渲染性能等领域。本文将系统性分享下 NebulaGraph Explorer 在 …

串口通信协议

同步通信和异步通信 同步通信:需要时钟信号的约束&#xff0c;在时钟信号的驱动下两方进行数据交换&#xff0c;一般会选择在上升沿或者下降沿进行数据的采样&#xff0c;以及时钟极性和时钟相位【eg.SPI,IIC】。 异步通信:不需要时钟信号的同步&#xff0c;通过&#xff08;…

只根据\r、\n、\r\n三种分隔符分割字符串splitlines()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 只根据\r、\n、\r\n三种 分隔符分割字符串 splitlines()方法 选择题 对于以下python代码表述错误的一项是? s字符串1\n字符串2\r字符串3\r\n字符串4\n\r字符串5 print("【执行】s字符串…

移植FreeRTOS到STM32

移植FreeRTOS到STM32单片机上引言介绍什么是 RTOS&#xff1f;为什么嵌入式设备往往使用RTOS&#xff1f;FreeRTOS具体步骤总结引言 本文详细介绍如何移植FreeRTOS到STM32单片机上。移植操作系统是嵌入式开发的入门基础&#xff0c;单片机和嵌入式在物理上其实是一摸一样的&am…

二、MySQL 介绍及 MySQL 安装与配置

文章目录一、新手如何学习 MySQL二、MySQL 介绍2.1 百科定义2.2 创始人简历2.3 历史背景2.4 MySQL 的优势2.5 MySQL 版本2.6 MySQL 特性2.7 MySQL 的应用环境2.8 数据库专业术语2.9 MySQL 客户端和服务器架构&#xff08;C/S架构&#xff09;2.10 MySQL 内部结构三、MySQL 服务…

免费分享一个SpringBoot鲜花商城管理系统,很漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的SpringBoot鲜花商城管理系统&#xff0c;分享下哈。 项目介绍 这是基于主流SpringBoot框架开发的项目&#xff0c;thymeleaf模版引擎&#xff0c;Mysql数据库&#xff0c;druid连接池&#xff0c;界面美观大方&#xff…

spring动态数据源,多数据源

Spring是如何支持多数据源的 Spring提供了一个AbstractRoutingDataSource类&#xff0c;用来实现对多个DataSource的按需路由&#xff0c;本文介绍的就是基于此方式实现的多数据源实践。 一、什么是AbstractRoutingDataSource 先看类上的注释&#xff1a; Abstract {link jav…

Goby安装与使用

Goby安装与使用1.Goby简介1.1.Goby介绍1.2.Goby下载2.Goby使用2.1.切换语言2.2.新建扫描2.2.1.设置扫描地址2.2.2.设置端口2.2.2.1.选中默认端口2.2.2.2.自定义端口2.2.3.漏洞2.2.3.1.通用Poc2.2.3.2.暴力破解2.2.3.3.全部漏洞2.2.3.4.自定义Poc2.2.4.开始扫描2.3.扫描情况2.3.…

【Eureka】如何实现注册,续约,剔除,服务发现

文章目录前言服务注册服务续约服务剔除(服务端去剔除过期服务)被动下线服务下线&#xff08;主动下线&#xff09;client发起的服务发现集群同步信息Work下载前言 Eureka是SpringCloud的具体实现之一&#xff0c;提供了服务注册&#xff0c;发现&#xff0c;续约&#xff0c;撤…

[ Linux Audio 篇 ] Type-C 转 3.5mm音频接口介绍

简介 常见的Type-C 转3.5mm 线有两种&#xff1a; 模拟Type-C转3.5mm音频线数字Type-C转3.5mm 音频线&#xff0c;也就是带DAC芯片的转换线 当使用Type-C转换3.5mm音频接口时&#xff0c;使用到的是这里面的SBU1、D-、D、CC四个针脚&#xff0c;手机会通过这四个针脚输出模拟…

信贷--------

定义 信贷&#xff1a;一切以实现承诺为条件的价值运动方式&#xff0c;如贷款、担保、承诺、赊欠等 信贷业务&#xff1a;本外币贷款、贴现、透支、押汇&#xff08;表内信贷&#xff09;&#xff1b;票据承兑、信用证、保函、贷款承诺、信贷证明等&#xff08;表外信贷&…

卷积神经网络硬件加速——INT8数据精度加速

卷积神经网络硬件加速——INT8数据精度加速 上一专题已介绍了一种通用的卷积神经网络硬件加速方法——Supertile&#xff0c;本文将介绍一种特殊的硬件加速方案&#xff0c;一种INT8数据精度下的双倍算力提升方案。 目前大部分卷积神经网络模型的数据类型都是32-bits单精度浮点…

android开发笔记002

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…

TCP三次握手详解

三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入三次握手阶段&#xff1a; ① 首先客户端向服务器发送一个 SYN 包&#xff0c;并等待服务…

c++11 标准模板(STL)(std::deque)(二)

构造函数 std::deque<T,Allocator>::deque deque(); (1) explicit deque( const Allocator& alloc ); (2)explicit deque( size_type count, const T& value T(), const Allocator& alloc Allocator());(3)(C11 前) …

网络编程 完成端口模型

1.概念以及重叠IO存在的问题 2.完成端口代码详解 整体流程 使用到的新函数 1.CreateIoCompletionPort函数 该函数创建输入/输出 (I/O) 完成端口并将其与指定的文件句柄相关联&#xff0c;或创建尚未与文件句柄关联的 I/O 完成端口&#xff0c;以便稍后关联&#xff0c;即创建…

金融业务的数据存储选型

为什么用关系型数据库&#xff1f;最常见的理由是别人在用&#xff0c;所以我也得用&#xff0c;但是这个并不是理由&#xff0c;而是借口。 1 数据分类 选择数据存储类型前&#xff0c;先分析数据特点&#xff0c;才能针对性选择存储方案。 通常按数据与数据之间关系的复杂…