requestAnimationFrame (render)
是HTML5提供的动画API,他向浏览器申请执行一个动画帧渲染函数,浏览器在下次重绘(刷新)之前调用这个render
回调函数 。requestAnimationFrame
还做了很多优化以提升性能和流畅度 。
- 稳定60帧:浏览器的刷新周期大多和屏幕刷新率匹配,为每秒60次,非常稳定高效 。不像
setInterval
、setTimeout
还要在任务队列里排队等待,就可能发生丢帧和卡顿现象 。 - 合并优化:浏览器会优化动画的执行,把每一帧的所有DOM操作集中起来,在一个渲染周期内执行 。
- 隐藏优化:当前窗口或者标签页不可见时停止运行
requestAnimationFrame
。
<canvas id="canvas" width="400" height="400"></canvas> <script> ctx = document.getElementById('canvas').getContext('2d'); //动画旋转 let eangle = 0; function drawEllipse() {ctx.clearRect(255, 150, 140, 140);ctx.beginPath();ctx.fillStyle = 'rgba(0,250,0,0.3)';eangle = eangle > 360 ? 0 : eangle + 1;ctx.ellipse(320, 230, 60, 30, eangle * Math.PI / 180, 0, 2 * Math.PI);ctx.stroke();ctx.fill();ctx.beginPath();ctx.ellipse(320, 230, 30, 60, eangle * Math.PI / 180, 0, 2 * Math.PI);ctx.fillStyle = 'rgba(0,0,250,0.3)';ctx.stroke();ctx.fill(); } setInterval(drawEllipse, 20); //水平移动 let lx = 40; let ltr = true; function drawRect() {if (lx > 300) ltr = false;if (lx < 40) ltr = true;// ctx.clearRect(lx, 220, 40, 40);ctx.fillStyle = 'rgb(255,255,255,0.4)';ctx.fillRect(20, 290, 340, 60);lx = ltr ? lx + 2 : lx - 2;ctx.fillStyle = 'rgb(110,22,250)';ctx.fillRect(lx, 300, 40, 40);ctx.strokeRect(lx, 300, 40, 40);requestAnimationFrame(drawRect);//永远不停的提交渲染申请,递归自己 } requestAnimationFrame(drawRect); </script>
文章插图
用canvas实现的一个彩球大战:codepen
03、WebGLWebGL 作为一种WEB 3D绘图技术,依托于
<canvas>
元素 。WebGL是运行在GPU上的,可面向底层显卡编程,可调用底层的接口,实现硬件加速,在2D图形绘制上性能会优于Canvas2D 。传说原生的WebGL比较难学,可考虑使用使用第三方的WebGL库,如Three.js、Cesium.js(3D地图)、Babylon.jsMDN:WebGL 教程
?版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!经验总结扩展阅读
- 前端开发日常——CSS动画无限轮播
- 提高工作效率的神器:基于前端表格实现Chrome Excel扩展插件
- MFC-创建MFC图形界面dll
- Element 前端枚举enum的应用封装
- 基于纯前端类Excel表格控件实现在线损益表应用
- 15 基于SqlSugar的开发框架循序渐进介绍-- 整合代码生成工具进行前端界面的生成
- Java一次返回中国所有省市区三级树形级联+前端vue展示【200ms内】
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
- Flask 框架:运用Echarts绘制图形
- 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin