为了账号安全,请及时绑定邮箱和手机立即绑定

请看一下我的代码,鼠标只有滑过文字再撤回才能实现效果,滑过别的区域就不行?xiexie

<<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

<title>0914-4小图标旋转</title>

<style type="text/css">

#move{

margin: 10px auto;

padding: 0;

border:1px solid #ccc;

}

#move a{

display: inline-block;

width: 58px;

height: 30px;

border:1px solid #ddd;

border-radius: 3px;

background-color: #fff;

text-align: center;

margin: 10px 17px;

position: relative;

padding-top: 40px;

color: #000;

font-size: 12px;

text-decoration: none;

line-height: 25px;

overflow: hidden;

}

#move a i{

position: absolute;

top: 20px;

left: 0;

display: inline-block;

width: 100%;

text-align: center;

filter: alpha(opacity:100);

opacity: 1;

}

#move a:hover{

color: #f00;

}

#move img{

border:none;

}

</style>

<script src="js/0914-4.js"></script>

<script>

window.onload=function(){

var oMove=document.getElementById("move");

var aList=oMove.getElementsByTagName("a");

for(var i=0;i<aList.length;i++){

aList[i].onmouseover=function(){

var _this=this.getElementsByTagName("i")[0];

startMove(_this,{top:-25,opacity:0},function(){

_this.style.top=30+"px";

startMove(_this,{top:20,opacity:100});

});

}

}

}

</script>

</head>

<body>

<div id="move">

<a href="#"><i><img src="images/caipiao.jpg"></i><p>彩票</p></a>

<a href="#"><i><img src="images/dianying.jpg"></i><p>电影</p></a>

<a href="#"><i><img src="images/yinyue.jpg"></i><p>音乐</p></a>

<a href="#"><i><img src="images/jiaofei.jpg"></i><p>缴费</p></a>

<a href="#"><i><img src="images/licai.jpg"></i><p>理财</p></a>

<a href="#"><i><img src="images/waimai.jpg"></i><p>外卖</p></a>

</div>

</body>

</html>


function getStyle(obj,attr){

//IE

if(obj.currentStyle){

return obj.currentStyle[attr];

}

//火狐 chrome

else{

return getComputedStyle(obj,false)[attr];

}

}

//var json={attr1:target1,attr2:target2}

//startMove(obj,{attr1:iTarget1,attr2:iTarget2},fn)

function startMove(obj,json,fn){

var flag=true;//默认都到达目标

clearInterval(obj.timer);

obj.timer=setInterval(function(){

for(var attr in json){

//1.取当前值

var icur=0;

//如果属性为透明度,四舍五入(透明度值转换为小数*100)

if (attr=="opacity") {

icur=Math.round(parseFloat(getStyle(obj,attr))*100);

}

else{

icur=parseInt(getStyle(obj,attr));

}

//2.算速度

var speed=(json[attr]-icur)/5;

speed=speed>0?Math.ceil(speed):Math.floor(speed);

//3.检测停止

if (icur!=json[attr]){

flag=false;//当前值没有达到目标值,标签为假

}

if (attr=="opacity") {

obj.style.filter="alpha(opacity:"+icur+speed+")";//IE

obj.style.opacity=(icur+speed)/100;//火狐  chrome

}

else{

obj.style[attr]=icur+speed+"px";

}

}

if(flag){

clearInterval(obj.timer);

if(fn){

fn();

}

}

},30)

}


正在回答

1 回答

你目前的代码,下面第1行里只执行了top位移 和 透明属性变0,后面的函数没有执行。

///////////////////////////////////////////////////////////

startMove(_this,{top:-25,opacity:0},function(){   //1行

_this.style.top=30+"px";                                    //2行

startMove(_this,{top:20,opacity:100});               //3行

});                   

原因是startMove封装程序里出了问题。

跟第1行后面的函数程序有关的是

  if(flag){                                                            //4行

      clearInterval(obj.timer);                                //5行

        if(fn){                                                        //6行

                   fn();                                                //7行

               }                                                         //8行

        }                                                                //9行

//////////////////////////////////////////////////////////////

第4行内的if语句内的flag,它的布尔值永远都是false,所以下面第6行的函数无法起到作用,与其相连的第1行函数无法执行。

那为什么flag为什么永远是false呢?我们一线索连着一个线索找。

下面是startMove函数

一开始11行的  flag为「true」

到了28行由于没有达到目标值,flag变为「false」.

到了39行由于flag为「false」,计时器无法清除,计时器将继续循环,回到了13行继续。

这时你会发现flag 还是「false」

由于在计时器中缺少 让flag变成「true」的设置。

计时器中flag无限false,使得41行永远无法执行。

如何解决? 答案在最后

////////////////////////////////////////////////////////////

function startMove(obj,json,fn){                            //10行

var flag=true;//默认都到达目标                               //11行

clearInterval(obj.timer);                                        //12行

obj.timer=setInterval(function(){                           //13行    计时器

for(var attr in json){                                               //14行

//1.取当前值

var icur=0;

//如果属性为透明度,四舍五入(透明度值转换为小数*100)

if (attr=="opacity") {

icur=Math.round(parseFloat(getStyle(obj,attr))*100);

}

else{

icur=parseInt(getStyle(obj,attr));

}

//2.算速度

var speed=(json[attr]-icur)/5;

speed=speed>0?Math.ceil(speed):Math.floor(speed);

//3.检测停止                                                                        //27行

if (icur!=json[attr]){                                                               //28行

flag=false;//当前值没有达到目标值,标签为假                            //29行

}

if (attr=="opacity") {

obj.style.filter="alpha(opacity:"+icur+speed+")";//IE

obj.style.opacity=(icur+speed)/100;//火狐  chrome

}

else{

obj.style[attr]=icur+speed+"px";

}

}

if(flag){                                                                                //39行

clearInterval(obj.timer);

if(fn){                                                                                   //41行

fn();

}

}

},30)

}


//////////////////////////////////////////////////////////////////////////////              

                   

将11行里的     var flag=true; 

请放到计时器13行的下一行里就行了。

3 回复 有任何疑惑可以回复我~
#1

雪梨儿 提问者

对啦!谢谢大神!虽然前面的解释还有点没看懂,再慢慢看看~
2016-09-16 回复 有任何疑惑可以回复我~
#2

qq_行到水穷处坐看云起时_03923263

大神真棒啊
2016-09-28 回复 有任何疑惑可以回复我~
#3

qq_空之岚_0

茅塞顿开学上一节时就注意到这个问题了
2016-12-14 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

请看一下我的代码,鼠标只有滑过文字再撤回才能实现效果,滑过别的区域就不行?xiexie

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信