javascript - mouseenter与mouseleave的多次执行加锁问题,以及定时器的异步执行问题。
ringa_lee
ringa_lee 2017-04-11 10:25:11
[JavaScript讨论组]
1.代码最终想实现的效果是,mouseenter蓝色外圈围绕灰色内圆旋转一圈,mouseleave蓝色外圈围绕灰色内圆退回一圈。



2.css全部代码

 #fancyClock{margin:40px auto;}
.clock{background-color:#fff;height:200px;width:200px;position:relative;overflow:hidden;
    float:left;}
.clock .rotate{position:absolute;width:200px;height:200px;top:0;left:0;}
.rotate.right{display: none;transition: all 0.05s;z-index: 11;}
.clock .bg,
.clock .front{width:100px;height:200px;background-color:#fff;position:absolute;
    top:0;}
.clock .display{position:absolute;width:164px;height: 164px;border-radius: 50%;
    z-index:20;color:#fff;background-color: #e7e2dd;font-size:60px;
    text-align:center;top:18px;left:18px;}
.rotatex{transition: all 0.05s;z-index: 9;}

/* 左半边部分*/
.clock .bg.left{left:0;}
.green .bg.left{background:url(images/rotate.png) no-repeat left top;}
/* 右边部分*/
.clock .bg.right{left:100px;}
.green .bg.right{background:url(images/rotate.png) no-repeat right top;}
.clock .front.left{left:0;z-index:10;//遮罩层}

3.html代码部分

<p id="fancyClock">
    <p class="green clock">
        <p class="display" id="seconds">00</p>    <!-- 最表面展现的那层 -->
        <p class="front left" id="zhezao"></p>    <!-- 用于遮盖左半部分超出的 -->
        <p class="rotate rotatex left" id="RotateLeft">  <!-- 左半部分的旋转 -->
            <p class="bg left"></p>
        </p>
        <p class="rotate rotatey right" id="RotateRight"><!-- 右半部分的旋转,不旋转则为隐藏-->
            <p class="bg right"></p>
        </p>
    </p>
</p>

4.jquery代码部分

var change = true;
    
    $("#seconds").mouseenter(function(){
        if(change){
            change = false;

            var degree = 20;     //默认每次旋转20°
            var timer1 = setInterval(function(){
                change = false;
                
                $(".rotatex").css({
                    WebkitTransform: 'rotate(' + degree + 'deg)'      //隔50毫秒顺时针旋转20°
                })
                degree += 20;
                if (degree > 180) {                 
                    clearInterval(timer1);      //当>180° 的时候左半部分清除动画,不执行,并开始执行右半部分
                    timer1 = null;
                    degree = 20;
                    var timer2 = setInterval(function(){

                        $("#RotateRight").show();          //右半部分先显示
                        $(".rotatey").css({
                            WebkitTransform: 'rotate(' + degree + 'deg)'    //隔50毫秒旋转20°
                        })
                        degree+= 20;
                        if (degree > 180) {       //当>180° 的时候右半部分清除动画,不执行
                            degree = 180;
                            clearInterval(timer2);
                            timer2 = null;
                        }else{return;}
                    },50);
                }else{return;}
            },50);
        }
        change = true;
    });

    $("#seconds").mouseleave(function(){
        console.log(change);
        if(change){
            change = false;
            var degree = 180;
            
            var timer2 = setInterval(function(){
                change = false;
                degree -= 20;
                console.log(degree);
                
                $(".rotatey").css({
                    WebkitTransform: 'rotate('+ degree+'deg)'       //逆时针旋转20°,直到0°
                })
                if(degree <= 0){
                    clearInterval(timer2);
                    $("#RotateRight").hide();       //右半部分清除定时器,不执行并隐藏

                    degree = 180;
                    var timer1 = setInterval(function(){
                        change = false;
                        
                        degree -= 20;    
                        $(".rotatex").css({
                            WebkitTransform: 'rotate('+ degree+'deg)'    //逆时针旋转20° 直到0°
                        })
                        if(degree <= 0){
                            clearInterval(timer1);           //左半部分清除定时器,不执行
                        }else{return;}    
                    },50);
                }else{return;}
            },50);
        }
        change = true;
    });

 5.遇到的问题
    
    关键点 全局变量 change的true和false;
    mouseenter执行之后,移开mouseleave,多次实验结果发现,
    大多时候change为false,有时为true,不明所以;

ringa_lee
ringa_lee

ringa_lee

全部回复(1)
巴扎黑

应该是你用较短的时间移入,移出造成的,定时器的运行是异步的,是需要时间

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号