zoukankan      html  css  js  c++  java
  • Javascript 可同时变大变宽等一系列效果运动框架——逐行分析代码,让你轻松了解运动的原理

    等待已久的可变大,变宽 等一系列效果运动框架出炉了,现在还是个初级版本,能满足需求。我们看看是如何实现的。

    我们知道在Javascript 中 ‘.’等同于 ‘[]’ 例如: oDiv.style.height=oDiv.style[‘height’]

    那么,我们把要运动的属性作为一个参数,传入到之前函数中即可。

    透明度呢,需要单独处理,判断下即可。

    直接上代码。

    <style type="text/css">
                div {
                    width: 200px;
                    height: 200px;
                    margin: 20px;
                    float: left;
                    background: yellow;
                    border: 1px solid #CCCCFF;
                    filter: alpha(opacity=30);
                    opacity: 0.3;
                }
            </style>
    <body>
            <div id="div1"></div>
    
        </body>

    以下是Javascript代码:

    <script type="text/javascript">
                window.onload = function() {
                    var oDiv1 = document.getElementById("div1");
    
                    oDiv1.onmouseover = function() {
                        startMove(this, 'opacity', 100);
                    };
                    oDiv1.onmouseout = function() {
                        startMove(this, 'opacity', 30);
                    };
    
                }
    
                function getStyle(obj, name) {
                    if (obj.currentStyle) {
                        return obj.currentStyle[name];
                    } else {
                        return getComputedStyle(obj, null)[name];
                    }
                }
    
    
                function startMove(obj, attr, iTarget) {
                    clearInterval(obj.time);
                    
                    obj.time = setInterval(function() {
                        var cur = 0;
    
                        if (attr == 'opacity') {
                            cur=parseFloat(getStyle(obj, attr)) * 100;
                        } else {
                            cur = parseInt(getStyle(obj, attr));
                        }
    
                        var speed = (iTarget - cur) / 6;
    
                        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
    
                        if (cur == iTarget) {
                            clearInterval(this.time);
                        } else {
                            if (attr == 'opacity') {
                                obj.style.filter = 'alpha(opacity=' + cur + speed + ')';
                                obj.style.opacity = (cur + speed) / 100;
                            } else {
                                obj.style[attr] = cur + speed + 'px';
                            }
                        }
                    }, 30);
                }
            </script>

    结合之前的博文中的知识,相信里面的一些计算原理大家都了如指掌,无需多说了吧。不懂可以回顾下之前的文章。

    那么 这个运动框架到目前为止就没问题了吗?

    不要急 这个还是有问题的 在IE7 下就会出现bug 。。 怎么会事呢 。

    其实Javascript 中的运算是有误差的,alert(0.07*100);  // 7.000000000….1

    那么我们的代码中 parseFloat(getStyle(obj, attr)) * 100这句就会有误差。 

    这个问题怎么解决呢??

    其实很简单,用 Math.round() ;   改掉相应的代码

    cur=parseFloat(getStyle(obj, attr)) * 100;

    改成 cur = Math.round(parseFloat(getStyle(obj, attr)) * 100); 即可

    原理就是把小数干掉,留下整数的部分就可以了。

  • 相关阅读:
    调用webservice接口报错
    Java设计模式之使用反序列化的方式实现单例模式
    Java设计模式之使用枚举类的方式创建单例
    使用饿汉模式创建单例模式
    Java 查看运行生成的字节码文件 反汇编
    Java设计模式之--单例模式-使用懒汉模式创建
    git无法 cherry pick到其他分支
    Android之Handler用法总结
    Java之观察者模式
    Android之Activity与Service通信
  • 原文地址:https://www.cnblogs.com/IcemanZB/p/4186621.html
Copyright © 2011-2022 走看看