animation动画不生效_你可能不知道的Animation动画技巧与细节

引言

在 web 应用中,前端同学在实现动画效果时往往常用的几种方案:css3 transition / animation - 实现过渡动画

setInterval / setTimeout - 通过设置一个间隔时间来不断的改变图像的位置

requestAnimationFrame - 通过一个回调函数来改变图像位置,由系统来决定这个回调函数的执行时机,比定时修改的性能更好,不存在失帧现象

在大多数需求中,css3 的 transition / animation 都能满足我们的需求,并且相对于 js 实现,可以大大提升我们的开发效率,降低开发成本。

本篇文章将着重对 animation 的使用做个总结,如果你的工作中动画需求较多,相信本篇文章能够让你有所收获:Animation 常用动画属性

Animation 实现不间断播报

Animation 实现回弹效果

Animation 实现直播点赞效果 ❤️

Animation 与 Svg 又会擦出怎样的火花呢?Loading 组件

进度条组件

Animation steps() 运用 ⏰实现打字效果

绘制帧动画

Animation 常用动画属性

介绍完 animation 常用属性,为了将这些属性更好地理解与运用,下面将手把手实现一些 DEMO 具体讲述

Animation 实现不间断播报

通过修改内容在父元素中的 y 轴的位置来实现广播效果

@keyframes scroll {

0%{

transform: translate(0, 0);

}

100%{

transform: translate(0, -$height);

}

}

.ul {

animation-name: scroll;

animation-duration: 5s;

animation-timing-function: linear;

animation-iteration-count: infinite;

/* animation: scroll 5s linear infinite; 动画属性简写 */

}

此处为了保存广播滚动效果的连贯性,防止滚动到最后一帧时没有内容,需要多添加一条重复数据进行填充

小刘同学加入了凹凸实验室
小邓同学加入了凹凸实验室
小李同学加入了凹凸实验室
小王同学加入了凹凸实验室
小刘同学加入了凹凸实验室

Animation 实现回弹效果

通过将过渡动画拆分为多个阶段,每个阶段的 top 属性停留在不同的位置来实现

/* 规定动画,改变top,opacity */

@keyframes animate {

0% {

top: -100%;

opacity: 0;

}

25% {

top: 60;

opacity: 1;

}

50% {

top: 48%;

opacity: 1;

}

75% {

top: 52%;

opacity: 1;

}

100%{

top: 50%;

opacity: 1;

}

}

为了让过渡效果更自然,这里通过 cubic-bezier() 函数定义一个贝塞尔曲线来控制动画播放速度

过渡动画执行完后,为了将让元素应用动画最后一帧的属性值,我们需要使用 animation-fill-mode: forwards

.popup {

animation-name: animate;

animation-duration: 0.5s;

animation-timing-function: cubic-bezier(0.21, 0.85, 1, 1);

animation-iteration-count: 1;

animation-fill-mode: forwards;

/* animation: animate 0.5s cubic-bezier(0.21, 0.85, 1, 1) 1 forwards; 动画属性简写 */

}

Animation 实现点赞效果 Online Code点击预览

相信大多数同学都知道点赞效果,本文章会实现一个简易版的点赞效果,主要讲述一下实现思路:为了让气泡可以向上偏移,我们需要先实现一个 y 轴方向上移动的 @keyframes 动画

/* 规定动画,改变y轴偏移距离*/

@keyframes animation-y {

0%{

transform: translate(-50%, 100px) scale(0);

}

50%{

transform: translate(-50%, -100px) scale(1.5);

}

100%{

transform: translate(-50%, -300px) scale(1.5);

}

}为了让气泡向上偏移时显得不太单调,我们可以再实现一个 x 轴方向上移动的 @keyframes 动画

/* 规定动画,改变x轴偏移距离 */

@keyframes animation-x {

0%{

margin-left: 0px;

}

25%{

margin-left: 25px;

}

75%{

margin-left: -25px;

}

100%{

margin-left: 0px;

}

}

这里我理解:虽然是修改 margin 来改变 x 轴偏移距离,但实际上与修改 transform没有太大的性能差异

因为通过 @keyframes animation-y 中的 transform 已经新建了一个渲染层 ( PaintLayers )

animation 属性 可以让该渲染层提升至 合成层(Compositing Layers) 拥有单独的图形层 ( GraphicsLayer ),即开启了硬件加速 ,不会影响其他渲染层的 paint、layout

对于合成层(Compositing Layers)相关知识不是很了解的同学,可以阅读一下这篇文章从浏览器渲染层面解析 css3 动效优化原理

如下图所示:

如笔者这里理解有误,还请读者大佬指出,感激不尽~给气泡应用上我们所实现的两个 @keyframes 动画

.bubble {

animation: animation-x 3s -2s linear infinite,animation-y 4s 0s linear 1;

/* 给 bubble 开启了硬件加速 */

}在点赞事件中,通过 js 操作动态添加/移除气泡元素

function like() {

const likeDom = document.createElement('div');

likeDom.className = 'bubble'; // 添加样式 document.body.appendChild(likeDom); // 添加元素 setTimeout( () => {

document.body.removeChild(likeDom); // 移除元素 }, 4000)

}

Animation 与 Svg 绘制 loading/进度条 组件 Online Code点击预览首先,我们使用 svg 绘制一个圆周长为2 * 25 * PI = 157 的圆

将实线圆绘制成虚线圆,这里需要用 stoke-dasharray:50, 50 (可简写为50) 属性来绘制虚线, stoke-dasharray 参考资料它的值是一个数列,数与数之间用逗号或者空白隔开,指定短划线(50px)和缺口(50px)的长度。

由于50(短划线) + 50(缺口) + 50(段划线) = 150, 150 < 157,无法绘制出完整的圆,所以会导致右边存在缺口(7px)

stroke-dashoffset 属性可以使圆的短划线和缺口产生偏移,添加 @keyframes 动画后能够实现从无到有的效果,stoke-dashoffset 参考资料设置 stroke-dasharray="157 157",指定 短划线(157px) 和 缺口(157px) 的长度。

添加 @keyframes 动画 修改stroke-dashoffset值, 值为正数时逆时针偏移 ,, 值为负数时,顺时针偏移

@keyframes loading {

0%{

stroke-dashoffset: 0;

}

100%{

stroke-dashoffset: -157; /* 线条顺时针偏移 */

}

}

circle{

animation: loading 1s 0s ease-out infinite;

}

修改短划线和缺口值为了让 loading 组件线条可见,我们需要一个50px的短划线,设置 stroke-dasharray="50"

为了让短划线发生偏移后可以完全消失,缺口需要大于或等于圆周长157,设置 stroke-dasharray="50 157"

添加 @keyframes 动画,为了让动画结束时仍处理动画开始位置,需要修改 stroke-dashoffset:-207(短划线+缺口长度)

进度条也是类似原理,帮助理解 stroke-dashoffset 属性,具体实现请查看示例点击预览

@keyframes loading {

0%{

stroke-dashoffset: 0;

}

100%{

stroke-dashoffset: -207; /* 保证动画结束时仍处理动画开始位置 */

}

}

circle{

animation: loading 1s 0s ease-out infinite;

}

Animation steps()运用

steps() 是 animation-timing-function 的属性值

animation-timing-function : steps(number[, end | start])steps 函数指定了一个阶跃函数,它接受两个参数

第一个参数接受一个整数值,表示两个关键帧之间分几步完成

第二个参数有两个值 start or end。默认值为 end

step-start 等同于 step(1, start)。step-end 等同于 step(1, end)

steps 适用于关键帧动画,第一个参数将两个关键帧细分为N帧,第二个参数决定从一帧到另一帧的中间间隔是用开始帧还是结束帧来进行填充。

看下图可以发现:steps(N, start)将动画分为N段,动画在每一段的起点发生阶跃(即图中的空心圆 → 实心圆),动画结束时停留在了第 N 帧

steps(N, end)将动画分为N段,动画在每一段的终点发生阶跃(即图中的空心圆 → 实心圆),动画结束时第 N 帧已经被跳过(即图中的空心圆 → 实心圆),停留在了 N+1 帧。

实践出真知!

