就是没有把画面跟上
是里面的方法写的有问题
在move.js里面有定义
你在浏览器里调试一下,就很容易发现问题的,我写代码时,第一遍,总出点毛病,调式多了,就会了;
obj.style.attr=icur+speed+'px';改为 obj.style[attr]=icur+speed+'px';自己找到问题所在了
浏览器兼容问题
obj.timer=setInterval(......) 这里已经给予定时器了 这里的timer其实是没有多少意义的 因为后续的处理都是针对各个对象的定时器 而不是这个命名的timer 所以这个例子注释掉是没有影响的 这个timer在整个程序运行过程中其实并没有参与
因为只有一个定时器。你调用两次。。。
中括号? 你指的JSON吗? 你是不是想问json属性名是否需要加引号?通常情况下不加引号可以使用,但json作为一种通用性的数据格式,所以必须保持严格性,不然在跨语言开发就会很麻烦,并且不加引号的话,在JS中有时也会造成混乱,所以必须为了保证其严格性,必须要加引号。
var icur=parseInt(getStyle(obj,'width'));位置不对
你可以封装一个函数来得到当前元素的宽度,就不会受边框宽度的影响了。
//获取样式
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];//IE
}else{
return getComputedStyle(obj,false)[attr];//firefox
}
}
这样来进行运动obj为运动的元素
obj.style.width=parseInt(getStyle(obj,"width"))-1+"px";
28行少加一个括号,30行也错了。
怎么会 老师就是用chrome测试的 你粘贴下你的完整代码 我看看
一下是基于题主的代码稍微修改的,可以运行。题主细心察看一下改动之处。 <!DOCTY html> <html> <head> <meta charset="UTF-8"> <title>任意属性/链式运动</title> <style type="text/css"> body,div{ margin:0; padding:0;} #div1{ width:200px; height:200px; border:1px solid yellow; background-color:blue; } #div2{ width:200px; height:200px; border:1px solid green; background:red; } </style> <script type="text/javascript"> window.onload=function(){ var mId=document.getElementById('div1'); //console.log(getStyle(mId,'width')); mId.onmouseover=function(){ startmove(this,'width',400);} mId.onmouseout=function(){ startmove(this,'width',200);} } function getStyle(obj,attr){ var myStyle=null; if(obj.currentStyle){ myStyle=obj.currentStyle[attr]; }else{ myStyle=getComputedStyle(obj,null)[attr]; } return myStyle; } var speed=0; function startmove(obj,attr,target){ window.clearInterval(obj.timer); obj.timer=window.setInterval(function(){ var att=parseInt(getStyle(obj,attr)); speed=(target-att)/20; speed>0?speed=Math.ceil(speed):speed=Math.floor(speed); console.log(speed); if(att==target){ window.clearInterval(obj.timer); }else{obj.style[attr]=att+speed+'px';} },200); } </script> </head> <body> <div id="div1" > 333 </div> <div id="div2"> 222 </div> </body> </html>
自己定义和封装的,不属于js库。
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}
var timer; window.onload = function(){ var div1 = document.getElementById("div1"); var div2 = document.getElementById("div2"); div1.onmouseover = function(){ startMove(this,"height",300); } div1.onmouseout = function(){ startMove(this,"height",100); } } function startMove(obj,attr,iTarget){ clearInterval(timer); timer = setInterval(function(){ var icur = parseInt(getStyle(obj,attr)); var speed = (iTarget - icur) / 5; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if(icur==iTarget){ clearInterval(timer); } else{ obj.style[attr] = icur + speed + 'px'; } },50); } function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; } else{ return getComputedStyle(obj,false)[attr]; } }
var icur = parseInt(getStyle(obj,attr)); 这句写在setInterval 里面 否则定时器不能每次获得新的属性值
因为传入的 attr = 'width' ,是带引号的,
即 obj.style.width === obj.style.['width'];
JS中 obj.style.attr 只能获取行内样式(内联样式),直接使用style.width需要将样式放在行内。而样式设定一般不使用行内样式。
要获取非行内样式要通过obj.currentStyle[attr]或者getComputedStyle(obj,false)[attr]方法获取,因此将获取非行内样式的方法封装为getStyle函数。
getStyle里面的if(obj,currentStyle),应该是用点号if(obj.currentStyle)
是回不去的原因
我把你的代码运行后没有出现你说的问题啊
已经解决 var icu=parseInt(getStyle(obj,'[attr]'));改为var icu=parseInt(getStyle(obj,attr));
同学 你的getStyle没有封装啊
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}
else{
return getComputedStyle(obj,false)[attr];
}
}
老师漏了个地方没讲,他为什么要把原本.attr改成
引用startMove函数时填上的参数是这样的
是不是都有引号,你想想加入写成obj.style.attr引用时是不是应该不加引号,但是不加引号又会导致和getStyle函数冲突,如图
所以要加引号,要把.attr变成[attr]。
有不明白的地方请继续提问
obj.style.width 只能获取行内的样式,封装的getStyle函数可以获取任意地方的样式
startMove(this,300);你的css原来样式为200px啊
1.obj.style.width = icur + speed + 'px';//这里只能获取宽度属性
改成:obj.style[attr]=icur + speed + 'px';
onmouseout写成onmouseover了。
已解决,最下面的宽没改成高.......