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 相关文章推荐
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
javascript实现tab切换的四种方法
Nov 05 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
Jun 06 Javascript
用原生js做单页应用
Jan 17 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
May 12 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
Jan 22 Javascript
js 实现Material UI点击涟漪效果示例
Sep 23 Javascript
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
建立动态的WML站点(三)
2006/10/09 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
php cookie 详解使用实例
2016/11/03 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python多重继承新算法C3介绍
2014/09/28 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
解决Django中多条件查询的问题
2019/07/18 Python
Python3列表List入门知识附实例
2020/02/09 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
幼儿园义卖活动方案
2014/01/17 职场文书
幼儿园国庆节活动方案
2014/02/01 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
离婚协议书范本样本
2014/08/19 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
2014年财务科工作总结
2014/11/11 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang