• 老夫当年手写的js动画库


    前言

    当年我学习js的时候,那时候学生时代不知道有jquery,所以手写了一些东西,留下的不多作为回忆。

    正文

    ``` javascript
    window.onload = function () {
            var oBox = document.getElementById('box');
            document.getElementById('btn').onclick = function () {
                animate(oBox, {"z-Index":999,"opacity": 0.2,"left":"300px","height":400})
    
            }
        }
    
        /*
         * json === {left : 400px,"opacity":0.3}
         *           key  json[key]
         *
         * */
        function animate(obj, json, callback) {
            //1.清空之前的定时器
            clearInterval(obj.timer);
    
            //启动定时器
            obj.timer = setInterval(function () {
    
                var flag = true
                for (var key in json) {
                    // 步长 = (目标值-当前值)/10;
                    var step = (parseInt(json[key]) - parseInt(getStyle(obj, key))) / 10;
    
                    if (key == "opacity") {
                        step = (json[key] * 100 - getStyle(obj, "opacity") * 100) / 10;  // 0--10
                    }
    
                    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    
                    if (key == "z-Index") {
                        obj.style.zIndex = json[key];
    
                    } else if (key == "opacity") {
                        // 没有带单位操作
                        //新的位置=当前的位置+ 步长;
                        obj.style.opacity = Number(getStyle(obj, "opacity")) + (step / 100);
                        if (Number(getStyle(obj, "opacity")) != Number(json[key])) {
                            flag = false;
                        }
                    } else {
                        //新的位置    =    当前的位置       +          步长;
                        obj.style[key] = parseInt(getStyle(obj, key)) + step + "px";
                        if (parseInt(getStyle(obj, key)) != parseInt(json[key])) {
                            flag = false;
                        }
                    }
                }
    
                //到达指定位置
                if (flag == true) {
                    clearInterval(obj.timer);
                    if (callback) {
                        callback();
                    }
                }
            },40)
        }
    
        // px
        function getStyle(obj, attr) {
            if (obj.currentStyle) {
                //ie
                return obj.currentStyle[attr];
            }
            //goole
            return window.getComputedStyle(obj, null)[attr];
        }
    

    简单介绍一下原理,其实就是动态修改一下某个属性。

    然后说几个注意的地方。

    1.一个是一个计时器的问题,因为如果一个计时器的话,那么肯定会出现问题,所以最好这个元素自带这个计时器。

    2.第二个需要注意的问题,比如说你想从位置0到200,那么你如何保证一定能够到200呢?这里面因为如果和时间相除的话,会出现一个问题,就是可能出现小数,而位置是只能精确到两位小数的,那么问题就会出现。

    因为找到的是第二个版本不是最终版,所以这里没有考虑完。

    3.z-Index和opacity 比较特殊需要特别考虑,同样opacity 应该考虑到ie,上面不完全,有兴趣可以补一下。

  • 相关阅读:
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    linux下导入、导出mysql数据库命令
    8个必备的PHP功能开发
    jquery中的children()和contents()的区别
    centos 通用开发工具及库安装 有了它不用愁了
    将bat批处理文件注册成windows服务
    squid隐藏squid的版本号
    squid如何屏蔽User-Agent为空的请求
    RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
  • 原文地址:https://www.cnblogs.com/aoximin/p/12971873.html
Copyright © 2020-2023  润新知