缓动动画

2018-07-16  本文已影响0人  佩佩216

缓动动画原理

1.1 常见的 js访问 CSS 属性

        var h = 'height';
        box.style.h = 300 + 'px';
           var h = 'height';
           box.style[h] = 300 + 'px';

1.2 JS获取CSS的样式

在开发中,我们想要获得css 的样式,通常采用:box.style.top ,box.style.backgorundColor等, 但这种方式只能得到 行内样式,而平常用的最多的是页内样式或者外部样式, 那我们如何解决这样的问题?

        function getStyleAttr(obj, attr) {
            if(obj.currentStyle){ // IE 和 opera
                 return obj.currentStyle[attr];
            }else {
                 return window.getComputedStyle(obj, null)[attr];
            }
        }

1.3 js对象遍历

1.4 回调函数

在开发中,有很多操作是链式的,下一个操作接着上一个操作执行,那么如何实现这样的行为?* 回调函数。*

   回调函数什么时候调用?
  --> 动画结束的时候调用 ?
  --> 动画什么时候结束?
  ---> 定时器被清除的时候
  --> 定时器被清除时调用回调函数

2.5 完整版缓动动画

  /*
   * 缓动动画
   * obj: 要做动画的元素
   * json: 要做动画的属性键值对
   * fn: 回调函数
  */
  function Buffer(obj, json, fn) {
      // 1. 清除定时器
      clearInterval(obj.timer);
      // 2. 设置定时器
      obj.timer = setInterval(function () {
          var flag = true, begin, target;
          // 2.1 遍历json
          for(var k in json){
             // 2.1.1 获取做动画属性的初始值
             if('opacity' == k){ // 透明度
                begin = parseInt(parseFloat(getCssStyleAttr(obj, k)) *100) || 0;
                target = parseInt(parseFloat(json[k])*100);
             }else { // 其他动画
                begin = parseInt(getCssStyleAttr(obj, k));
                target = parseInt(json[k]);
             }
             // 2.1.2 获取动画的步长
             var speed = (target - begin) / 20;
             speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
             // 2.1.3 设置缓动动画
             if('opacity' == k ){ // 透明度
                   obj.style.opacity = (begin + speed) / 100;
                   obj.style.filter = 'alpha(opacity='+ (begin + speed) +')';
             }else if('zIndex' == k){
                   obj.style.zIndex = json[k];
            }else { // 其他情况
                  obj.style[k] = begin + speed + 'px';
            }
            // 2.1.4 判断是否清除定时器
            flag = (begin != target) ? false : true;
           }
           // 2.2 清除定时器
           if(flag){
               clearInterval(obj.timer);
               //判断
               if(fn){
                   fn(); // 执行函数
               }
           }
       }, 20);
  }

  function $(id) {
      return document.getElementById(id);
  }

  function getCssStyleAttr(obj, attr) {
      if(obj.currentStyle){
          return obj.currentStyle[attr];
      }else {
          return window.getComputedStyle(obj, null)[attr];
      }
  }
上一篇下一篇

猜你喜欢

热点阅读