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 相关文章推荐
jquery下实现overlay遮罩层代码
Aug 25 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
Dec 12 Javascript
基于jQuery实现模拟页面加载进度条
Apr 01 Javascript
通过length属性判断jquery对象是否存在
Oct 18 Javascript
浅析$.getJSON异步请求和同步请求
Jun 06 Javascript
Vue.js第二天学习笔记(vue-router)
Dec 01 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
May 03 Javascript
vue.js实现条件渲染的实例代码
Jun 22 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
Sep 02 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学习笔记之二
2011/01/17 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP写日志的实现方法
2014/11/05 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
python实现用户登录系统
2016/05/21 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python去掉行尾的换行符方法
2017/01/04 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
python 检查文件mime类型的方法
2018/12/08 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
模具专业自荐信
2014/05/29 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
优秀员工评优方案
2014/06/13 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
教育教学读书笔记
2015/07/02 职场文书
小学生暑假生活总结
2015/07/13 职场文书
高一语文教学反思
2016/02/16 职场文书