关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JavaScript »JavaScript动画实现初探

    JavaScript动画实现初探

    2015-03-23 00:00:00 出处:风之缘的博客
    分享

    前言

    现如今,许多页面上均有一些动画效果。适当的动画效果可以在一定程度上提高页面的美观度,具有提示效果的动画可以增强页面的易用性。

    实现页面动画的途径有两种。一种是通过操作JavaScript间接操作CSS样式,每隔一段时间更新一次;一种是直接通过CSS定义动画。第二种方法在CSS3成熟之后被广泛采用。在本文中,我们讨论第一种方法的原理和实现。

    JavaScript动画实现原理

    首先我们需要知道两个重要的概念,动画时间进程和动画效果进程。

    动画时间进程指从时间上看动画的完成度,是一个[0, 1]之间的数字。假设动画于时间戳t1开始,要在t2结束,当前时间戳为t,那么该动画目前的时间进程为(t-t1)/(t2-t1)。假如你不能理解,我建议你用纸笔画出来。理解这一概念对理解本文至关重要。

    动画效果进程指被动画的属性值当前的增量。假设大家要将#el元素的CSS left 属性从100px变到200px,当前已经变到了130px,那么该动画目前的效果进程为130px - 100px = 30px。

    假设动画时间进程和动画效果进程都是线性的。那么假如知道了动画时间进程,一定可以得到动画效果进程。

    根据这个解释,我们很快可以编写出一个线性的动画。

    (function() {
          var begin, // 开始动画的时间
            el, start, end, duration; 
          var INTERVAL = 13;
    
          function now() {
            return (new Date).getTime();
          }
    
          /**
           * 执行一步动画(更新属性)
           */
          function _animLeft() {
            var pos = (now() - begin) / duration;
            if (pos >= 1.0) {
              return false;
            }
            return !!(el.style.left = start + (end - start) * pos);
          }
    
          /**
           * 对一个DOM执行动画,left从_start到_end,执行时间为
           * _duration毫秒。
           * 
           * @param  {object} _el       要执行动画的DOM节点
           * @param  {integer} _start   left的起始值
           * @param  {integer} _end     left的最终值
           * @param  {integer} _duration  动画执行时间
           */
          function animLeft(_el, _start, _end, _duration) {
            stopped = false;
            begin = now();
            el = _el;
            start = _start;
            end = _end;
            duration = _duration || 1000;
    
            var step = function() {
              if (_animLeft()) {
                setTimeout(step, INTERVAL);
              }
            };
            setTimeout(step, 0);
          }
    
          window.animLeft = animLeft;
        })();
    
        animLeft(
          document.getElementById('el'),
          100,
          200
        )

    JSBin

    easing

    很多时候,我们需要的动画并非线性的。所谓非线性,从直观上看,就是动画速度随着时间会产生变化。那么如何实现变速的动画呢?

    由前所述,我们知道通过控制动画的时间进程就相当于控制动画的效果进程。随着真实世界的时间进程推移,动画的时间进程跟着推移,从而控制动画的效果进程推移。那么,我们可以通过修改真实世界的时间进程和动画的时间进程间的映射关系,从而控制动画进程。假如你感到困惑,没关系,请看下图:

    这是线性动画中,真实世界的时间进程和动画进程的映射关系。接下来,我们将其进行变换

    这条曲线实际上是函数y = x * x的图像。可以看到,两个曲线的定义域和值域并没有变化。曲线的斜率就是动画的速率。接下来我们将两张图重叠在一起做一个对比。

    在真实世界的时间进行到x0的时候,动画进程原本应该进行到y0,在进行变换之后,只进行到y1。到最后,百川归海,两条线交汇于点(1, 1)。这里,y = x * x是变换函数(easing function)。

    我们修改一下上面的例子,让动画变成非线性的。

    function ease(time) {
          return time * time;
        }
    
        /**
         * 执行一步动画(更新属性)
         */
        function _animLeft() {
          var pos = (now() - begin) / duration;
          if (pos >= 1.0) {
            return false;
          }
          pos = ease(pos);
          return !!(el.style.left = (start + (end - start) * pos) + "px");
        }

    JSBin

    我们可以在jQuery的代码中看到这样的函数。

    jQuery.easing = {
          linear: function( p ) {
            return p;
          },
          swing: function( p ) {
            return 0.5 - Math.cos( p * Math.PI ) / 2;
          }
        };

    因此,你可以往jQuery.easing里面添加easing function,使得jQuery支持新的动画速率控制方法。注意,easing function的定义域和值域必须都为[0, 1]。

     jQuery.easing.myEasing = function( p ) { return ... }

    总结

    该篇讲述了JavaScript动画的最基本的原理。

    JavaScript动画实质上也是通过操作CSS去执行动画。动画的时间进程可以决定动画的效果进程。通过操作真实世界的时间进程和动画的时间进程之间的关系,我们可以将线性动画变换成非线性的动画。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    如何删除自带的不常用应用为windows 7减负

    MySQL中多表删除方法

    改进的二值图像像素标记算法及程序实现

    windows 7 32位系统下手动修改磁盘属性例如M盘修改为F盘

    windows 7中怎么样在家庭组互传文件

    Linux应用集成MySQL数据库访问技巧

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。