小咸儿最近在学习jQuery,对于jQuery的使用还需要在小demo中成长,今天小咸儿实践了一个菜单效果的示例:

首先来看一下在HTML中的该如何设置出这些需要的控件,

代码:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>JQuery实战3:菜单效果</title>
    <meta charset="utf-8" />
    <!--<link href="css/menu.css" rel="stylesheet" type="text/css"/>-->
    <link href="css/menu.css" rel="stylesheet" />
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/menu.js"></script>
</head>
<body>
    <ul>
        <li class="main">
            <a href="#">菜单项1</a>
            <ul>
                <li><a href="#">子菜单项11</a></li>
                <li><a href="#">子菜单项12</a></li>
            </ul>
        </li>
        <li class="main">
            <a href="#">
                菜单项2
            </a>
                <ul>
                    <li><a href="#">子菜单项21</a></li>
                    <li><a href="#">子菜单项22</a></li>
                </ul>
        </li>
        <li class="main">
            <a href="#">
                菜单项3
            </a>
                <ul>
                    <li><a href="#">子菜单项31</a></li>
                    <li><a href="#">子菜单项32</a></li>
                </ul>
        </li>       
    </ul>
    <br />
    <br />
    <ul>
        <li class="hmain">
            <a href="#">菜单项1</a>
            <ul>
                <li><a href="#">子菜单项11</a></li>
                <li><a href="#">子菜单项12</a></li>
            </ul>
        </li>
        <li class="hmain">
            <a href="#">
                菜单项2
            </a>
            <ul>
                <li><a href="#">子菜单项21</a></li>
                <li><a href="#">子菜单项22</a></li>
            </ul>
        </li>
        <li class="hmain">
            <a href="#">
                菜单项3
            </a>
            <ul>
                <li><a href="#">子菜单项31</a></li>
                <li><a href="#">子菜单项32</a></li>
            </ul>
        </li>
    </ul>   
</body>
</html>

详解:
    1.页面中的菜单项可以通过嵌套的ul和li来表示。

    2.菜单最外层为ul,一层每个主菜单放在一个li中,如果有子菜单,在这个主菜单的li中建立新的ul,再一次嵌套即可构建多层的菜单。

    3.浏览器中的ul和li元素默认情况下文字前都有圆点标识符,li元素会有缩进。Opera浏览器比较特殊,li的标识符和其他浏览器不同。

    4.list-style属性值为none时,可以清除ul和li前面的小圆点。

说到list-style属性值,接下来先把CSS样式表中代码显示出来,修正一下菜单的样式,

代码:

ul,li {
    /*清楚ul和li上的小圆点*/
    list-style:none;
}
ul {
    /*清楚缩进值*/
    padding:0;
    margin:0;
}
.main, .hmain {
    background-image: url('../image/title.gif');
    background-repeat: repeat-x;
    width: 120px;
}
li {
    background-color:#EEEEEE;
}
a {
    /*取消所有下划线*/
    text-decoration:none;
    padding-left:20px;
    display:inline-block;
    width:100px;
    padding-top:3px;
    padding-bottom:3px;
}
.main ul,.hmain ul {
    display:none;
}
.main a, .hmain a {
    color: white;
    background-image: url('../image/collapsed.gif');
    background-repeat: no-repeat;
    background-position: 3px center;
}
.main li a,.hmain li a {
    color:black;
    background-image:none;
}

.hmain {
    float:left;
    margin-right:1px;
}

详解:
    1.清除子菜单的缩进值,需要padding和margin都为0,其中IE6和IE7只有margin也为0的时候才可以清除缩进值。(小咸儿觉得现在使用IE6与IE7浏览器的应该很少了吧!!!)

    2.可以使用background-image来指定一个元素的背景图,如果背景图比元素的实际大小要小,那么背景图会自动在横向和纵向上重复显示,直到填满整个区域。

    3.可以使用background-repeat来控制背景图的重复填充方式。

    4.如果一个元素上同时定义了背景图和背景色,那么有背景图的地方是不会显示背景色的。

    5.text-decoration属性值为none时,可以取消文字上的下划线。

    6.background-position可以控制背景图的位置,属性值既可以用数值,也可以用center,left,top这些值来控制横向和纵向的位置。这个属性的两个值,第一个对应横向,第二个对应纵向。

说完这些,小咸儿就要来说说重头戏了,JS文件怎么写,如何设计才能显示出菜单的横向显示和纵向显示,

代码:

$(document).ready(function () {
    //页面中的DOM已经装载完成时,执行的代码
    $(".main > a ").click(function () {
        var ulNode = $(this).next("ul");
        //ulNode.toggle();
        ulNode.slideToggle();
        changeIcon($(this));
    });
    //横向第一种实现方法(未完善)
    //$(".hmain > a ").hover(function () {
    //    $(this).next("ul").slideDown();
    //}, function () {
    //    var ulNode = $(this).next("ul");
    //    var timeoutId = setTimeout(function () {
    //        ulNode.slideUp();
    //    }, 300);
    //    ulNode.hover(function () {
    //        clearTimeout(timeoutId);
    //    }, function () {
    //        $(this).slideUp();
    //    });
    //});
    //第二种,简化
    $(".hmain").hover(function () {
        $(this).children("ul").slideDown();
        changeIcon($(this).children("a"));
    }, function () {
        $(this).children("ul").slideUp();
        changeIcon($(this).children("a"));
    });
});

/*修改主菜单的指示图标*/
function changeIcon(mainNode) {
    if (mainNode) {
        if (mainNode.css("background-image").indexOf("collapsed.gif")>=0) {
            mainNode.css("background-image", "url('image/expanded.gif')");
        } else {
            mainNode.css("background-image", "url('image/collapsed.gif')");
        }
    }
}

详解:
    1、.main a 和.main > a 的不同之处,前者选择使用了.main的这个class的元素内部所有的a节点,后者只选择了.main的子节点中的a节点。

    2、show,hide方法可以用于显示或隐藏元素,没有参数时的效果和修改CSS的display属性效果一样。参数可以是单位为毫秒的数字,或者是‘slow’,‘normal’,‘fast’这三个文字,都可以来控制完成显示和隐藏需要的时间。

注意:这时动画效果是靠不断改变元素的宽度和高度来实现的。

    小咸儿说了这么多,重要的是来看看成果图吧!

jquery左侧多级菜单 jquery 菜单_菜单项