• 带下拉子菜单的导航菜单



    下拉菜单在一些企业网站应用尤为广泛,它存在使用方便,占用空间小等特点。之前纵向导航教程中已使用过二级导航,今天制作下横向导航菜单的二级菜单,方法和纵向一样,只不过由纵向改变为横向而已,下面我们以上一章第二节用图片美化的横向导航中的实例进行修改。

    先在html代码增加二级菜单的代码:

    <div id="menu">
    <ul>
    <li><a id="current" href="#">首页</a></li>
    <li><a href="#">网页版式</a>
    <ul>
    <li><a href="#">自适应宽度</a></li>
    <li><a href="#">固定宽度</a></li>
    </ul>
    </li>
    <li><a href="#">web教程</a>
    <ul>
    <li><a href="#">新手入门</a></li>
    <li><a href="#">视频教程</a></li>
    <li><a href="#">常见问题</a></li>
    </ul>
    </li>
    <li><a href="#">web实例</a></li>
    <li><a href="#">常用代码</a></li>
    </ul>
    </div>

    增加完代码后,在浏览器里预览一下:

    是不是一看头都大了,怎么变成这样了。别懵,我们分析一下错乱的原因。首先我们看下“自适应宽度”和“固定宽度”两个二级菜单也继承了一级菜单的背景和横向排列,所以我们先把二级菜单的背景和浮动清除掉,增加以下css代码:

    #menu ul li ul li { float:none;}
    #menu ul li ul li a { background:none;}

    现在预览看下,二级菜单是不是已经归位了,但鼠标划过时还继承了一级菜单的样式,所以也改为最终效果上的黑色背景白色文字,还有下拉菜单的灰色边框和灰色背景也一并加上,修改并增加如下代码:

    #menu ul li ul { border:1px solid #ccc;}
    #menu ul li ul li { float:none; 85px; background:#eee; margin:0;}
    #menu ul li ul li a { background:none;}
    #menu ul li ul li a:hover { background:#333; color:#fff;}

    第一行设置二级菜单的灰色边框;为了美观,我们把下拉菜单的宽度设置成和一级菜单宽度相同,第二行的85px再加上第一行上设置的边框左右各1px后正好是87px,和一级菜单宽度相同。margin:0是为了清除掉继承一级菜单中margin-left:2px;最后一行设置鼠标划过时的样式。

    再预览一下,是不是基本的样式已实现了。

    下一步就该把二级菜单隐藏,当鼠标划过时显示出来了。增加如下代码:

    #menu ul li ul { display:none; border:1px solid #ccc;}
    #menu ul li:hover ul { display:block;}

    注意第二行的写法,#menu ul li:hover ul这个样比较难理解,它的意思是定义当鼠标划过#menu下ul下li时,li下的ul的样式(有点饶舌),这里设置为display:block,意思是鼠标划过时显示这块内容。开始隐藏,鼠标划过时显示, 这就实现了我们想要的效果。目前IE6只支持a的伪类,其它标签的伪类不支持,所以要想在IE6下也显示正确,需要借助js来实现。我们定义一个类.sfhover(自己命名,需和JS中相同)的属性为display:block;然后当鼠标划过后,用JS给当前li添加上这个样式上,根据css的优先级:指定的高于继承的原则,就实现了IE6下的正确显示。所以增加如下代码:

    #menu ul li.sfhover ul { display:block;}

    认真跟着教程制作的朋友可能已经发现,现在应用的JS和纵向导航时应用的不样,但最终实现的效果是一样的。同理css在布局网站时,也是可以多种方法的,正所谓条条大道通罗马,希望大家举一反三,加深前面教程的掌握。JS部分本例不做讲解,如果你想弄清楚JS是如何实现的,请学习js相关内容。到这里,本例就基本完成了,还有一个问题是当前导航下有内容的话,如果二级菜单显示,将会把下边的内容挤跑,所以需要给#menu ul li ul增加position:absolute;属性,当其绝对定位后,它将脱离原来文档流,不再占据空间,因此也不会再把下边内容挤跑了(欲更多了解绝对定位,请查看之前教程或http://www.aa25.cn/div_css/899.shtml)。完整的预览代码如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <script type=text/javascript><!--//--><![CDATA[//><!--
    function menuFix() {
    var sfEls = document.getElementById("menu").getElementsByTagName("li");
    for (var i=0; i<sfEls.length; i++) {
    sfEls[i].onmouseover=function() {
    this.className+=(this.className.length>0? " ": "") + "sfhover";
    }
    sfEls[i].onMouseDown=function() {
    this.className+=(this.className.length>0? " ": "") + "sfhover";
    }
    sfEls[i].onMouseUp=function() {
    this.className+=(this.className.length>0? " ": "") + "sfhover";
    }
    sfEls[i].onmouseout=function() {
    this.className=this.className.replace(new RegExp("( ?|^)sfhover\b"),
    "");
    }
    }
    }
    window.onload=menuFix;
    //--><!]]></script>
    <style type="text/css">
    body { font-family: Verdana; font-size: 12px; line-height: 1.5; }
    a { color: #000; text-decoration: none; }
    a:hover { color: #F00; }
    #menu { 500px; height:28px; margin:0 auto; border-bottom:3px solid #E10001;}
    #menu ul { list-style: none; margin: 0px; padding: 0px; }
    #menu ul li { float:left; margin-left:2px;}
    #menu ul li a { display:block; 87px; height:28px; line-height:28px; text-align:center; background:url(images/2010-06/27/nav_bg2.gif) 0 0 no-repeat; font-size:14px;}
    #menu ul li a:hover { background:url(images/2010-06/27/nav_bg3.gif) 0 0 no-repeat;}
    #menu ul li a#current { background:url(images/2010-06/27/nav_bg1.gif) 0 0 no-repeat; font-weight:bold; color:#fff;}
    #menu ul li ul { border:1px solid #ccc; display:none; position:absolute;}
    #menu ul li ul li { float:none; 87px; background:#eee; margin:0;}
    #menu ul li ul li a { background:none;}
    #menu ul li ul li a:hover { background:#333; color:#fff;}
    #menu ul li:hover ul { display:block;}
    #menu ul li.sfhover ul { display:block;}
    </style>
    </head>
    <body>
    <div id="menu">
    <ul>
    <li><a id="current" href="#">首页</a></li>
    <li><a href="#">网页版式</a>
    <ul>
    <li><a href="#">自适应宽度</a></li>
    <li><a href="#">固定宽度</a></li>
    </ul>
    </li>
    <li><a href="#">web教程</a>
    <ul>
    <li><a href="#">新手入门</a></li>
    <li><a href="#">视频教程</a></li>
    <li><a href="#">常见问题</a></li>
    </ul>
    </li>
    <li><a href="#">web实例</a></li>
    <li><a href="#">常用代码</a></li>
    </ul>
    </div>
    </body>
    </html>

  • 相关阅读:
    2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
    P1880 [NOI1995]石子合并【区间dp】
    P1280 尼克的任务
    P1041 传染病控制【暴搜】
    Heavy Transportation POJ
    【空间】C++内存管理
    【编译器】G++常用命令
    【NOIP2011】【Luogu1003】铺地毯
    【Luogu1739】表达式括号匹配
    【Luogu1160】队列安排
  • 原文地址:https://www.cnblogs.com/ouyangping/p/6417415.html
Copyright © 2020-2023  润新知