Java相关面试题9:实现动画效果

简介: ●代码复杂度方面简单动画:css代码实现会简单一些,js复杂一些。 复杂动画的话:css代码就会变得冗长,js实现起来更优。●动画运行时,对动画的控制程度上 js 比较灵活,能控制动画暂停,取消,终止等css动画不能添加事件,只能设置固定节点进行什么样的过渡动画。●兼容方面 css 有浏览器兼容问题,js大多情况下是没有的。●性能方面 css动画相对于优一些,css 动画通过GUI解析js动画需要经过js引擎代码解析,然后再进行 GUI 解析渲染。

文章目录

前端实现动画有哪些方式?

css3的transition

css3的animation

原生JS动画

使用canvas绘制动画

SVG 动画

Jquery的animate()方法

使用gif图片

总结

前端实现动画有哪些方式?

css3的transition

用来设置样式的属性值是如何从一种状态平滑过渡到另外一种状态

transition是一种简写属性,它可以拆分为四个过渡属性。你可以 transition: 值1,值2,值3,值4 这样写,也可以:transition-property: 值1;,transition-duration:值2;,transition-timing-function:值2;,transition-delay:值4;这样写。


css3的animation

animation属性:比较类似于 flash 中的逐帧动画。学习过 flash的同学知道,这种逐帧动画是由关键帧组成,很多个关键帧连续的播放就组成了动画在 CSS3 中是由属性keyframes来完成逐帧动画的。

animation属性与transition属性的区别:

●transition只需指定动画的开始和结束状态,整个动画的过程是由特定的函数控制,你不用管它。

●animation可以对动画过程中的各个关键帧进行设置


原生JS动画

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

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


   <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>

1

2

3

4

5

6

7

8

9

10

11

12

使用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>


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

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


SVG 动画

SVG是一种基于XML的图像格式,非常类似于HTML的工作方式。它为许多熟悉的几何形状定义了不同的元素,这些元素可以在标记中组合以产生二维图形。

同样高清的质地,矢量图不畏惧放大,体积小。

这里要说明一点就是,因为 SVG 中保存的是点、线、面的信息,与分辨率和图形大小无关,只是跟图像的复杂程度有关,所以图像文件所占的存储空间通常会比 png 小。


SVG动画的优势:

●优化 SEO 和无障碍的利器,因为 SVG 图像是使用XML(可扩展标记语言【英语:Extensible Markup Language,简称:XML】标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等)来标记构建的,浏览器通过绘制每个点和线来打印它们,而不是用预定义的像素填充某些空间。这确保 SVG 图像可以适应不同的屏幕大小和分辨率。

●由于是在 XML 中定义的,SVG 图像比 JPG 或 PNG 图像更灵活,而且我们可以使用 CSS 和 JavaScript 与它们进行交互。SVG 图像设置可以包含 CSS 和 JavaScript。在 react、vue 这种数据驱动视图的框架下,对于 SVG 操作就更加如鱼得水了。(下文会跟大家分享一些小的 SVG 动画在我们项目中的实践)

●在运用层面上,SVG 提供了一些图像编辑效果,比如屏蔽和剪裁、应用过滤器等等。并且 SVG 只是文本,因此可以使用 GZip 对其进行有效压缩。


Jquery的animate()方法

●animate() 方法执行 CSS 属性集的自定义动画。

●该方法通过 CSS 样式将元素从一个状态改变为另一个状态。

●CSS属性值是逐渐改变的,这样就可以创建动画效果。

●只有数字值可创建动画(比如 “margin:30px”)。字符串值无法创建动画(比如 “background-color:red”)。


$(document).ready(function(){

   $("#btn1").click(function(){

       $("#box").animate({height:"300px"});

   });

   $("#btn2").click(function(){

       $("#box").animate({height:"100px"});

   });

});

1

2

3

4

5

6

7

8

使用gif图片

总结

●代码复杂度方面简单动画:css代码实现会简单一些,js复杂一些。 复杂动画的话:css代码就会变得冗长,js实现起来更优。

●动画运行时,对动画的控制程度上 js 比较灵活,能控制动画暂停,取消,终止等css动画不能添加事件,只能设置固定节点进行什么样的过渡动画。

●兼容方面 css 有浏览器兼容问题,js大多情况下是没有的。

●性能方面 css动画相对于优一些,css 动画通过GUI解析js动画需要经过js引擎代码解析,然后再进行 GUI 解析渲染。


目录
相关文章
|
1月前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
9天前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
26 1
Java面试题之Java集合面试题 50道(带答案)
|
5天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
19 3
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
307 37
|
9天前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
19 0
Java面试题之cpu占用率100%,进行定位和解决
|
13天前
|
存储 安全 Java
java基础面试题
java基础面试题
19 2
|
13天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
25 1
|
14天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
35 2
|
1月前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
1月前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)