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 delete操作符应用实例
Jan 13 Javascript
DIV菜单层实现代码
Nov 19 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
May 03 Javascript
javascript实现des解密加密全过程
Apr 03 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
JS解惑之Object中的key是有序的么
May 06 Javascript
JavaScript鼠标拖拽事件详解
Apr 03 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
Apr 03 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
threejs太阳光与阴影效果实例代码
Apr 05 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作的文本留言本的例子(三)
2006/10/09 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
css配合jquery美化 select
2013/11/29 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
原生js实现验证码功能
2017/03/16 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
layui使用数据表格实现购物车功能
2019/07/26 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
详解在Python中处理异常的教程
2015/05/24 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
优秀士兵先进事迹
2014/02/06 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Python制作春联的示例代码
2022/01/22 Python