原生js应用setTimeout实现下拉菜单

今天实现一个很简单的下拉菜单的小实例,也就是鼠标移入菜单,它的子菜单出现并延迟消失。大概效果如下图:

来看下布局:

<div class="menu" id="menu">主菜单</div>
<ul class="mList" id="mList">
    <li>下拉菜单一</li>
    <li>下拉菜单二</li>
    <li>下拉菜单三</li>
    <li>下拉菜单四</li>
</ul>

关于css代码:

<style>
    ul,li{list-style: none;margin: 0;padding:0;}
    a{text-decoration: none}
    .menu{padding:0 10px;border-radius:5px;background-color:#1E9FFF;color:#fff;width:100px;height:35px;line-height:35px;text-align: center;float:left;margin-right:10px;}
    .mList {overflow: hidden;position:absolute;top:50px;border:1px solid #e5e5e5;border-radius: 5px;background-color: #c6d4ff; display:none;}
    .mList li{float:left;padding:0 10px;margin:5px 0;border-right:1px solid #e5e5e5;}
    .mList li:last-child{border-right:none;}
</style>

js如下:

<script>
    window.onload=function(){
        var oMenu=document.getElementById("menu");
        var omList=document.getElementById("mList");
        var timer=null;
        oMenu.onmouseover=function(){
            show();
        };
        oMenu.onmouseout=function(){
           hide();

        };
        omList.onmouseover=function(){
            show();
        };
        omList.onmouseout=function(){
            hide();
        };
        //代码合并
        function show(){
            clearInterval(timer);//鼠标移入时,先要清除掉定时器
            omList.style.display="block"
        }
        function hide(){//鼠标移出时要让子菜单缓缓(先显示1秒)的消失
            timer=setTimeout(function(){
                omList.style.display="none"
            },1000);
        }
    }
</script>

以上例子总结一下三点:

1、首先看布局,主菜单div没有包含子菜单,这样的话不同于被包含的关系,扩展性应该会强一些;

2、鼠标移出事件开启时,并没有让子菜单立刻消失,而是先显示了1秒,方便鼠标移入子菜单;

3、鼠标移入主菜单时,一定要先清除定时器,否则显示效果会受到影响。

好了,就是这样了,不过这是单个菜单的若是多个的话应该也是可以扩展的,大家可以试试看!

posted @ 2017-12-19 21:24  麦兜家园  阅读(312)  评论(0编辑  收藏  举报