Javascript 运动中Offset的bug解决方案_javascript技巧

我们先来看看这个bug 是怎么产生的。

复制代码 代码如下:

<style type="text/css">
            #div1 {
                width: 200px;
                height: 200px;
                background: red;
               
            }
        </style>

复制代码 代码如下:

<body>
        <div id="div1">
           
        </div>
    </body>

以下是用来测试的Javascript代码 ,目的是 让div慢慢变窄。

复制代码 代码如下:

<script type="text/javascript">
            setInterval(function(){
                var oDiv=document.getElementById("div1");
               
                oDiv.style.width=oDiv.offsetWidth-1+'px';
               
            },30);
        </script>

Javascript 代码 很简单,运行一下 没有任何问题,如愿的div在慢慢变小。

那这个offset 的bug又是怎么来的呢?

下面我们动动样式 就会神奇的事情发生了。。。

我们给div1 加个样式 border: 1px solid #CCCCFF;

复制代码 代码如下:

<style type="text/css">
            #div1 {
                width: 200px;
                height: 200px;
                background: red;
                border: 1px solid #CCCCFF;
            }
        </style>

此时在运行代码 ,发现div 居然往右边慢慢增大。。。image BUG 惊现。。。。 明明是减1 为什么会出现这种情况。

让我们想想offset 有什么特点:

举例: div width : 200px  border 1px  。 实际上他得到的offsetWidth 是202px 。

那么,我们说回来,运动刚开始的时候,实际上div 的宽度是200px  那么offsetWidth 是202

这个时候 oDiv.style.width=oDiv.offsetWidth-1+'px'; 这句话就是等于 oDiv.style.width=202-1=201px; 然后在赋值给width

当再次执行这句话的时候 div的宽度是 201px; 这样的话,每次都会增加1px,反而慢慢变大了。 这就是offset 的bug 。

怎么解决这个问题呢?

其实不用这个offsetWidth 就可以了 。 我们用 width !! 写个函数直接获取 css样式中width 即可

获取不在行间中的样式 :

复制代码 代码如下:

function getStyle(obj, name) {
                if (obj.currentStyle) {
                    return obj.currentStyle[name];
                } else {
                    return getComputedStyle(obj, null)[name];
                }
            }

那么我们在修改下原来的代码:

复制代码 代码如下:

<script type="text/javascript">
            setInterval(function(){
                var oDiv=document.getElementById("div1");
                oDiv.style.width=parseInt(getStyle(oDiv,'width'))-1+'px';
            },30);
            function getStyle(obj, name) {
                if (obj.currentStyle) {
                    return obj.currentStyle[name];
                } else {
                    return getComputedStyle(obj, null)[name];
                }
            }
        </script>

 
这样程序运行就不会有任何问题了。

时间: 2024-11-29 00:38:05

Javascript 运动中Offset的bug解决方案_javascript技巧的相关文章

Javascript数组中push方法用法分析_javascript技巧

本文实例讲述了Javascript数组中push方法用法.分享给大家供大家参考,具体如下: 看下面代码: var o = { 1:'a' ,2:'b' ,length:2 ,push:Array.prototype.push }; o.push('c'); Q:o现在内部的值是什么样子? 我的第一反应是排斥,为什么要研究不合理情况下[解释引擎]的行为?但是这种推论有时候又很吸引人,于是我回来的时候仔细思考了下,发现其实很简单. 对于push这个方法,我条件反射地想到的就是栈,[数据结构的经典栈]

JavaScript 正则表达式中global模式的特性_javascript技巧

返回 Boolean 值,指出正则表达式使用的global 标志 (g) 的状态.默认值为 false.只读. rgExp.global 必选项 rgExp 参数是正则表达式对象. 如果正则表达式设置了global 标志,那么global 属性返回 true,否则返回 false. 使用 global 标志表明在被查找的字符串中搜索操作将查找所有符合的项,而不仅仅是第一个.这也被称为全局匹配. 一直不是很清楚javascript的global到底表现在哪些方面,所以今天特地做了几个测试: var

Javascript 多浏览器兼容性问题及解决方案_javascript技巧

CSS 多浏览器兼容性问题及解决方案 一.document.formName.item("itemName") 问题 问题说明:IE下,可以使用 document.formName.item("itemName") 或 document.formName.elements ["elementName"]:Firefox 下,只能使用document.formName.elements["elementName"]. 解决方法:

javascript函数中的3个高级技巧_javascript技巧

前面的话  函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此.前面曾以深入理解函数系列的形式介绍了函数的相关内容,本文将再深入一步,介绍函数的3个高级技巧   技巧一:作用域安全的构造函数 构造函数其实就是一个使用new操作符调用的函数  function Person(name,age,job){ this.name=name; this.age=age; this.job=job; } var person=new Person('match',28,'Softwa

JavaScript 参数中的数组展开 [译]_javascript技巧

译者注:本文要讲的是ECMAScript 6中的知识点,如果你连ES5都不了解的话.我得说,你已经很落后了.CSS4,HTML6,甚至ES7 ES8都已经开始规划了,赶紧形动起来吧,否则淘汰! 有些时候,我们需要把一个数组展开成多个元素,然后把这些元素作为函数调用的参数.JavaScript中可以使用Function.prototype.apply来实现这种展开操作,但它不能被应用在执行构造函数的情况下.本文解释了什么是展开操作以及如何在使用new运算符的同时进行展开操作. 1.展开(Sprea

Javascript 函数中的参数使用分析_javascript技巧

首先,在JS中函数也是一种标识符,可以将它赋值给新的变量,也可以通过这个变量来调用.这有点像C语言的函数指针,不过也不完全一样,如下面的代码: 复制代码 代码如下: function myfun() { alert("funcation call"); } var fun = myfun; fun(); 再有一个值得说一下的,就是JS中的函数的参数不一定是严格匹配的,通常的编程经验,比如有这样一个函数 fun(aa,bb),那么我们在调用这个函数的时候就应该给他传递两个参数.但是在JS

javascript函数中参数传递问题示例探讨_javascript技巧

相信每一位刚接触javascript的同学在函数参数传递上都会很疑惑,原因无他,那就是它的语法太怪异了,你定义一个函数 例如 function test(name,msg){ return 'hello' + name + msg; } 那么你在调用的时候怎么调呢,你可以test('Eric'),test('Eric','welcome to javascript')甚至你可以给它传递任意多个参数,并且类型随意.这是多么爽的一件事情,学过c++/c#或者java的同学可能就会想到函数重载.但是,

Javascript加载速度慢的解决方案_javascript技巧

通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度倍增. 把通常加载方式: 复制代码 代码如下: <script src="xxxx.js"></script> 改变成: 复制代码 代码如下: <script type="text/javascript"> document.writ

javascript关于运动的各种问题经典总结_javascript技巧

本文实例总结了javascript关于运动的各种问题.分享给大家供大家参考.具体如下: 一.JS运动的各种问题 问题一: 错误代码: function startMove(){ var timer=null; var div1=document.getElementById("div1"); if (div1.offsetLeft==300){ clearInterval(timer); }else{ timer=setInterval(function(){ div1.style.l