博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
loading动画的性能优化-摒弃Canvas,拥抱CSS3-实现点击特效
阅读量:7136 次
发布时间:2019-06-28

本文共 4094 字,大约阅读时间需要 13 分钟。

click-colorful

demo演示

项目中有个活动页加载时有个loading动画,效果如上图,连续绽放小球,问题就是太卡,经常出现一堆小球抱团卡住,遂进行优化

注意:(仅在页面加载时卡顿,加载完毕,点击的时候不卡顿)

查看代码发现动画借用的 官网中的效果,通过canvas实现的,按理说canvas应该时性能很好的,不应该出现卡顿,问题在我的活动页中就是非常卡顿

思考再三,把最终原因归结于首页加载时候,浏览器要加载资源,渲染dom,耗费cpu,而canvas做帧动画会做大量的计算,这对cpu肯定是一种消耗,给浏览器造成一定压力,个人见解,不一定准确

我的解决办法是砍掉canvas,借助CSS3并触发硬件加速,只在创建小球的时候做一次运算,帧动画通过transform集合transition实现,这样可以大大减少js的运算

插件封装好并开源 ,全部代码不到100行,有兴趣可以看一下,觉得可以就 Star 一下,算是鼓励

下面是核心代码实现

定义默认参数

var defaultParams = {		colors: ['#eb125f', '#6eff8a', '#6386ff', '#f9f383'],		size: 30,		maxCount: 30  	}复制代码

小球的颜色,大小,数量都可以随意配置,非常灵活

构造函数

function colorBall(params) {		this.params = Object.assign({}, defaultParams, params)	}复制代码

参数的赋值

绽放函数

colorBall.prototype.fly = function (x, y, playCount, loopTimer) {		if (!loopTimer) loopTimer = 300		var ballElements = []		var fragment = document.createDocumentFragment()				var ballNum = this.params.maxCount;		// 修改轮换播放实现方式,改为一次创建所有,通过延迟执行动画实现		if(playCount) {			ballNum = ballNum * playCount;		} 		var loop = 0		for(var i=0; i
0.5) blurX = blurX* -1 var blurY = Math.random() * 10 if (Math.random() > 0.5) blurY = blurY* -1 ball.style.left = (x) + 'px'; ball.style.top = (y) + 'px'; ball.style.width = this.params.size + 'px'; ball.style.height = this.params.size + 'px'; ball.style.position = 'fixed'; ball.style.borderRadius = '1000px'; ball.style.boxSizing = 'border-box'; ball.style.zIndex = 9999; ball.style.opacity = 0; if (curLoop === 0) ball.style.opacity = 1; ball.style.transform = 'translate3d(0px, 0px, 0px) scale(1)'; ball.style.webkitTransform = 'translate3d(0px, 0px, 0px) scale(1)'; ball.style.transition = 'transform 1s ' + curLoop * loopTimer / 1000 + 's ease-out'; ball.style.webkitTransition = 'transform 1s ' + curLoop * loopTimer / 1000 + 's ease-out'; ball.style.backgroundColor = getOneRandom(this.params.colors); fragment.appendChild(ball); ballElements.push(ball) // 性能优化终极版 if (curLoop !== loop) { (function(num){ setTimeout(function(){ var loopBalls = document.getElementsByClassName('ball-loop-' + num) for(var j = 0; j < loopBalls.length; j++) { loopBalls[j].style.opacity = 1 } if (num === loop) { _clear(ballElements) } }, num * loopTimer + 30) })(curLoop) loop = curLoop } } doc.body.appendChild(fragment); // 延迟删除 !playCount && _clear(ballElements) // 执行动画 setTimeout(function () { for(var i=0; i
0.5 var randomYFlag = Math.random() > 0.5 var randomX = parseInt(Math.random() * 160); var randomY = parseInt(Math.random() * 160); if (randomXFlag) { randomX = randomX * -1; } if (randomYFlag) { randomY = randomY * -1 } var transform = 'translate3d('+randomX+'px,' + randomY + 'px, 0) scale(0)'; ball.style.webkitTransform = transform; ball.style.MozTransform = transform; ball.style.msTransform = transform; ball.style.OTransform = transform; ball.style.transform = transform; }复制代码

fly函数接受四个参数,x,y代码屏幕坐标,playCount是执行一次播放几轮, loopTimer是间隔

通过delay实现循环播放,而不是递归分批创建dom,减少页面回流,性能很高

_run函数中通过random实现小球随机向四面八方运动

可以看到这个函数js计算非常少,只有在创建和删除做了一些循环。而且用了createDocumentFragment尽可能的减少了dom操作,对性能提升也有很大帮助

整体结构

function (win, doc) {	"use strict";	var defaultParams = {		colors: ['#eb125f', '#6eff8a', '#6386ff', '#f9f383'],		size: 30,		maxCount: 50  	}	function colorBall(params) {			}	colorBall.prototype.fly = function (x, y, playCount, loopTimer) {			}	//兼容CommonJs规范 	if (typeof module !== 'undefined' && module.exports) {		module.exports = colorBall;	};	//兼容AMD/CMD规范	if (typeof define === 'function') define(function() { 		return colorBall; 	});	//注册全局变量,兼容直接使用script标签引入插件	win.colorBall = colorBall; })(window, document)复制代码

至此插件封装完毕,下面是使用方式

可选参数配置

var params = {        colors: ["#eb125f", "#6eff8a", "#6386ff", "#f9f383"], // 自定义颜色        size: 30, // 小球大小        maxCount: 30 // 小球的数量  }复制代码

使用方式

  • 引入click-colorful.js <script src="click-colorful.js"></script>
  • 实力化插件
//params不传,则走默认配置var color = new colorBall(params)// 绽放一次color.fly(x, y)// 绽放5次,间隔300mscolor.fly(x, y, 5, 300)复制代码

声明: 并不是说canvas不好,只是有的场景不适合用canvas

如果文章哪里写的有问题请指出,谢谢

转载地址:http://vmvrl.baihongyu.com/

你可能感兴趣的文章
基于Serverless架构最新应用场景详解
查看>>
[BTCC] 要“工程师”“工程师”“工程师”
查看>>
redis 目录
查看>>
lvs简介和命令
查看>>
在Centos7中使用firewall添加端口
查看>>
jquery验证表单的js代码(HTML+CSS+PHP代码部分省略)
查看>>
Linux学习之CentOS(二十)--CentOS6.4下修改MySQL编码方法
查看>>
Easy ×××
查看>>
公司腾讯企业邮箱服务器接口插件迁移的一个故障总结
查看>>
DNS域名服务基础
查看>>
微信头像透露你的性格,快看看你是哪一类
查看>>
软考信息系统监理师:2016年4月22日作业
查看>>
Linux-13软件安装
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 发送通知功能改进改进...
查看>>
写了C# ASP.NET WebService的XML解析网站接口程序收了200元辛苦费【加入软件项目源码交易群的好处】...
查看>>
为1900个JNI函数添加日志
查看>>
到2023年将会有超过90%的PC采用SSD硬盘
查看>>
如何找回删除的照片?恢复方法介绍
查看>>
OSPF协议在企业中的综合应用案例
查看>>
浅解Linux的启动流程
查看>>