前端实现动画的6种方式详解

一、总结

一句话总结:一般是css样式改变加setInterval

二、【前端动画】实现动画的6种方式

通常在前端中,实现动画的方案主要有6种:

  • javascript直接实现;
  • SVG(可伸缩矢量图形);
  • CSS3 transition;
  • CSS3 animation;
  • Canvas动画;
  • requestAnimationFrame;

三、javascript 直接实现动画(setInterval+css改变,setInterval+transform)

transform也可以改变样式

其主要思想是通过setInterval或setTimeout方法的回调函数来持续调用改变某个元素的CSS样式以达到元素样式变化的效果。

示例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><style type="text/css">#rect {width: 200px;height: 200px;background: #ccc;}</style>
</head>
<body><div id="rect"></div><script>let elem = document.getElementById('rect');let left = 0;let timer = setInterval(function(){if(left<window.innerWidth-200){elem.style.marginLeft = left+'px';left ++;}else {clearInterval(timer);}},16);</script>
</body>
</html>

Jquery的animate()方法就是这种方式实现的。

存在的问题

javascript 实现动画通常会导致页面频繁性重排重绘,消耗性能,一般应该在桌面端浏览器。在移动端上使用会有明显的卡顿。

Tip:为什么是16ms

上面例子中,我们设置的setInterval时间间隔是16ms。一般认为人眼能辨识的流畅动画为每秒60帧,这里16ms比(1000ms/60)帧略小一些,但是一般可仍为该动画是流畅的。
在很多移动端动画性能优化时,一般使用16ms来进行节流处理连续触发的浏览器事件。例如对touchmove、scroll事件进行节流等。通过这种方式减少持续事件的触发频率,可以大大提升动画的流畅性。

四、CSS3 transition(transform+transition)(纯css)

transition是过度动画。但是transition并不能实现独立的动画,只能在某个标签元素样式或状态改变时进行平滑的动画效果过渡,而不是马上改变。

注意

在移动端开发中,直接使用transition动画会让页面变慢甚至卡顿。所以我们通常添加transform:translate3D(0,0,0)或transform:translateZ(0)来开启移动端动画的GPU加速,让动画过程更加流畅。

1、设置transition设置过渡,添加transform设置形状,形成动画效果,如下:

.divadd {transition: All 0.4s ease-in-out;-webkit-transition: All 0.4s ease-in-out;-moz-transition: All 0.4s ease-in-out;-o-transition: All 0.4s ease-in-out;transform:rotate(360deg);-ms-transform:rotate(360deg); /* IE 9 */-webkit-transform:rotate(360deg); /* Safari and Chrome */
}

  此种方式比较小众,不易控制

五、CSS3 animation(animation属性+@keyframes)(纯css)

animation 算是真正意义上的CSS3动画。通过对关键帧和循环次数的控制,页面标签元素会根据设定好的样式改变进行平滑过渡。而且关键帧状态的控制是通过百分比来控制的。

比较

CSS3最大的优势是摆脱了js的控制,并且能利用硬件加速以及实现复杂动画效果。

2、添加animation属性,设置动画效果,如下:

.a1 {position: absolute;animation: a1 3s;opacity: 0
}
@keyframes a1 {0% {left: 10px;opacity: 0}30% {left: 60px;background-color: pink;font-size:23px;opacity: 1}90% {left: 100px;background-color: red;opacity: 1}100% {left: 10px;opacity: 0}
} 

 

以上百分比后的方括号内可以添加各种属性值,比如transform ratote、left。。。。。。添加left top等定位不要忘记设置position absolute。

所有属性有:

    animation-name: myfirst;  //动画名称,用于animation引用animation-duration: 5s;  //动画时长,animation-timing-function: linear;animation-delay: 2s;animation-iteration-count: infinite;animation-direction: alternate;animation-play-state: running;

animation-fill-mode设置动画结束后的状态none:默认值。不设置对象动画之外的状态,DOM未进行动画前状态forwards:设置对象状态为动画结束时的状态,100%或to时,当设置animation-direcdtion为reverse时动画结束后显示为keyframes第一帧backwards:设置对象状态为动画开始时的状态,(测试显示DOM未进行动画前状态)both:设置对象状态为动画结束或开始的状态,结束时状态优先

