对于前面的课程,大家似乎看不出来存在什么问题,一切都很顺利,但是其实是存在一个很大的bug的,这个bug是什么呢??

我们来看看下面这个程序就知道了

<!DOCTYPE html>
<html>
<head>
<title>js动画事件</title>
<link href="move.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="move.js"></script>
</head>
<body>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>

css文件(这里面为元素添加了border边框值)

*{
margin:0px;
padding:0px;
}
li{
width:200px;
height:100px;
background-color:red;
margin-bottom:30px;
border:1px solid #eeddcc;//我们多添加了这一行,看看会出现什么问题。
}

js文件

window.onload=function(){
var ls=document.getElementsByTagName("li");
for(var i=0,l=ls.length;i<l;i++){
ls[i].timer=null;
ls[i].onmouseover=function(){
startMove(this,400);
}
ls[i].onmouseout=function(){
startMove(this,200);
}
}
}
function startMove(object,Target){
clearInterval(object.timer);
object.timer=setInterval(function(){
var speed;
if(Target==400){
speed=1;
}else{
speed=-1;
}
if(object.offsetWidth==Target){
clearInterval(object.timer);
}else{
object.style.width=object.offsetWidth+speed+"px";
}
},50)
}

大家觉得似乎没有什么问题啊?其实运行一下就会发现,宽度到达398px就停止了,然后我们离开时又会增加?

我们仔细分析一下,因为offsetWidth获得的值会包括边框,那么边框2厘米,所以width就398厘米,但是离开时又会增加是为什么呢?

当我们离开时speed就变成可-1,那么此时的object.style.width=object.offsetWidth(400)+speed(-1)=399px;

然后到下一次判断语句object.offsetWidth=object.style.width(上一次等于399px)+border(2px)=401px;所以继续执行,然后一直执行下去。

我们在来看一个例子

js2

window.onload=function(){
var ls=document.getElementsByTagName("li");
for(var i=0,l=ls.length;i<l;i++){
ls[i].timer=null;
ls[i].onmouseover=function(){
startMove(this);
} } }
var timer;
function startMove(object){
var speed=-1;
clearInterval(timer);
timer=setInterval(function(){
object.style.width=object.offsetWidth+speed+"px";
},50)
}

这里我们明明设置的speed=-1,照说应该会慢慢变短的,但是发现运行结果是慢慢变长,这是为什么呢??

这还是因为border的问题。为什么呢?

比如此时的object.style.width=object.offsetWidth(200)-1=199PX

然后下一刻object.offsetWidth=199+border(2px)=201;如此反复所以是一直在增加。

所以发现通过object.offsetWidth这个存在一个bug。那我们如何来修改呢

方法一,将width,height参数写到元素里面去

<li style="width:200px; height:100px"></li>

然后这样获取object.style.width=parseInt(object.style.width)+speed+"px";

方法二

运用getStyle函数来获取属性

在js中定义一个getStyle函数;

js文件

window.onload=function(){
var ls=document.getElementsByTagName("li");
for(var i=0,l=ls.length;i<l;i++){
ls[i].timer=null;
ls[i].onmouseover=function(){
startMove(this);
} } }
var timer;
function startMove(object){
var speed=-1;
clearInterval(timer);
timer=setInterval(function(){
object.style.width=parseInt(getStyle(object,"width"))+speed+"px";//parseInt不能丢。
},50)
}
function getStyle(object,attr){//自定义一个函数用来获取属性值
if(object.currentStyle){
return object.currentStyle[attr];//IE浏览器
}else if(getComputedStyle){
return getComputedStyle(object,false)[attr];//火狐浏览器
}
}

