欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

完美运动框架

程序员文章站 2022-03-27 13:06:20
...

完美运动框架封装

function getStyle (ele,attr) {
            return parseFloat(window.getComputedStyle(ele)[attr])
        }
function startMove (ele,obj,fn) {
    //传入三个值,第一个是元素,第二个是对象,第三个是一个回调函数,
    //代表执行完所有操作之后执行的函数。最少传两个值   
    clearInterval(ele.timer)
    ele.timer=setInterval(function () {
        var bol=true
        for(var attr in obj){
            var st=getStyle(ele,attr)
            var _target=parseFloat(obj[attr])
            var speed=(_target-st)/10
            if(attr=="opacity"){
                st=st*100
                speed=(_target-st)/10
            }
            speed>0?speed=Math.ceil(speed):speed=Math.floor(speed)
                if(attr=="opacity"){
                    st+=speed
                    ele.style.filter="alpha(opacity="+st+")"
                    ele.style.opacity=st/100
                }else{
                    ele.style[attr]=st+speed+"px"
                }
            if(st!=_target){
                bol=false
            }
        }
        if(bol){
            clearInterval(ele.timer)
            if(fn){
                fn()
            }
        }
    },30)
}

完美运动框架调用

div.onclick=function () {
            startMove(div,{
                left:400,
            },aaa)
        }
        function aaa(){
            startMove(div,{
                top:400,
            },bbb)
        }
        function bbb(){
            startMove(div,{
                left:0,
            },ccc)
        }
        function ccc(){
            startMove(div,{
                top:0,
            })
        }
//点击盒子转一圈回到原点

封装完美运动框架遇到的问题?

1.timer问题
如果我们只保存一个timer变量,我们每次操作都只操作这一个timer,给多个元素添加运动函数,
非当前操作的元素的动画会停止,所有我们需要用到多个timer,我们可以把timer添加到元素上
类似于选项卡中给元素添加index值

2.缓冲运动速度问题
由于某些css属性不支持浮点数,所以我们需要对速度进行调整,如果速度值是正数,向上取整,
速度值是负数,向下取整

3.offsetWidth问题
offsetWidth获取元素的padding+border+width,而我们所需要的只是元素的width
所以我们需要获取非行内样式的width,用到getComputedStyle方法

4.多属性问题
之前封装的函数,只能传入一个属性,运动框架只能操作一个属性,我们把所有的属性放到一个对象里
对象中可传入多个属性.