六、Canvas动画(setInterval+canvas)

canvas作为H5新增元素,是借助Web API来实现动画的。

示例

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> *{ margin:0; padding:0; } </style> </head> <body> <canvas id="canvas" width="700" height="550"></canvas> <script type="text/javascript"> let canvas = document.getElementById("canvas"); let ctx = canvas.getContext("2d"); let left = 0; let timer = setInterval(function(){ ctx.clearRect(0,0,700,550); ctx.beginPath(); ctx.fillStyle = "#ccc"; ctx.fillRect(left,0,100,100); ctx.stroke(); if(left>700){ clearInterval(timer); } left += 1; },16); </script> </body> </html>

注释:通过getContext()获取元素的绘制对象,通过clearRect不断清空画布并在新的位置上使用fillStyle绘制新矩形内容实现页面动画效果。

比较

Canvas主要优势是可以应对页面中多个动画元素渲染较慢的情况,完全通过javascript来渲染控制动画的执行。可用于实现较复杂动画。

七、SVG(svg标签+animate标签)

SVG动画由SVG元素内部的元素属性控制,一般通过一下几个元素控制:

  • : 用于控制动画延时
  • :对属性的连续改变进行控制
  • :颜色变化,但用就能控制
  • :控制如缩放、旋转等几何变化
  • :控制SVG内元素的移动路径

示例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;}</style>
</head>
<body><svg id="box" width="800" height="400" xmlns="http://www.w3.org/2000/svg" version="1.1"><rect x="" y="" width="100" height="100" fill="rgb(255,0,0);" stroke="" stroke-width=""><set attributeName="x" attributeType="XML" to="100" begin="4s"/><animate attributeName="x" attributeType="XML" begin="0s" dur="4s" from="0" to="300"/><animate attributeName="y" attributeType="XML" begin="0s" dur="4s" from="0" to="0"/><animateTransform attributeName="transform" begin="0s" dur="4s" type="scale" from="1" to="2" repeatCount="1" /><animateMotion path="M10,80 q100,120 120,20 q140,-50 160,0" begin="0s" dur="4s" repeatCount="1" /></rect>     </svg>  </body>
</html>

这里推荐一个在sublime text3中使用svg提示插件:svg snippet。

比较

SVG的一大优势是含有较为丰富的动画功能,原生绘制各种图形、滤镜和动画,并且能被js调用。html是对dom的渲染,那么svg就是对图形的渲染
但是,另一方面元素较多且复杂的动画使用svg渲染会比较慢,而且SVG格式的动画绘制方式必须让内容嵌入到HTML中使用。CSS3的出现让svg的应用变得相对少了。

八、requestAnimationFrame(类似setInterval)

requestAnimationFrame是另一种Web API,原理与setTimeout和setInterval类似,都是通过javascript持续循环的方法调用来触发动画动作。但是requestAnimationFrame是浏览器针对动画专门优化形成的APi,在性能上比另两者要好。

通常,我们将执行动画的每一步传到requestAnimationFrame中,在每次执行完后进行异步回调来连续触发动画效果。

示例