Animation 实现打字效果此处用英文字母(I'm an O2man.)举例,一共有13个字符。[经测试,多数中文字体每个字符宽高都相等]

steps(13)可以将 @keyframes 动画分为13阶段运行,且每一阶段运行距离相等。

效果如下:

/* 改变容器宽度 */

@keyframes animate-x {

0%{

width: 0;

}

}

p {

width: 125px;

overflow: hidden;

border-right: 1px solid transparent;

animation: animate-x 3s 0s steps(13) 1 forwards;

}可以发现仅仅这样还不够,动画运行过程中出现了字符被截断的情况,为了保证每个阶段运行后能准确无误地显示当前所处阶段的字符,我们还需要保证每个字符的width与动画每一阶段运行的距离相等

设置Monaco字体属性,用以保证每个字符的 width 相同,具体像素受fontSize属性影响,示例中的字体宽度约为 9.6px,9.6px * 13(段数) = 124.8px (125px),所以当我们设置容器宽度为 125px,即可的达成目的:每个字符的 width 与动画每一阶段运行的距离相等(约为 9.6px )。

p {

/* 设置 Monaco 字体属性,字体大小为16px,用以保证每个字符的 width 相同,width 约为9.6p */

font-family: Monaco;

/* 9.6px * 13 = 124.8px (125px) */

width: 125px ;

font-size: 16px;

overflow: hidden;

border-right: 1px solid transparent;

/* 同时应用动画 animate-x、cursor-x */

animation: animate-x 3s 0s steps(13) 1 forwards,cursor-x 0.4s 0s linear infinite;

}

Animation 实现帧动画 ⏰

这里我们拿到了一张47帧的雪碧图(css spirit),设置背景图

.main {

width: 260px;

height: 200px;

background: url(url) no-repeat;

background-size: 100%;

background-position: 0 0;

}添加 @keyframes 修改 background-position,让背景图移动

@keyframes animate {

0% {

background-position: 0 0;

}

100% {

background-position: 0 100%;

}

}

.main{

width: 260px;

height: 200px;

background: url(url) no-repeat;

background-size: 100%;

background-position: 0 0;

animation: animate 2s 1s steps(47) infinite alternate;

}同时, css 还提供了animation-play-state用于控制动画是否暂停

input:checked+.main{

animation-play-state: paused;

}

文章篇幅较长,感谢大家的阅读,希望各位看客能够有所收获~ ~ ~

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

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

相关文章

eclipse查看jar包源代码

方法一&#xff1a;将jd-gui集成在Eclipse中 https://jingyan.baidu.com/article/b24f6c8275536686bfe5daed.html 下载2个反编译文件&#xff0c;实际操作未解决 https://www.cnblogs.com/jianshuai520/p/9267273.html 反编译器的位置&#xff0c;发生改变 方法二&#xf…

微服务系列:MicroProfile和Apache TomEE

介绍 MicroProfile是一项由知名供应商于2016年9月发起的举措&#xff0c;目的是基于JEE平台构建微服务架构。 任务是针对微服务架构优化Enterprise Java 。 开发人员可以利用这种体系结构&#xff0c;通过Enterprise Java平台以标准化的方式构建和开发微服务应用程序。 API构建…

crash recovery mysql_InnoDB crash recovery 完整过程

mysql Innodb在发生意外宕机&#xff0c;重启之后&#xff0c;要经历哪些过程&#xff0c;以下是详细过程。• Tablespace discoveryTablespace discovery is the process that InnoDB uses to identify tablespaces that require redo log application. See Tablespace Discov…

Java –远景JDK 8

世界正在缓慢但肯定地发生变化。 在进行了更改之后&#xff0c;使Java有了JDK 7的全新外观&#xff0c;Java社区期待JDK 8以及JDK 9附带的其余改进。 JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题&#xff0c;应该在2013年底之前为广大读者所用&#xff0c…

python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3

顺序自上而下&#xff0c;依次执行分支分支的基本语法if 条件表达式&#xff1a;语句1语句2语句3......条件表达式就是计算结果必须为布尔值的表达式表达式后面的冒号不能少注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级条件表达式结果…

网络布线和数据转换

T568A 白绿 绿 白橙 蓝 白蓝 橙 白棕 棕 T568B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕 同种设备用交叉线 不同设备用直通线相连 PC与路由器为同种设备 交换机自成一派 转载于:https://www.cnblogs.com/qingqing1/p/11166632.html

Java 9模块系统(拼图)@ LJC的HackTheTower

今天&#xff0c;我们花了半天时间参加了第一次HackTheTower活动。 伦敦的Java用户组&#xff08;aka LJC &#xff09;的成员应伦敦市的邀请&#xff0c;聚集在伦敦市SalesForceTower&#xff08;aka Heron Tower &#xff09;26楼。 Heather VanCura是Java社区流程的主席 马…

在命令行下对ntfs分区文件夹权限的设置

随着Windows XP/Server 2003的流行&#xff0c;越来越多的用户开始选择NTFS文件系统&#xff0c;NTFS的好处自然是大大增强了系统的安全性&#xff0c;在“安全”标签页下&#xff0c; 我们可以在这里为不同级别的用户设置相应的访问控制权限&#xff0c;包括完全控制、修改、读…

uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决

环境&#xff1a;webpac<4的下&#xff0c;安装uglifyjs。cnpm install uglifyjs-webpack-plugin -D安装完毕后&#xff0c;去npm里查看uglifyjs的使用方法并添加到代码中&#xff1a;const UglifyJsPlugin require(uglifyjs-webpack-plugin)module.exports {//...optimiz…

描述一下JVM加载class文件的原理机制

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊的…

xtend怎么使用_使用Xtend构建Vaadin UI

xtend怎么使用今天&#xff0c;我决定向Xtend打个招呼。 我希望学习一些新的编程语言。 选择一个标准的清单并不多。 它必须是在JVM上运行的编程语言&#xff0c; 如果我不需要学习用于建筑应用的全新生态系统&#xff0c;那就太好了。 我检查了几个选项。 JVM的编程语言列表…

linux mysql 写shell_Linux—编写shell脚本操作数据库执行sql

修改数据库数据在升级应用时&#xff0c;我们常常会遇到升级数据库的问题&#xff0c;这就涉及到sql脚本的编写。一般我们会通过写sql脚本&#xff0c;然后将xxx.sql脚本放到数据库中进行source xxx.sql执行。本篇文章&#xff0c;我们可以通过写shell脚本来执行数据库操作。配…

DMN 1.1 XML:使用Drools 7.0从建模到自动化

我是一名自由顾问&#xff0c;但今天我是一名博士生。 本文的全球背景是企业架构&#xff08;EA&#xff09;&#xff0c;它需要对企业进行建模。 由于EA的一个方面是业务流程建模&#xff0c;所以我使用BPMN已有数年之久&#xff0c;但是这种表示方式并不十分适合表示决策标准…

mysql安装模块解释_MySQL的模块不能安装的解决方法_MySQL

我们最常用的 DBD::mysql 模块,我发现是难住很多人的地方.因为安装老是失败,下面我介绍一下解决方法,比如我使用 cpanm 安装,有时就出 /home/nue2501j/work/DBD-mysql-4.010/blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: DBIc_TRACE_LEVEL at /usr/lib/perl5/5.8.5/i…

nginx访问目录是没加/的重定向控制

static 模块提供了root与alias功能&#xff1b;发现目标是目录时&#xff1b;但URI末尾未加/时&#xff1b;会返回301重定向&#xff1b;重定向后会加/ 指令 Syntax: server_name_in_redirect on | off;# 控制返回那个域名 Default: server_name_in_redirect off; Context: ht…

oracle mysql 字段_Oracle和MySQL修改字段

一、修改字段名&#xff1a;Oracle&#xff1a;ALTER TABLE tableName RENAME COLUMN oldColumnName TO newColumnName;eg: ALTER TABLE web RENAME COLUMN wen_name TO web_name;MySQL&#xff1a;ALTER TABLE tableName CHANGE oldColumnName newColumnName newColumnDataTyp…

Kafka REST Proxy for MapR Streams入门

介绍 MapR生态系统软件包2.0&#xff08;MEP&#xff09;随附了一些与MapR流有关的新功能&#xff1a; MapR Streams的Kafka REST代理为MapR Streams和Kafka集群提供RESTful接口&#xff0c;以使用和生成消息并执行管理操作。 Kafka Connect for MapR Streams是一个实用程序&…

开张大吉

在Windows的天地中做了五年开发之后&#xff0c;又跑到了开源的Linux/Java世界遨游了五年&#xff0c;于最近半年&#xff0c;又重新回到M$阵营。这半年来&#xff0c;迫于项目进度的压力&#xff0c;较少与他人交流&#xff0c;项目中虽然采用了VS2003&#xff0c;但是运用的思…

mysql四种输入_mysql四种事务隔离级别

mysql事务并发问题ACID什么的就不啰嗦了。mysql多个事务并发的时候&#xff0c;可能会出现如下问题&#xff1a;1. 更新丢失即两个事务同时更新某一条数据&#xff0c;后执行的更新操作会覆盖先执行的更新操作&#xff0c;导致先执行的更新结果丢失。2. 脏读即一个事务会读到另…

apache hadoop_春天遇见Apache Hadoop

apache hadoopSpringSource 刚刚宣布了适用于Apache Hadoop的Spring的第一个GA版本 。 该项目的目的是简化基于Hadoop的应用程序的开发。 您可以下载该项目在这里 &#xff0c;并检查了Maven的文物在这里 。 Apache Hadoop的Spring诞生是为了解决Hadoop应用程序构建不良的问题…