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 变量命名规则详解
May 07 Javascript
22点关于jquery性能优化的建议
May 28 Javascript
提高jQuery性能优化的技巧
Aug 03 Javascript
javascript常用的方法整理
Aug 20 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
JS多物体实现缓冲运动效果示例
Dec 20 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
Jan 04 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
使用JSON格式提交数据到服务端的实例代码
Apr 01 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
深入浅析Vue 中 ref 的使用
Apr 29 Javascript
javascript 使用sleep函数的常见方法详解
Apr 26 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数组合并的二种方法
2014/03/21 PHP
PHP的拦截器实例分析
2014/11/03 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
php跨服务器访问方法小结
2015/05/12 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
PHP的PDO连接讲解
2019/01/24 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
python中bytes和str类型的区别
2019/10/21 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
司机的工作范围及职责
2013/11/13 职场文书
财务分析个人的自荐书范文
2013/11/24 职场文书
就业表自我评价分享
2014/02/06 职场文书
书法比赛获奖感言
2014/02/10 职场文书
客户接待方案
2014/02/26 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
电影雷锋观后感
2015/06/10 职场文书
中学语文教学反思
2016/02/16 职场文书
Elasticsearch 聚合查询和排序
2022/04/19 Python
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技