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

来源:互联网 发布:龙年瞎子皮肤淘宝多钱 编辑:程序博客网 时间:2024/05/16 10:41

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

我们知道在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); 即可

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

0 0
原创粉丝点击