<!DOCTYPE html>
<html>
<head><title></title><style type="text/css">* {margin:0;padding:0;}div {width: 200px;height: 200px;background-color: #ccc;}</style>
</head>
<body><div id="rect"></div><script type="text/javascript">window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame ||window.msRequestAnimationFrame;let elem = document.getElementById("rect");let left = 0;//自动执行持续性回调requestAnimationFrame(step);//持续该改变元素位置function step() {if(left<window.innerWidth-200){left+=1;elem.style.marginLeft = left+"px";requestAnimationFrame(step);}}</script>
</body>
</html>

我们注意到,requestAnimationFrame只是将回调的方法传入到自身的参数中执行,而不是通过setInterval调用。

九、总结

复杂的动画是通过一个个简单的动画组合实现的。基于兼容性问题,通常在项目中,一般在

  • 桌面端浏览器推荐使用javascript直接实现动画或SVG方式;
  • 移动端可以考虑使用CSS3 transition、CSS3
    animation、Canvas或requestAnimationFrame方式**。

转载于:https://www.cnblogs.com/Renyi-Fan/p/9268657.html

前端实现动画的6种方式详解相关推荐

  1. android 说话水波动画,Android实用View——水波动画效果多种实现方式详解

    原标题:Android实用View--水波动画效果多种实现方式详解 这次给大家带来的是一篇关于自定义View实现水波动画效果的文章,其实在去年项目中使用过类似的动画,当时就自定义View也实现了预期的 ...

  2. 运用python的方式_对Python使用mfcc的两种方式详解

    1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" ...

  3. 全站仪与计算机之间的数据传输,必看!全站仪数据传输的三种方式详解,都安排得明明白白(上)...

    原标题:必看!全站仪数据传输的三种方式详解,都安排得明明白白(上) 科力达全站仪数据传输 一般而言,全站仪的数据传输方式有三种,分别是通过串口.USB.SD卡三种方式,因为电脑配置等因素的不同,一些数 ...

  4. MySQL批量入库的几种方式详解

    MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...

  5. IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装)

    这篇文章主要介绍了IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装),本文通过截图给大家展示的非常详细,需要的朋友可以参考下 目录 1.在线安装: 2.离线安装: IDEA安装阿里巴 ...

  6. mysql 删除数据表中数据_Mysql-删除数据表-三种方式详解

    Mysql 删除数据表的三种方式详解 用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, ...

  7. Spring中bean的执行初始化和销毁方法的4种方式详解

    一.引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等. ...

  8. css 实现虚线效果的3种方式详解

    一.效果 首先可以看一下下图显示的实现效果: 用三种方式实现了虚线效果: 点击查看demo代码 二.实现 1.border 属性 查看 mdn 的 border,我们知道 border 可以用于设置一 ...

  9. java clone方法_干货满满:Java中创建对象的五种方式详解

    通常来说,对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为. 作为Java开发者,我们通常都是使用依赖管理系统,比如Spring去创建Java对象,但使用管理系统创建对象并不是唯一 ...

最新文章

  1. CUDA运行时 Runtime(四)
  2. 网易云信亮相 LiveVideoStackCon 2021,解构自研大规模传输网 WE-CAN
  3. html+正则+换行+回车,正则与回车换行符使用详解
  4. android camera2 qcom,lineage编译环境里,编译QCamera2的技术总结
  5. vsftpd 启动不了vsftp 报错:config file not owned by correct useror not a file
  6. Android用户界面 UI组件--TextView及其子类(二) Button,selector选择器,sharp属性
  7. indigo中用roslaunch启动RViz观察机器人模型
  8. CPU 和 GPU 的区别
  9. java反编译 luyten_Java——反编译工具 JD-GUI procyon-decompiler luyten crf (转)
  10. 这两种方法能使PDF不能被复制和修改
  11. 信息服务器在哪里打开,internet信息服务(lls)管理器在哪里打开
  12. 洛谷【2142】高精度减法
  13. 【转】江枫:在ubuntu10.04上安装oracle 10g(学习一下)
  14. 用eclipse europa开发web service服务 - 东写西读终见大海无量 - JavaEye技术网站
  15. 【文件格式探究】EP.1 对ePub文件格式的初探
  16. 豆豉烘干技巧有哪些,只用下列步骤烘干就行了
  17. thinkphp 添加图片 文字 水印生成带二维码的小程序推广海报
  18. 解锁门禁系统新姿势--人脸识别智能门禁或成社区安全的“关键先生”
  19. 在Xcode中配置Python 并支持input
  20. Shell脚本中的流程控制,如if判断,case语句,for循环,while循环

热门文章

  1. dat图片 电脑端微信_微信 PC 版迎来了重磅更新,可以在电脑端使用小程序了 !...
  2. 2018/11/22工作日志
  3. libsvm——参数优化工具grid.py的使用
  4. linux c程序 bash,linux-如何使bash程序接受来自另一个C程序的命令
  5. java webengine_webview – JavaFX 8 WebEngine:如何从java到console.log()从java到System.out?
  6. how to switch between python3.5 and python3.6
  7. 找不到FLANNConfig.cmake文件
  8. laplacian,degree,adjacency and oriented incidence matrix, differential and laplacian coordinates
  9. matlab中箭头详细设置
  10. 【matlab】三维曲面