前端

jQuery下拉菜单和stop()方法

2022-03-08  本文已影响0人  马佳乐

当鼠标移入一级菜单时,下面对应的二级菜单会显示出来


mouseover:鼠标移入事件:事件在鼠标移动到选取的元素及其子元素上时触发。
mouseout: 鼠标离开事件


mouseenter: 鼠标移入事件:事件只在鼠标移动到选取的元素上时触发。
mouseleave:鼠标离开事件


如果有鼠标移入事件,请使用mouseenter,而不是mouseover。
鼠标离开事件使用mouseleave,就不要使用mouseout。

代码:

<!DOCTYPE html>
<html>

    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            
            ul {
                list-style: none;
            }
            
            .wrap {
                width: 330px;
                height: 30px;
                margin: 100px auto 0;
                padding-left: 10px;
                background-image: url(img/bg.jpg);
            }
            
            .wrap li {
                background-image: url(img/libg.jpg);
            }
            
            .wrap>ul>li {
                float: left;
                margin-right: 10px;
                position: relative;
            }
            
            .wrap a {
                display: block;
                height: 30px;
                width: 100px;
                text-decoration: none;
                color: #000;
                line-height: 30px;
                text-align: center;
            }
            
            .wrap li ul {
                position: absolute;
                top: 30px;
                display: none;
            }
        </style>
        <script src="js/jquery.js"></script>
        <script>
            $(function() {

                //mouseover:鼠标经过事件
                //mouseout:  鼠标离开事件

                //mouseenter: 鼠标进入事件
                //mouseleave:鼠标离开事件

                var $li = $(".wrap>ul>li");

                //给li注册鼠标经过事件,让自己的ul显示出来。mouseenter()方法也可以
                $li.mouseover(function() {
                    //找到所有的儿子,并且还得是ul
                    //谁触发了鼠标经过事件,那这个this就是谁,this还是一个DOM对象
                    //$(this).children("ul").show();
                    $(this).children("ul").slideDown(300);//带滑动效果
                  //$(this).children("ul").css("display","block");与上面方法等价
                });
                //给li注册鼠标离开事件,让自己的ul隐藏出来。mouseleave()方法也可以
                $li.mouseout(function() {
                    //$(this).children("ul").hide();
                    $(this).children("ul").slideUp(200);//带滑动效果
                    //$(this).children("ul").css("display","none");与上面方法等价
                });

            });
        </script>
    </head>

    <body>
        <div class="wrap">
            <ul>
                <li>
                    <a href="javascript:;">一级菜单1</a>
                    <ul class="ul">
                        <li>
                            <a href="javascript:;">二级菜单11</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单12</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单13</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="javascript:;">一级菜单2</a>
                    <ul>
                        <li>
                            <a href="javascript:;">二级菜单21</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单22</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单23</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="javascript:;">一级菜单3</a>
                    <ul>
                        <li>
                            <a href="javascript:;">二级菜单31</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单32</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单33</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>

    </body>

</html>

上述代码运行时,会出现一个问题:做滑入和滑出动画都需要时间,当你快速移动鼠标,上一动画还没做完,就会出现动画排队等待执行。出现鼠标移走后动画还在执行的现象。
这种现象为动画队列

解决这种现象,可使用 stop([stopAll,goToEnd]); 方法。它用于在动画或效果完成前对它们进行停止。

上述例子可对下面代码进行修改:

$(this).children("ul").stop(true,false).slideDown(300);
$(this).children("ul").stop(true,false).slideUp(200);

加了.stop(true,false)的意思是:当stop前面动画没执行完毕就触发stop后面的动画时,清除stop前的动画队列,不再执行该动画,立即执行stop后面的动画。

完整代码:

<!DOCTYPE html>
<html>

    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            
            ul {
                list-style: none;
            }
            
            .wrap {
                width: 330px;
                height: 30px;
                margin: 100px auto 0;
                padding-left: 10px;
                background-image: url(img/bg.jpg);
            }
            
            .wrap li {
                background-image: url(img/libg.jpg);
            }
            
            .wrap>ul>li {
                float: left;
                margin-right: 10px;
                position: relative;
            }
            
            .wrap a {
                display: block;
                height: 30px;
                width: 100px;
                text-decoration: none;
                color: #000;
                line-height: 30px;
                text-align: center;
            }
            
            .wrap li ul {
                position: absolute;
                top: 30px;
                display: none;
            }
        </style>
        <script src="js/jquery.js"></script>
        <script>
            $(function() {

                //mouseover:鼠标经过事件
                //mouseout:  鼠标离开事件

                //mouseenter: 鼠标进入事件
                //mouseleave:鼠标离开事件

                var $li = $(".wrap>ul>li");

                //给li注册鼠标经过事件,让自己的ul显示出来。mouseenter()方法也可以
                $li.mouseover(function() {
                    //找到所有的儿子,并且还得是ul
                    //谁触发了鼠标经过事件,那这个this就是谁,this还是一个DOM对象
                    //$(this).children("ul").show();
                    $(this).children("ul").stop(true,false).slideDown(300);//带滑动效果
                  //$(this).children("ul").css("display","block");与上面方法等价
                });
                //给li注册鼠标离开事件,让自己的ul隐藏出来。mouseleave()方法也可以
                $li.mouseout(function() {
                    //$(this).children("ul").hide();
                    $(this).children("ul").stop(true,false).slideUp(200);//带滑动效果
                    //$(this).children("ul").css("display","none");与上面方法等价
                });

            });
        </script>
    </head>

    <body>
        <div class="wrap">
            <ul>
                <li>
                    <a href="javascript:;">一级菜单1</a>
                    <ul class="ul">
                        <li>
                            <a href="javascript:;">二级菜单11</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单12</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单13</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="javascript:;">一级菜单2</a>
                    <ul>
                        <li>
                            <a href="javascript:;">二级菜单21</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单22</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单23</a>
                        </li>
                    </ul>
                </li>
                <li>
                    <a href="javascript:;">一级菜单3</a>
                    <ul>
                        <li>
                            <a href="javascript:;">二级菜单31</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单32</a>
                        </li>
                        <li>
                            <a href="javascript:;">二级菜单33</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>

    </body>

</html>
上一篇下一篇

猜你喜欢

热点阅读