js动画---一个小bug的处理的更多相关文章

  1. js动画--一个小bug处理下

    对于上面的课程我们很好的处理了一个小bug,那么我们现在讲程序进行优化一下,前一节的程序中,我们处理处理的属性都是写死了的.为了我们能够很好的对某个属性进行操作的话.我们这样来设置. js文件 win ...

  2. 关于一个小bug的修正

    python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...

  3. iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  4. js实现一个小游戏(飞翔的jj)

    js实现一个小游戏(飞翔的jj) 源代码+素材图片在我的仓库 <!DOCTYPE html> <html lang="en"> <head> & ...

  5. 从一个小Bug,到Azure DevOps

    1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...

  6. Python2 下 Unicode 的一个小bug

    关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...

  7. 第三方开源动画库EasyAnimation中一个小bug的修复

    看过iOS动画之旅的都知道,其中在最后提到一个作者写的开源动画库EasyAnimation(以下简称EA). EA对CoreAnimation中的view和layer动画做了更高层次的包装和抽象,使得 ...

  8. 《Node入门》读书笔记——用Node.js开发一个小应用

    Android APP的开发告一段落,一个稳定的.实现了基本功能的APP已经交付用户使用了!我和老板交流了下,接下来准备转战Node.js了,而且一部分前端的功能也要做进去!哈哈哈~~~接下来要朝一个 ...

  9. Cocos2d-JS V3.10 一个小bug提示

    感谢读者古事东流反馈,新版V3.10的音乐播放接口存在一个bug. 重复播放一个音乐,会出现音乐停止的状况. debug了一下,发现src的对比有点问题.传入的url是相对路径,但背景bgMusic. ...

随机推荐

  1. c# word 插入图片问题

    情景描述: 在之前文本框中加标签,代码直接addPicture出现了意外.不起作用,怀疑是文档模板的问题,因为生成的PDF和word格式总时不时有差异,左右捣鼓下,更换文本框,更换图片形式,形状形式, ...

  2. WebUploader 被 FormData 函数坑了,用了他的页面千万别定FormData变量

    WebUploader 被  FormData 函数坑了,用了他的页面千万别定FormData变量 被这个坑了,页面中变量var FormData=null;后又为他赋了值,所有一直上传不了,也没有错 ...

  3. java的sha1加密,转化为python版本

    java的加密方法如下: public class EncryptUtil { /** 16进制 : 16 */ private static final int HEX = 16; /** SHA: ...

  4. 学习spring源码-可参考的资料

    剑指Spring源码(二) https://www.cnblogs.com/codebear/p/10374261.html 使用idea和gradle编译spring5源码https://blog. ...

  5. kali 添加swap 交换分区

    这里采用的是添加交换文件 mkdir /swap #创建/swap 文件夹 dd if=/dev/zero of=/swap/swapfile bs=1M count=4096 # 在/swap 下创 ...

  6. cad.net 读取pc3,pmp 读取pc3打印机文件

    修改pc3文件还没做好..大家先look look怎么读.... 首先弄一个控制台程序, 然后去下载 Ionic.Zip 这个东西...载到控制台...都很简单... 然后就是复制下面代码,看控制台显 ...

  7. 饱了吗-web前端个人总结

    一.引言 1.0 项目源代码整合 饱了吗前端web:传送门 饱了吗web和app后端:传送门 饱了吗app前端:传送门 饱了吗web展示:传送门 1.1 编写背景 web端开发人员较少,正好以前学习过 ...

  8. 【chromium】 Chromium OS的oom机制

    前一段时间,运行在Chromium OS上的一个相机应用经常会自己崩溃,进程戛然而止,测试过程中发现使用的内存以肉眼可见的内存增长,当增长到1G左右,应用窗口突然消失,虽然原因不明,但是能猜到个大概, ...

  9. bootstrap使用笔记

    本文翻译自[http://getbootstrap.com/2.3.2/scaffolding.html#gridSystem] 1.需要在H5的文档声明中使用: 2.如下一个简单的两列布局,先添加一 ...

  10. LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和

    传送门 数字最小公倍数为\(L\)的充分条件是所有数都是\(L\)的约数,而\(10^8\)内最多约数的数的约数也只有\(768\)个.所以我们先暴力找到所有满足是\(L\)的约数.\(G\)的倍数的 ...