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 相关文章推荐
Prototype RegExp对象 学习
Jul 19 Javascript
js loading加载效果实现代码
Nov 24 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
Sep 22 Javascript
jquery浏览器滚动加载技术实现方案
Jun 03 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
Node.js引入UIBootstrap的方法示例
May 11 Javascript
JS在if中的强制类型转换方式
Jul 15 Javascript
解决eclipse中没有js代码提示的问题
Oct 10 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
Mar 04 Javascript
Vue Router history模式的配置方法及其原理
May 30 Javascript
JS数组方法reverse()用法实例分析
Jan 18 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
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
brook javascript框架介绍
2011/10/10 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
在CMD命令行中运行python脚本的方法
2018/05/12 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
留学推荐信范文
2014/05/10 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
装修施工安全责任书
2014/07/24 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
答谢词范文
2015/01/05 职场文书
怎样写离婚协议书
2015/01/26 职场文书
农业项目投资意向书
2015/05/09 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS