梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

2024-03-26 23:40

本文主要是介绍梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能。

一、两者的主要区别

先开门见山的说说两者之间的区别。

1)CSS动画:

基于CSS的动画一般由浏览器“主线程”之外的独立线程处理,在其中执行样式、布局、绘制和 JavaScript。

使用CSS动画,允许对单个动画关键帧、持续时间和迭代进行更多控制。

但缺乏表现力,并且很难有意义地组织动画,这意味着创造动画会带来较高的复杂度和错误率。

 

2)JavaScript动画:

在浏览器主线程的JavaScript中运行,主线程已经忙于运行其他的JavaScript,样式的计算,布局还有绘制。线程内存在资源竞争,这实质上增加了掉帧的风险。

基于JavaScript的动画灵活性更高,完全控制元素在每个步骤,能更好的实现复杂的动画和大量的交互(例如当要求所有的元素在页面加载时顺次加载显示出来)

对于多元素多步骤的动画序列、交互拖拽动画等,用JavaScript实现则是上选。

 

二、页面渲染

1)步骤

为了能让动画高性能的执行,得先了解一下页面渲染。

页面渲染的一般过程为JavaScript > 计算样式 > 布局 > 绘制 > 渲染层合并。

Layout:计算每个DOM元素最终在屏幕上显示的大小和位置。页面中一个元素的布局发生变化,会联动地引发其他元素的布局发生变化。

Paint:绘制文字、颜色、边框和阴影等,也就是一个DOM元素所有的可视效果。这个绘制过程可能会在多个层上完成的。

Composite:在每个层上完成绘制之后,浏览器会将所有层按照合理的顺序合并成一个图层,然后显示在屏幕上。

 

2)优化

Layout(重排)Paint(重绘)是整个环节中最为耗时的两环,所以我们尽量避免着这两个环节。

为了实现上述效果,就需要只使用那些仅触发Composite的属性。

可以选择transformopacityanimate.css中很多的动画都是用这两个属性实现的。

Css Triggers的网页中可以看到两个属性的描述:

 

多层绘制方式的好处是,使用tranform来实现移动效果的元素将会被正常绘制,同时不会触发对其他元素的绘制。

H5动画60fps之路》中通过一张图,总结了一些针对性的优化方法:

优化方法中提到了一个属性will-change,可以将元素提升为合成层,不过兼容性不太友好。

对于不支持此属性的,可以使用一个3D transform属性来强制浏览器创建一个新的渲染层,也就是人们常说的硬件加速。

.css{transform: translate3d(0,0,0);
}

做过一个大转盘抽奖的项目,当使用“transform:rotate(0deg)”没有创建一个新的渲染层,那么就会在不停的重绘,高亮的地方就是重绘。

当改用“transform:rotate3d(0,0,1,0deg)”新增一个渲染层后,只会重绘一次,在电脑上看不出性能区别,在手机上就会非常明显,卡的不能动。

3)工具

在Chrome浏览器中,有工具可以查看到重绘与合成层。

Paint Flashing:就是看重绘,重绘的地方会高亮。

Layer Borders:黄褐色就是合成层,青色的细线是浏览器渲染时候的“瓦片”,浏览器绘制页面的时候只会绘制可视区域一定范围内的瓦片,以节省性能开销。

 

 

三、动画相关事件

1)CSS动画事件

CSS动画有两种方式设置Transition过渡和Animation

与过渡相关事件只有一个TransitionEnd,也就是在过渡结束后触发。

animation相关事件有三个,animationstart、animationiteration与animationend。

两个动作相关的事件比较少,所以控制动画非常有限制,应对复杂场景蛮吃力的。

 

2)requestAnimationFrame

requestAnimationFrame函数就是针对动画效果的API,与显示器固定的刷新频率保持同步,利用这个刷新频率进行页面重绘,一般来说,这个频率为每秒60帧。

此外,一旦页面不处于浏览器的当前标签,就会自动停止刷新,这就节省了CPU、GPU和电力。

这个函数是在主线程上完成,如果主线程非常繁忙,那么动画效果会降低。

我们常用的setInterval、setTimeout是开发者主动要求浏览器去绘制,因为动画不会与屏幕的刷新率同步,很可能出现抖动和跳帧。

各个浏览器对此函数的支持程度不一样,可能需要添加前缀,也可能需要Polyfill一下。

window.requestAnimFrame = (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function(callback) {window.setTimeout(callback, 1000 / 60);};
})();

上面的代码按照1秒钟60次(大约每16.7毫秒一次),来模拟requestAnimationFrame。

 

 

参考资料:

JavaScript动画漫谈

CSS3动画和js动画各有什么优劣

CSS vs JS动画:谁更快?

CSS 对比 JavaScript 动画

CSS VS JavaScript动画

前端性能优化之更平滑的动画

简化绘制的复杂度、减小绘制区域

优先使用渲染层合并属性、控制层数量

动画与性能

补间动画

JavaScript动画实现初探

消除疑问:CSS动画 VS. JavaScript

High Performance Animations

打造H5动感影集的爱恨情仇(动画性能篇)

HTML5探秘:用requestAnimationFrame优化Web动画

Chrome渲染分析之Rendering工具使用(1)

Chrome渲染分析之Rendering工具使用(2)

Chrome 渲染优化 - 层模型

无线性能优化:Composite

CSS3硬件加速也有坑

 




    本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/6232591.html,如需转载请自行联系原作者



这篇关于梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_33910460/article/details/89760559
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/850256

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob