zoukankan      html  css  js  c++  java
  • 界面组件--导航菜单

    首先把整个导航菜单放在一个DIV里,好定位它在页面的位置(也方便管理li的长度)。li用来设置各菜单项之间的距离,将a的display属性设置为block,使整个li都可以点击,然后设置padding留空白。这是自己看着书上的图片做的,下拉菜单因为改成绝对定位使父元素的长度变短,继承长度后也变短了,使内容换行,给下拉菜单li添加足够宽度后,暂时解决了这个问题。

    上面写的这个代码有很多冗长的地方,比如:

    .nav1 ul li:hover ul li ul{display:none;}
    .nav1 ul li ul li:hover ul{display:block; position:absolute; left:100%; top:0;12em;}

    书上的讲解如下:

    <nav class="multi_drop_menu">
        <ul>
            <li><a href="#">Power</a></li>
            <li><a href="#">Money</a></li>
            <li><a href="#">Love</a></li>
            <li><a href="#">Fame</a>
                <!--二级菜单-->
                <ul>
                <li><a href="#">Sports Star</a></li>
                <li><a href="#">Movie Star</a></li>
                <li><a href="#">Rock Star</a>
                    <!--三级菜单-->
                    <ul>
                    <li><a href="#">Bruce Springsteen</a></li>
                    <li><a href="#">Bono</a></li>
                    <li><a href="#">Mick Jagger</a></li>
                    <li><a href="#">Bob Dylan</a></li>
                    </ul>
                    <!--三级菜单介绍-->
                </li>
                <li><a href="#">Web Designer</a></li>
                </ul>
                <!--二级菜单结束-->
            </li>
        </ul>
    </nav>

    提倡把视觉样式与功能样式分开

    .multi_drop_menu a{
        display:block;  /*让链接充满列表项*/
        padding:.2em 1em;
        color:#555;
        background-color:#eee;
        border-width:3px;  /*作为列表项之间的分隔宽度*/
        border-color:transparent;
    }
    .multi_drop_menu a:hover{
        color:#fff;
        background-color:#aaa;
    }
    
    /*添加功能样式*/
    .multi_drop_menu ul{float:left;} /*强制ul包围li*/
    .multi_drop_menu li{
        float:left;
        list-style:none;
        position:relative; /*为子菜单提供定位上下文*/
    }
    .multi_drop_menu li a{
        display:block;
            border-right-style:solid; /*给每一个链接添加一个右边框*/
            /*背景只出现在内边距区域后面*/
            background-clip:padding-box;
            text-decoration:none;
    }
    
    .multi_drop_menu li;last-child a{boder-right-style:none;}
    .multi_drop_menu li ul{display:none;}/*临时隐藏低级菜单*/

    为了保证用户体验,所有视觉样式--内边距、背景、边框,等等,都要应用给链接a,而不要应用给ul或li,以便热区(可点击区域)最大化,让用户鼠标经过时不会产生鼠标状态切换。为达到这个目的,同时还要从视觉上分隔链接,这里使用了background-clip:padding-box声明,这样就可以阻止链接的背景延伸到边框后面。然后,让边框透明,在链接之间产生间隙,让后面的页面能够透过边框被看到。如此一来,不用外边距也能分隔链接,而且鼠标从一个菜单项移动到另一个菜单项时,也不会出现光标切换,菜单项之间从视觉上是分开,但实际上却是紧紧挨在一块的。

    .multi_drop_menu li ul{width:9em;}
    .multi_drop_menu li li a{
        border-right-style:none;/*去掉继承的右边框*/
        border-top-style:solid;/*添加上边框*/
    }
    .multi_drop_menu li ul{
        display:none;
        position:absolute;
        left:0;
        top:100%;
    }
    .multi_drop_menu li li{
        float:none;  /*停止浮动,恢复堆叠,由于ul宽度为9em,这里不设置,它们也是堆叠的*/
    }
    .multi_drop_menu li li ul{display:none;}

    顶边会与父元素底边恰好对齐。它与父元素之间的间隙,实际上是下拉菜单中第一个链接的边框

    .multi_drop_menu li:hover>ul{display:block;}
    .multi_drop_menu li li ul{
        position:absolute;
        left:100%;
        top:0;
    }
    
    .multi_drop_menu li:hover>a{
        color:#fff;
        background-color:#aaa;
    }

    上面第二行的意思是:当鼠标移动到列表项上时,就显示它的子列表。这里的:hover触发器是设定在li元素而非链接自身上的。这样做是因为我们想要显示li的子元素ul,而它不是想链接的子元素。此外,为了只显示其子元素,悬停列表项与子列表之间还有一个字选择符>,如果没有这个子选择符,当顶级菜单项处于悬停状态时,会同时显示二级和三级菜单

    最后一行的效果:

    :hover事件会沿着元素的结构层次“向上冒泡”。所以,把:hover设定在li元素,就相当于也把它设定给了所有祖先li元素。然后,只要再给其子元素(链接)设定样式即可。这个改进能够极大地提高菜单的易用性。

    代码重用

    <nav class="multi_drop_menu vertical">
    
    .multi_drop_menu.vertical{width:8em;}
    .multi_drop_menu.vertical li a{
        border-right-style:none;
        border-top-style:solid;  
    }
    .multi_drop_menu.vertical li li a{border-left-style:solid;}
    .multi_drop_menu.vertical ul,
    .multi_drop_menu.vertical li{
        float:none;
    }
    .multi_drop_menu.vertical li ul{
        left:100%;
       top:0;
    }

    为侧栏设置垂直菜单

    只在导航容器有vertical类的情况下才起作用

    这里为nav容器设定了宽度。如果不设定导航容器宽度,那么nav及其包含的顶级菜单项都会尽可能延伸。最后,我们把二级菜单与顶级菜单的位置关系,设定成了前面三级菜单和二级菜单之间的关系,即让子菜单顶边与父菜单项顶边对齐。还去掉了顶级菜单项的右边框,代之以上边框

  • 相关阅读:
    Linux常用解压文件
    微信开放平台 获取 component_verify_ticket
    mysql root密码重置
    编译安装LNMP
    JS生成二维码
    CURL采集
    JS拖动浮动DIV
    JS拖动DIV布局
    Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
    zepto.js 源码注释备份
  • 原文地址:https://www.cnblogs.com/919czzl/p/4852055.html
Copyright © 2011-2022 走看看