CSS3动画的Javascript降级解决方案

我一直在为iPad应用程序创建一些小型胖客户端JavaScript应用程序,它们在UIWebview中加载相关应用程序.我现在正在使用跨浏览器,需要使用JavaScript为CSS动画和过渡添加一些后备.

我的webkit特定实现使用CSS类用于所有动画/转换,其中开始和结束状态在设计时已知,使用javascript中的add / remove类并使用相关的webkitTransitionEnd / webkitAnimationEnd事件.

对于“动态”过渡,我有一个简单的“动画”功能,它只是将样式属性应用于相关元素.

我想保留内部API,通过简单的添加/删除类等,尽可能地将转换应用到当前实现.我通常有一个应用程序的CSS和js文件(都缩小了).

所以有几个问题/点我会感激任何输入:

> IE7 / 8问题 – IE9.js
>动态添加供应商特定的前缀 – 到目前为止找到’jquery.css3finalize’.
>转换到类:’jquery.animateToClass’ – 似乎每次应用类时都会搜索样式表 – 是否应该在进一步的查找中缓存相关的类?这是缓慢的/资源饥饿的吗?
>对于’@keyframe’动画:我想要一个javascript对象’表示’每个CSS3动画的关键帧.因此,将类传递给’doAnimationWithClass’函数将使用普通的css3动画(如果在浏览器中可用),但如果不是,它会将’对象版本’传递给使用css3过渡(如果可用)链接每个关键帧过渡的函数或jQuery.animate(或等效的),最终得出相同的结果.

例如:

CSS:

@-webkit-keyframes an-animation {
  0% { opacity: 0; }
  50% { opacity: 1; }
  100% { opacity: 0; }
}

.an-animation {
  -webkit-animation-name: an-animation;
  -webkit-animation-duration: 1s;
  -webkit-animation-timing-function: linear;
  -webkit-animation-iteration-count: 2;
}

JS:

var animations = {
    an-animation: {
      keyframes: [
      { 
        duration: '',timing: 'linear',props: {
          opacity: 0
        }
      },{ 
        duration: '0.5s',props: {
          opacity: 1
        }
      },props: {
          opacity: 0
        }
      }
    ]
  }
};

var animationClasses = [
  an-animation: {
    name: 'an-animation';
    duration: '1s';
    timing: 'linear';
    count: 2;
  }
];

function doAnimationWithClass(className) {
  if (modernizer.cssanimations) {
    //normal implementation
  }
  else {
    //lookup class in animationclasses
    //lookup relevant animation object in animationHash
    //pass to animation chaining function
  }
}

animationHash等的创建可以在客户端完成,也可以在设计时创建(使用批处理/构建文件).

任何想法或指向已经以更明智的方式做到这一点的图书馆的人都会受到赞赏.

最佳答案
恩,那就对了.您需要将关键帧设置传输到js对象.我认为css动画和关键帧是一种更好的编写动画的方法. JS动画方式很难维护.这是我的解决方案.我还写了一个小工具,用于将css关键帧转换为js object(css keyframes to js object).

var myFrame = {
  '0%': {
    left: 0,top: 0
  },'25%': {
    left: 100,top: 100
  },'50%': {
    left: 0,top: 300
  },'100%': {
    left: 0,top: 0
  }
};

var keyframes = {
  set: function($el,frames,duration) {
    var animate;
    animate = function() {
      var spendTime;
      spendTime = 0;
      $.each(frames,function(idx,val) {
        var stepDuration,stepPercentage;
        stepPercentage = idx.replace('%','') / 100;
        stepDuration = duration * stepPercentage - spendTime;
        $el.animate(val,stepDuration);
        return spendTime += stepDuration;
      });
      return setTimeout(animate,duration);
    };
    return animate();
  }
};

keyframes.set($('#mydiv'),myFrame,2000); 

>演示:http://jsbin.com/uzodut/4/watch

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)