Javascript 运动中Offset的bug解决方案


Posted in Javascript onDecember 24, 2014

我们先来看看这个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>

 
这样程序运行就不会有任何问题了。
Javascript 相关文章推荐
js精度溢出解决方案
Dec 02 Javascript
正则表达式搭配js轻松处理json文本方便而老古
Feb 17 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
node.js require() 源码解读
Dec 13 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
Feb 08 Javascript
微信小程序版本自动更新的方法
Jun 14 Javascript
学习RxJS之JavaScript框架Cycle.js
Jun 17 Javascript
微信小程序 可搜索的地址选择实现详解
Aug 28 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 jQuery
jQuery中height()方法用法实例
Dec 24 #Javascript
jQuery中width()方法用法实例
Dec 24 #Javascript
jQuery中animate()方法用法实例
Dec 24 #Javascript
jQuery中fadeOut()方法用法实例
Dec 24 #Javascript
创建js对象和js类的方法汇总
Dec 24 #Javascript
javascript使用prototype完成单继承
Dec 24 #Javascript
jQuery中slideUp()方法用法分析
Dec 24 #Javascript
You might like
MySQL相关说明
2007/01/15 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
2016/05/24 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
给Python入门者的一些编程建议
2015/06/15 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
python版本五子棋的实现代码
2018/12/11 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
AC Lens:购买隐形眼镜
2017/02/26 全球购物
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
学校安全教育制度
2014/01/31 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android