移动端滑屏全应用【四】移动端动画贞动画函数mTween封装

首先此函数是基于大家都知道的Tween动画算法的,在此基础上使用了三中讲到的兼容版动画贞,可以使动画变得更流畅。

1. 首先要记得引入Tween.js

2. 引入mTween.js

3. 调用

* mTwee.js文件如下: (这里的m意为mobile)

(function(){
    window.requestAnimationFrame = window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;
    window.cancelAnimationFrame = window.cancelAnimationFrame|| window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame||window.cancelRequestAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame;
    if(!requestAnimationFrame){
        var lastTime = Date.now();
        window.requestAnimationFrame = function(callback){
            var id;
            var nowTime = Date.now();
            var delay = Math.max(16.7-(nowTime-lastTime),0);
            id = setTimeout(callback,delay);
            lastTime = nowTime + delay;
            return id;
        };
    }
    if(!cancelAnimationFrame){
        window.cancelAnimationFrame = function(index){
            clearTimeout(index);
        };
    }
})();

function transform(el,attr,val){
    if(!el.transform){
        el.transform = {
        };
    }
    if(val === undefined){
        return el.transform[attr];
    }
    el.transform[attr] = val;
    var str = "";
    for(var s in el.transform){
        switch(s){
            case "rotate":
            case "rotateX":
            case "rotateY":
            case "rotateZ":
            case "skewX":
            case "skewY":
                str += s +"("+el.transform[s]+"deg) ";
                break;
            case "scale":
            case "scaleX":
            case "scaleY":
                str += s +"("+el.transform[s]+") ";
                break;
            case "translateX":
            case "translateY":
            case "translateZ":
                str += s +"("+el.transform[s]+"px) ";
                break;
        }
    }
    el.style.WebkitTransform = el.style.transform = str;
}

function css(el,attr,val){
    var transformAttr = ["rotate","rotateX","rotateY","rotateZ","skewX","skewY","scale","scaleX","scaleY","translateX","translateY","translateZ"];
    for(var i = 0; i < transformAttr.length; i++){
        if(attr == transformAttr[i]){
            return transform(el,attr,val);
        }
    }
    if(val === undefined){
        val = getComputedStyle(el)[attr];
        console.log(val);
        val = parseFloat(val);
        return val;
    }
    if(attr == "opacity"){
        el.style[attr] = val;
    } else {
        el.style[attr] = val + "px";
    }
}    

function mTween(init){
    var t = 0;
    var b = {};
    var c = {};
    var d = Math.ceil(init.time/16.7);
    cancelAnimationFrame(init.el.timer);
    for(var s in init.target) {
        b[s] = css(init.el,s);
        c[s] = init.target[s] - b[s];
    }
    init.el.timer = requestAnimationFrame(move);
    function move(){
        if(t > d){
            cancelAnimationFrame(init.el.timer);
            init.callBack&&init.callBack.call(init.el);
        } else {
            t++;
            for(var s in init.target){
                var val = Tween[init.type](t,b[s],c[s],d);
                css(init.el,s,val);
            }
            init.callIn&&init.callIn.call(init.el);
            init.el.timer = requestAnimationFrame(move);
        }
    }
}

调用方法:

