How to make a menu have submenus in pure CSS

前端 未结 3 1005
孤独总比滥情好
孤独总比滥情好 2021-01-03 16:51

I want to know if i can get the ul class productnav to dissappear until the mouse hovers over the product button? Also, I want the productnav ul to go off to the side like a

相关标签:
3条回答
  • 2021-01-03 17:12

    Steve Gibson wrote up an example on how to do css menus. He uses unordered lists.

    GRC's Script-Free Pure-CSS Menuing System

     /*==============================================================================
    
        GRC multi-level script-free pure-CSS menuing system stylesheet.
       This code is hereby placed into the public domain by its author
       Steve Gibson. It may be freely used for any purpose whatsoever.
    
        Computed Geometries:    with a default 12px font, 1.0em == 12px and
        1px == 0.08333em.
        Thus, our 98px wide Freeware & Research buttons are 8.166666em wide.
    
    ==============================================================================*/
    
    /*====== GLOBAL OVERRIDES FOR MAJOR ITEMS AND DIFFERING BROWSER DEFAULTS =====*/
    
    body { color:#009; background:#fff; font-family: verdana, tahoma, arial, helvetica, sans-serif, MS Sans Serif; }
    body, table, img, button, iframe, ul, li  { margin:0; padding:0; border:0; }
    table { text-align:left; }
    iframe { width:0; height:0 }
    
    ul { margin-left:20px; }       /* kill default 50px left padding and set 20px */
    li { margin-bottom:1em; }          /* set default inter-item vertical spacing */
    .tightlist li { margin-bottom:0.25em; }     /* tighter list for simple bullets */
    
    
    /* our default page-width div */
    .pagecontainer { width:85%; text-align:left; font-size:10pt;}
    
    
     /*================= STYLES FOR THE GRC MASTHEAD & CONTROLS ==================*/
    
    .menuminwidth0 {             /* for all browsers (non-IE) that obey min-width */
        position:relative;
        border:0;
        margin:0;
        padding:0;
        width:100%;
        height:55px;/* 36px masthead height + 18px button height + 1px lower border*/
        min-width:560px;
    }
    
    /* suppress our whole menu when not an interactive mode (when printing, etc.) */
    @media print, projection { .menuminwidth0 { d\isplay:none; } }
    
    * html .menuminwidth1 { /* this allows IE5/6 to simulate min-width capability */
        position:relative;  /* we can simulate a minimum width by creating a large */
        float:left;          /* border in this first div, then placing our content */
        height: 1px;          /* into a second nested div (see 2nd nested div next */
        border-left:560px solid #fff;    /* CSS box-model borders are a fixed size */
    }
    
    * html .menuminwidth2 {    /* used to simulate min-width capability for IE5/6 */
        position:relative;
        margin-left:-560px;
        height: 1px;
    }
    
    #masthead {
        position:relative;      /* position our child objects relative to this div */
        float:left;
        vertical-align:top;          /* protect from super-large user text sizing */
        border:0;
        margin:0;
        padding:0;
        width:100%;                                  /* grey-fill the entire width */
        height:36px;                  /* set the overall height above the menu-bar */
        background:#F3F3F3;                          /* a very light shade of grey */
    }
    
    #mastheadlogo {
        float:left;
        vertical-align:top;
        border:0;
        padding:0;
        margin:6px 0 0 7px;
    }
    
    #focus {                                                 /* GRC's focus label */
        position:absolute;
        border:0;
        margin:0;
        padding:0;
        top:15px;
        left:301px;
        width:121px;
        height:13px;
    }
    
    #search {                                                    /* search button */
        position:absolute;
        border:0;
        margin:0;
        padding:0;
        top:7px;
        right:6px;
        width:60px;
        height:19px;
    }
    
    #text {                                                 /* search text field */
        position:absolute;
        border:1px solid #404040;
        margin:0;
        padding:0 0 0 2px;
        top:7px;
        right:65px;
        width:12em;
    /*  height:1.215em;         we'll define this at the bottom of our style sheet */
        font-size:14px !important;
        background:#fefefe;
    }
    
    #yah {                                    /* the "You are here" label graphic */
        position:absolute;
        top:5px;
        right:99px;
        width:87px;
        height:9px;
    }
    
     /*========================= TOP OF THE MENU CASCADE =========================*/
    
    .menu {
        position:relative;        /* establish a menu-relative positioning context */
        float:left;                                     /* play nicely with others */
        margin:0;
        padding:0;
        border:0;
        height:18px;                                  /* the menu's overall height */
        width:100%;         /* we always want our menu to fill the available space */
        background:#f3f3f3;
        font-family: Verdana, Arial, Helvetica, sans-serif;
        font-size:12px;         /* this (and also below) sets the menu's font size */
        border-bottom:1px solid black;        /* give us a black border underneath */
    }
    
    .menu img {
        vertical-align: top;      /* prevent images from being pushed down by text */
    }
    
    .menu ul {
        padding:0;
        margin:0;
        border:0;
        list-style-type:none;          /* we don't want to view the list as a list */
        line-height:1.5em;           /* globally set the menu's item spacing. note */
    }                               /* this must be 1.0 or 1.5 or 2.0 for Mozilla */
    
    .menu li {
        float:left;    /* this creates the side-by-side array of top-level buttons */
        position:relative;    /* create local positioning contexts for each button */
        margin:0;
    }
    
    .menu ul li table {
        margin:-1px 0;              /* IE5 needs -1px top and bottom table margins */
        m\argin:0;               /* re-zero the table margins for everyone but IE5 */
        border-collapse:collapse;      /* IE5 needs this for the sub-menus to work */
        font-size:12px;        /* this sets the base font size for our entire menu */
    }
    
    .drop {
        display:block;
        padding:0px 0.33em;        /* this sets the l/r margins for our menu item */
        margin:0;
        text-align:right;   /* this right alignment goes with the float:left below */
        cursor:pointer;      /* IE tries to switch back to an I-beam, don't let it */
        cursor:hand;           /* IE5 only knows about "hand", so set it both ways */
    }
    
    .drop span {        /* this simultaneously left and right aligns the text and */
        float:left;       /* the >> in the drop-down menus which link to sub-menus */
    }
    
    .rightmenu {
        position:relative;  /* establish a local positioning context for YAH label */
        float:right;                  /* and right-align it at the top of our page */
    }
    
    #research {            /* this rightmost "Research" button must be positioned */
        position:absolute;       /* absolutely so that the YAH (you are here) text */
        top:0px;               /* label will slide underneath it under Opera v8.54 */
        left:364px;    /* which has a z-order sequencing bug with abs-pos elements */
    }
    
    /*======================== TOP LEVEL MENU DEFINITIONS ========================*/
    
    .menu ul li ul {
        display:none;                  /* initially hide the entire list hierarchy */
        padding:1px;                               /* this is our box border width */
    }
    
    .menu ul li a,
    .menu ul li a:visited {                    /* unselected top-level menu items */
        display:block;
        float:left;
        text-decoration:none;
        height:18px;
    }
    
    .menu ul li:hover a,
    .menu ul li a:hover {                        /* selected top-level menu items */
        border-top:1px solid #000;    /* these 2 lines create the push-in illusion */
        height:16px;
    }
    
    /*======================== 2ND LEVEL MENU DEFINITIONS ========================*/
    
    .menu ul li:hover ul,
    .menu ul li a:hover ul {                           /* 2nd level drop-down box */
        display:block;
        position:absolute;
        margin:0;
        top:18px;              /* place us just up underneath the top-level images */
        left:-1px;       /* left-align our drop-down to the previous button border */
        height:auto;      /* the drop-down height will be determiend by line count */
        width:13.5em;
        color:black;                        /* this sets the unselected-text color */
        background:black;         /* this sets our menu's effective "border" color */
    }
    
    .menu ul li:hover ul.leftbutton,
    .menu ul li a:hover ul.leftbutton {/* our first dropdown should not be skewed */
        left:0px;
    }
    
    .menu ul li:hover ul.skinny,
    .menu ul li a:hover ul.skinny {             /* 2nd level skinny drop-down box */
        width:8.08333em;   /* with a 12px default font, this is 97px width (97/12) */
    }
    
    .menu ul.rightmenu li:hover ul,
    .menu ul.rightmenu li a:hover ul {    /* 2nd level neighborhood drop-down box */
        left:auto;
        right:0;         /* nudge the right menu right to line up under the border */
    }
    
    * html .menu ul.rightmenu li a:hover ul {         /* IE5/6 needs a tweak here */
        right:-1px;
    }
    
    .menu ul li:hover ul li a,
    .menu ul li a:hover ul li a {                   /* 2nd level unselected items */
        border:0;
        margin:0;
        padding:0;
        height:auto;
        color:#000;               /* this sets the unselected drop-down text color */
        background:#d8d8d8;       /* this sets the drop-down menu background color */
        width:13.5em;
    }
    
    .menu ul li:hover ul li:hover a,
    .menu ul li a:hover ul li a:hover {                /* 2nd level selected item */
        color:black;
        background:white;
    }
    
    .menu ul li:hover ul.skinny li a,
    .menu ul li a:hover ul.skinny li a,
    .menu ul li:hover ul.skinny li a:hover,
    .menu ul li a:hover ul.skinny li a:hover {     /* 2nd level un+selected items */
        width:8.08333em;
    }
    
    /*======================== 3RD LEVEL MENU DEFINITIONS ========================*/
    
    .menu ul li:hover ul li ul,
    .menu ul li a:hover ul li a ul {             /* hide inactive 3rd-level menus */
        visibility:hidden;
    }
    
    .menu ul li:hover ul li:hover ul,
    .menu ul li a:hover ul li a:hover ul {             /* 3rd level drop-down box */
        visibility:visible;
        position:absolute;
        margin-top:-1px;          /* bring the top edge of the 3rd level menu up one */
        top:0;
        left:8.08333em;
        width:14em;
    }
    
    .menu ul li:hover ul li:hover ul li a,
    .menu ul li a:hover ul li a:hover ul li a {     /* 3rd level unselected items */
        width:14em;
        background:#d8d8d8;
    }
    
    .menu ul li:hover ul li:hover ul li a:hover,
    .menu ul li a:hover ul li a:hover ul li a:hover {    /* level3 selected items */
        width:14em;
        background:white;
    }
    
    #text {           /* the Mac's standard Safari browser will not see this code */
        height:1.215em;#           /* ...  but every other browser will and should */
    } /* Safari barfs on the illegal pound sign (#) after the rule's property val */
    
    0 讨论(0)
  • 2021-01-03 17:15

    Pure CSS Way

    HTML

    <ul class="nav">
        <li>
            <a href="#">Menu 1</a>
            <ul>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
            </ul>
        </li>
        <li>
            <a href="#">Menu 2</a>
            <ul>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
            </ul>
        </li>
        <li>
            <a href="#">Menu 3</a>
            <ul>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
                <li><a href="#">Sub Menu Item</a></li>
            </ul>
        </li>
    </ul>
    

    CSS

    * {font-family: "Segoe UI", Tahoma;}
    ul.nav {border-bottom: 1px solid #999;}
    ul.nav li a {display: block; text-decoration: none; color: #333; padding: 5px; border: 1px solid #fff;}
    ul.nav > li:hover {border: 1px solid #666; border-bottom: 1px solid #fff;}
    ul.nav li a:hover {background: #ccc; border: 1px solid #999;}
    ul.nav > li {display: inline-block; position: relative; border: 1px solid #fff;}
    ul.nav > li ul {display: none; position: absolute; left: -1px; width: 150px; border: 1px solid #666; border-top-color: #fff; margin-top: 1px;}
    ul.nav > li:hover ul {display: block;}
    ul.nav > li ul li {display: block;} /* Vertical Menu */
    ul.nav > li ul li {display: inline-block;} /* Horizontal Menu */
    

    Fiddle:
    http://jsfiddle.net/vMuxA/ (Vertical Menu)
    http://jsfiddle.net/vMuxA/1/ (Horizontal Menu)

    0 讨论(0)
  • 2021-01-03 17:30

    With ul.menu being the parent of all the others, but differing from your html approach in this : the submenus (ul tags) are inside a parent's menu item (li tag), which is more consistent with html requirements (a w3 recommendation, a question, or just test it in the validator). So your example would become the following :

    <div class="sidebar1" align="center">
    <ul class="nav">
      <li><a href="index.html">Home</a></li>
      <li><a href="#">Products</a>
          <ul class="productnav">
             <li><a href="#">Products Overview</a></li>
             <li><a href="#">Unibook Enterprise</a></li>
             <li><a href="#">Unibook Standard</a></li>
             <li><a href="#">Univoice 2.0</a></li>
             <li><a href="#">Univoice lite</a></li>
             <li><a href="#">Pricing</a></li>
             <li><a href="#">Demo</a></li>
          </ul>
        </li>
      <li><a href="#">Solutions</a></li>
      <li><a href="#">Markets</a></li>
      <li><a href="#">About UDI</a></li>
      <li><a href="#">Contact Us</a></li>
    </ul>
    

    And the css I would use (even though you could strip the sizes, as long as they're all the same, I think) :

    .nav li
    {
        position:relative;
        float:left;
        width:180px;
        height:30px;
        padding:0;
        margin:0;
        list-style: none;
    }
    
    .nav ul
    {       
        display:none;
        position:absolute;
        padding:0;
        margin:5px 0 0 0;
    }
    
    .nav ul li ul
    {
        left:100%;
        top:0;
        margin:0px;
    }
    
    /* hiding or showing on second generations */
    .nav li:hover ul ul, .nav li:hover ul ul ul
    {
        display: none;
    }
    
    .nav li:hover ul, .nav ul li:hover ul, .nav ul ul li:hover ul
    {
        display: block;
    }
    

    This works on up to three recursive levels of uls in your ul.nav, but you could expand it as much as you'd want by modifying the selectors of the two last css blocks.

    But I still think that replacing the :hover with a .over class that appears on hover with hover events in javascript gives a better feeling, because you can set a timeout to keep the menu shown for a short moment after having hovered it. Allows for more natural moves with your pointer when navigating to a sub-menu, with the css approach you have to stay inside the li tags.

    0 讨论(0)
提交回复
热议问题