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



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

    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 解析渲染。

  • 相关阅读:
    HTML CSS JS游戏网页设计作业「响应式高端游戏资讯bootstrap网站」
    ubuntu 18.04下安装Anaconda、Cuda、Cudnn、gpu-Pytorch
    JWT的无限可能性:它如何在身份验证、单点登录、API安全等领域发挥作用
    矩阵分析与应用(14)
    pcb电路板常见的用途有哪些?
    【李沐深度学习笔记】线性回归的简洁实现
    C++ 三大特性之继承(二)重点:菱形虚拟继承
    MySQL SQL性能分析(SQL优化 一)
    实现的一个网页版的简易表白墙
    数据分析-Pandas数据如何图示规律
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/126203173