var box = document.querySelector(‘#box‘);
css(box,"translateX",0);
css(box,"translateY",0);
mTween({
    el: box,
    type: "elasticIn",
    time: 1000,
    target: {
    translateX: 200,
    translateY: 400
  },
  callBack: function(){
    console.log("动画执行完了");
  },
  callIn: function(){
    console.log("动画执行中");
  }
});

原文地址:https://www.cnblogs.com/pomelott/p/10126173.html

时间: 2024-08-03 22:42:28

移动端滑屏全应用【四】移动端动画贞动画函数mTween封装的相关文章

移动端滑屏全应用【二】滑屏封装注意事项与移动端轮播

移动端滑屏封装注意事项: 1.touchMove时候方向判断(可以控制在 以x轴位中心正负15度之内为横向滑屏,纵向滑屏同理) 2.上下滑屏与左右滑屏的冲突(判断用户滑动方向后,只做单方向的处理) 3.安卓触摸(例如某个人手指很粗)触发touchMove(记录上一次的手指坐标,每一次move的时候判断,上次的坐标与这一次的坐标相同则return掉) 移动端轮播封装注意事项: 1.使用transition做过度效果时,需要在每次start的时候清除transition,否则效果会有卡顿 2.每次e

移动端滑屏全应用【一】cssHandler操作基础动画函数封装

前言: 大家都知道,在移动端进行操作结点移动时,我们都会使用操作transform来代替top等用以提高性能,必要的时候还可开启3d加速.我们都会使用getComputedStyle来获取结点的最终样式,但使用getComputedStyle来获取transform时我们获取到的是一个矩阵值,而且是无法通过设置矩阵值反向设置transform的效果的.如下: body.style.WebkitTransform = 'translateY(50px)' getComputedStyle(body

H5案例分享:移动端滑屏 touch事件

移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件能跟踪到屏幕滑动的每根手指. 以下是四种touch事件 touchstart: //触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发.touchmove: //在屏幕上滑动时连续的触发.在这个事件发生期间,调用preventDefault()可阻止滚动.touchend: //从屏幕上移开

移动端事件——移动端滑屏切换的幻灯片(一)

在我们开始用原声JS写移动端轮播前,我们先了解一些移动端的基础. touch事件.touchEvents对象.滑屏的思想与实现 移动端touch事件 touchstart touchmove touchend let box = document.querySelector("#box"); /* touchstart --> mousedown 手指触碰元素 touchmove --> mousemove 手指触碰元素之后,在屏幕中移动 touchend --> m

移动端滑屏组件

https://github.com/lihefen/slide.git https://lihefen.github.io/slide/slide/index.html slide.js /** * * @authors Your Name ([email protected]) * @date 2016-12-20 15:54:47 * @version $Id$ */ var H = document.documentElement.clientHeight; function Slide

【js每日一练】移动端滑屏交互

一.知识点1.em && rem && vw/vhem:根据当前样式里面定义的font-size大小来计算,如当前样式里面没定义font-size,那么就根据父级上的font-size大小来计算如:.box{font-size:20px; //此时1em=20pxheight:20em; //那么,20em=400px,也就是height:400px}rem:只根据html上的font-size大小进行变化html上的font-size大小需要动态计算,计算方式有2种:a.

利用轮播原理结合hammer.js实现简洁的滑屏功能

最近有个任务,做一个非常小的h5的应用,只有2屏,需要做横向的全屏滑动切换和一些简单的动画效果,之前做这种东西用的是fullpage.js和jquery,性能不是很好,于是就想自己动手弄一个简单的东西来实现.最后我用zepto + hammer.js 和轮播的方式解决了这个问题,效果还不错,整个页面不开启Gzip时所有资源请求的数据大小为200KB左右.这篇文章总结下这个方法的实现思路. 效果演示(代码下载): 1. 实现要点 1)滑屏借鉴bootstrap的carousel插件,不过完全没有它

一个丝滑的全屏滑动返回手势

一个丝滑的全屏滑动返回手势 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回按钮的方式返回了,因为这对单手操作十分不友好:如果一个 App 居然胆敢不支持滑动返回,那离被卸载就不远了. 说到全屏返回手势,首先我感觉这件事本身可能就有问题,毕竟有点反苹果官方的交互,让用户从任意的地方都能够滑 动返回这个交互在国

关于移动端开发时iOS上滑屏卡顿的问题,以及电话类数字的样式失控问题

写在前面的话: tips:写移动的时候,那些头部需要固定显示在显示屏顶部的,通常在PC端我会用fixed来写.但是,在移动端,这并不是一个好方法,因为弹出输入小键盘的时候,会造成fixed 的元素偏移掉,在这里有两种方法可以解决: 1.建议移动端布局采用以下方式(见正文),如果有错误的地方,还请指正~ 2.另外还看到一篇文章提到这个问题,作者让固定的头部仍然采用fixed, 然后内容区也用了fixed,内容区的fixed元素这样写:{position:fixed;top:80px;bottom: