原生js实现[2] 延时提示框

27499891022_164d330d95_z.jpg

打开QQ,把鼠标放在你的头像上不动,会弹出你一个框展示你的个人信息,这个框就是延时提示框,它不像:hover,鼠标离开后立即消失,而是在短暂的延迟后才消失,这个看似简单的小效果,在实际中用的非常多,而且其中的一些小细节也是值得揣摩的。

实现效果

谁能教我去掉水印>_<

原理分析

  1. 用display属性控制div的显隐。
  2. 用setTimeout()来控制延迟。

代码分析

<style>
    div{ float: left; margin-left: 20px; }
    #div1{ width: 50px; height: 50px; background: red; }
    #div2{ width: 250px; height: 180px; background: #CCC; }
</style>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
</body>

最简单的控制div显隐。

window.onload = function (){
    var oDiv1 = document.getElementById('div1');
    var oDiv2 = document.getElementById('div2');

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        oDiv2.style.display = "none";
    };
};

但是这样有个问题,鼠标一移出div1,div2就消失了,鼠标永远也到不了div2上,为了解决这个问题,我们给鼠标移出加上定时器。

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };

现在因为有延迟的存在,鼠标可以移到div2上了,但是延迟一过,div2还是得消失,所以我们得给div2加上鼠标移入事件:鼠标移入div2时,display = "block"。

    oDiv2.onmouseover = function (){
        oDiv2.style.display = "block";
    };

打开浏览器试试,发现还是不行,延迟一过,div2还是消失了,怎么回事?因为setTimeout()就像一个定时炸弹一样,时间一到,该消失还是得消失,所以我们必须得在鼠标移入时关闭定时器,通常我们会声明一个timer用来存放定时器。

window.onload = function (){
    var oDiv1 = document.getElementById("div1");
    var oDiv2 = document.getElementById("div2");

    var timer = null;

    oDiv1.onmouseover = function (){
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 500);
    };
    oDiv2.onmouseover = function(){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
};

这下总行了吧?其实有经验的同学应该能看出来,这样鼠标确实能移入div2了,但是从div2移出后div2并不会消失,因为没有移出事件,移出时应该把div2的display改为none,并且也应该加上定时器,同时,根据以往的经验,移出时加了定时器,在移入是应该关闭定时器,要不然鼠标回到div1时div2又消失了,而实际的效果应该是不论鼠标在div1上还是在div2上,div2都应该显示的,所以我们可以在每次鼠标移入div1时都先关闭定时器。

    var timer=null;
    
    oDiv1.onmouseover = function (){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
    oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };
    oDiv2.onmouseover = function (){
        oDiv2.style.display = "block";
        clearTimeout(timer);
    };
    oDiv2.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };

至此,我们的延时提示框已经完成了,没有bug。但是!我们仔细看看代码,有没有发现好像两个div的移入事件一样,移出事件也一样啊。伟大的党曾教导我们,代码能简化的要简化,写出的代码要优雅。so,我们简化合并一下。

window.onload = function (){
    var oDiv1 = document.getElementById("div1");
    var oDiv2 = document.getElementById("div2");

    var timer = null;
    
    oDiv2.onmouseover = oDiv1.onmouseover = function (){
        clearTimeout(timer);
        oDiv2.style.display = "block";
    };
    oDiv2.onmouseout = oDiv1.onmouseout = function (){
        timer = setTimeout(function (){
            oDiv2.style.display = "none";
        }, 800);
    };
};

分析总结

  1. js中是可以用连等的,能用就用,代码将简化不少。

  2. 一开始总会想当然地把程序想简单,可是一测试才知道少这少那,这是大家年轻时候的通病。也许是经历的多了,那些老师们、大神们无论面对看起来多么简单的问题都会严谨的分析,一丝不苟,这种态度,让我惭愧的同时,也让我感受到了一点作为程序员的情怀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • jQuery基础 什么是JQ?一个优秀的JS库,大型开发必备JQ的好处?一简化JS的复杂操作二不再需要关心兼容性三...
    幺七阅读 4,487评论 0 2
  • 一)jQuery九类选择器【参见jQueryAPI.chm手册】 目的:通过九类选择器,能定位web页面(HTML...
    奋斗的老王阅读 4,631评论 0 51
  • 焦点事件焦点事件会在页面元素获得或失去焦点时触发。确定浏览器是否支持该类事件! var isSu...
    Miss____Du阅读 11,625评论 1 10
  • 本文以div元素布局为例。教程开始:首先要知道,div是块级元素(div与span),在页面中独占一行,自上而下排...
    TW妖妖阅读 2,953评论 0 1
  • 春天呵! 你的来临, 唤醒沉睡的大地, 点缀新生的绿草, 招展舞动的花蕾。 燕的使者, 请告诉我, 等你离去, 我...
    尧嘉阅读 1,675评论 0 0

友情链接更多精彩内容