How to make a menu have submenus in pure CSS - html

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 normal menu would.
the HTML:
<div class="sidebar1" align="center">
<ul class="nav">
<li>Home</li>
<li>Products</li>
<ul class="productnav">
<li>Products Overview</li>
<li>Unibook Enterprise</li>
<li>Unibook Standard</li>
<li>Univoice 2.0</li>
<li>Univoice lite</li>
<li>Pricing</li>
<li>Demo</li>
</ul>
<li>Solutions</li>
<li>Markets</li>
<li>About UDI</li>
<li>Contact Us</li>
</ul>
Ignore any missing /div tags and such.
The CSS:
ul.nav {
margin-top: 10px;
margin-left: 2px;
list-style: none; /* this removes the list marker */
border-top: 1px solid #FFF; /* this creates the top border for the links - all others are placed using a bottom border on the LI */
margin-bottom: 15px; /* this creates the space between the navigation on the content below */
}
ul.nav li {
border-bottom: 1px solid #FFF; /* this creates the button separation */
}
ul.nav a, ul.nav a:visited { /* grouping these selectors makes sure that your links retain their button look even after being visited */
padding: 5px 5px 5px 15px;
display: block; /* this gives the link block properties causing it to fill the whole LI containing it. This causes the entire area to react to a mouse click. */
width: 160px; /*this width makes the entire button clickable for IE6. If you don't need to support IE6, it can be removed. Calculate the proper width by subtracting the padding on this link from the width of your sidebar container. */
text-decoration: none;
background-color: #CFCFCF;
}
ul.nav a:hover, ul.nav a:active, ul.nav a:focus { /* this changes the background and text color for both mouse and keyboard navigators */
background-color: #1075C7;
color: #FFF;
}
/*-----------------------------*/
ul.productnav {
margin-top: 10px;
margin-left: 2px;
list-style: none; /* this removes the list marker */
border-top: 1px solid #FFF; /* this creates the top border for the links - all others are placed using a bottom border on the LI */
margin-bottom: 15px; /* this creates the space between the navigation on the content below */
}
ul.productnav li {
border-bottom: 1px solid #FFF; /* this creates the button separation */
}
ul.productnav a, ul.productnav a:visited { /* grouping these selectors makes sure that your links retain their button look even after being visited */
padding: 5px 5px 5px 15px;
display: block; /* this gives the link block properties causing it to fill the whole LI containing it. This causes the entire area to react to a mouse click. */
width: 160px; /*this width makes the entire button clickable for IE6. If you don't need to support IE6, it can be removed. Calculate the proper width by subtracting the padding on this link from the width of your sidebar container. */
text-decoration: none;
background-color: #CFCFCF;
}
ul.productnav a:hover, ul.productnav a:active, ul.productnav a:focus { /* this changes the background and text color for both mouse and keyboard navigators */
background-color: #1075C7;
color: #FFF;
}
And remember: I want a basic submenu thing going on; Hover over product, you get the .productnav ul showing up next to the normal stuff. Thanks!

Pure CSS Way
HTML
<ul class="nav">
<li>
Menu 1
<ul>
<li>Sub Menu Item</li>
<li>Sub Menu Item</li>
<li>Sub Menu Item</li>
</ul>
</li>
<li>
Menu 2
<ul>
<li>Sub Menu Item</li>
<li>Sub Menu Item</li>
<li>Sub Menu Item</li>
</ul>
</li>
<li>
Menu 3
<ul>
<li>Sub Menu Item</li>
<li>Sub Menu Item</li>
<li>Sub Menu Item</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)

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 */

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>Home</li>
<li>Products
<ul class="productnav">
<li>Products Overview</li>
<li>Unibook Enterprise</li>
<li>Unibook Standard</li>
<li>Univoice 2.0</li>
<li>Univoice lite</li>
<li>Pricing</li>
<li>Demo</li>
</ul>
</li>
<li>Solutions</li>
<li>Markets</li>
<li>About UDI</li>
<li>Contact Us</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.

Related

adding a different class to css ul and li elements for navbar

I have a web page that has two different UL elements in it, and each of them needs different CSS rules. One of the UL elements is a menu bar and I keep trying to add a style name to it, so that I can differentiate it from the other UL element. When I do the end result is a mess. I have hunted through this site and Google for hours but cannot find a solution, no matter which bits of the code I change.
The code that works for the menu without the class name is:
#menuBackground {
position: fixed;
top: 0;
background:#0ab2aa;
width:100%;
height:50px;
text-align: center;
z-index: 999;
}
#menuContainer {
text-align: center;
}
/*Strip the ul of padding and list styling*/
ul {
list-style-type:none;
margin:0;
padding:0;
}
/*Create a horizontal list with spacing*/
li {
display:inline-block;
vertical-align: top;
margin-right:1px;
}
/*Style for menu links*/
li a {
display:block;
min-width:120px;
height:50px;
text-align: center;
line-height:50px;
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
color:#fff;
background:#0ab2aa;
text-decoration:none;
font-size: 1rem;
}
.drop a{
display:block;
min-width:120px;
height:50px;
text-align: left;
line-height:50px;
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
color:#fff;
background:#2f3036;
text-decoration:none;
font-size: 1rem;
}
/*Hover state for top level links*/
li:hover a {
background:#0ab2aa
}
/*Style for dropdown links*/
li:hover ul a {
background:#f3f3f3;
color:#2f3036;
height:40px;
line-height:40px
}
/*Hover state for dropdown links*/
li:hover ul a:hover {
background:#0ab2aa;
color:#fff
}
/*Hide dropdown links until they are needed*/
li ul {
position: absolute;
display:none
}
/*Make dropdown links vertical*/
li ul li {
display:block;
}
/*Prevent text wrapping*/
li ul li a {
width:auto;
min-width:100px;
padding:0 10px
}
/*Display the dropdown on hover*/
ul li a:hover + .hidden,.hidden:hover {
display:block
}
/*Style 'show menu' label button and hide it by default*/
.show-menu {
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
text-decoration:none;
color:#fff;
background:#0ab2aa;
text-align:left;
padding: 16px 0;
display:none;
width:100%!important
}
/*Hide checkbox*/
input[type=checkbox] {
display:none
}
/*Show menu when invisible checkbox is checked*/
input[type=checkbox]:checked ~ #menu {
display:block;
margin:0 auto
}
/*Responsive Styles*/
#media screen and (max-width : 1007px) {
/*Make dropdown links appear inline*/
ul {
position:static;
display:none;
white-space: initial;
}
/*Create vertical spacing*/
li {
margin-bottom:1px
}
/*Make all menu links full width*/
ul li,li a {
width:100%
}
/*Display 'show menu' link*/
.show-menu {
display:block
}
}
But when I try to add class names nav-li and nav-ul, if I change it to (one of many different attempts):
#menuBackground {
position: fixed;
top: 0;
background:#0ab2aa;
width:100%;
height:50px;
text-align: center;
z-index: 999;
}
#menuContainer {
text-align: center;
}
/*Strip the ul of padding and list styling*/
.nav-ul{
list-style-type:none;
margin:0;
padding:0;
}
/*Create a horizontal list with spacing*/
.nav-li {
display:inline-block;
vertical-align: top;
margin-right:1px;
}
/*Style for menu links*/
.nav-li a {
display:block;
min-width:120px;
height:50px;
text-align: center;
line-height:50px;
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
color:#fff;
background:#0ab2aa;
text-decoration:none;
font-size: 1rem;
}
.drop a{
display:block;
min-width:120px;
height:50px;
text-align: left;
line-height:50px;
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
color:#fff;
background:#2f3036;
text-decoration:none;
font-size: 1rem;
}
/*Hover state for top level links*/
.nav-li:hover a {
background:#0ab2aa
}
/*Style for dropdown links*/
.nav-li:hover, .nav-ul a {
background:#f3f3f3;
color:#2f3036;
height:40px;
line-height:40px
}
/*Hover state for dropdown links*/
.nav-li:hover, .nav-ul a:hover {
background:#0ab2aa;
color:#fff
}
/*Hide dropdown links until they are needed*/
.nav-li, .nav-ul {
position: absolute;
display:none
}
/*Make dropdown links vertical*/
.nav-li, .nav-ul li {
display:block;
}
/*Prevent text wrapping*/
.nav-li, .nav-ul li a {
width:auto;
min-width:100px;
padding:0 10px
}
/*Display the dropdown on hover*/
.nav-ul li a:hover + .hidden,.hidden:hover {
display:block
}
/*Style 'show menu' label button and hide it by default*/
.show-menu {
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
text-decoration:none;
color:#fff;
background:#0ab2aa;
text-align:left;
padding: 16px 0;
display:none;
width:100%!important
}
/*Hide checkbox*/
input[type=checkbox] {
display:none
}
/*Show menu when invisible checkbox is checked*/
input[type=checkbox]:checked ~ #menu {
display:block;
margin:0 auto
}
/*Responsive Styles*/
#media screen and (max-width : 1007px) {
/*Make dropdown links appear inline*/
.nav-ul {
position:static;
display:none;
white-space: initial;
}
/*Create vertical spacing*/
.nav-li {
margin-bottom:1px
}
/*Make all menu links full width*/
.nav-ul li, .nav-li a {
width:100%
}
/*Display 'show menu' link*/
.show-menu {
display:block
}
}
The display is wrong. (No navigation links can be seen in this version, but other versions have different errors)
The html code is:
<div id="menuBackground">
<div id="menuContainer">
<label for="show-menu" class="show-menu">Show Menu</label>
<input type="checkbox" id="show-menu" role="button" />
<ul class="nav-ul" id="menu">
<li class="nav-li">Home
</li>
<li class="nav-li">
About
</li>
<li class="nav-li">
Projects
<ul class="hidden">
<li class="drop">Handyman</li>
<li class="drop">Barrhill in Bloom</li>
<li class="drop">Youth Club</li>
<li class="drop">Coffee morning</li>
</ul>
</li>
<li class="nav-li">Hall
</li>
<li class="nav-li">Newsletters
</li>
<li class="nav-li">Meetings
</li>
<li class="nav-li">News
</li>
<li class="nav-li">Contact
</li>
</ul>
</div>
</div>
I know that it is probably something simple, but I keep trying so many different things (I now have 24 versions of the CSS file) and nothing works.
I assume there must be a format for adding a class name to CSS code with multiple elements like li ul li{} but I cannot seem the find the way to do it. Changing it to .nav-li, .nav-ul li{} does not seem to work. This is driving me crazy.
I do hope someone can help.
Many thanks in advance,
Tog
Use the immediate child selector to style only certain nested elements:
You don't actually need classes for the nav-ul and nav-li. If you want to do it only using CSS you can target only selected items using an immediate child selector ">". The immediate child selector will only affect the immediate children. i.e. If you do #menu > li. Only the immediate children(li items) of #menu will receive the styling:
This would mean that you can target the first level nav-li as:
#menu > li {
...styling goes here
}
Also, you can target the second level li as:
#menu > li > ul > li {
...styling goes here
}
This would make sure that your styles are separated for both the nested list elements.
Hope this helps.
If you want to use the nav-ul and nav-li classes on all your lists and list items, there are basically two things you need to do.
First, make sure all the <ul> and <li> elements in your HTML also have the right classes.
For example:
<ul class="hidden">
<li class="drop">Handyman</li>
...changes to
<ul class="nav-ul hidden">
<li class="nav-li drop">Handyman</li>
and so on.
Then you can rename all the ul and li selectors in your CSS to .nav-ul and .nav-li.
For example:
li ul li {
display:block;
}
...changes to
.nav-li .nav-ul .nav-li {
display:block;
}
/* Alternatively, if you prefer */
li .nav-ul li {
display:block;
}
Hope it helps!

CSS Menu Toggle isn't correct color when viewed in smaller screenHi

I have been trying to make this responsive CSS/HTML menu work, and it's displayed in the colors I want when it's in full screen/normal desktop view, but when I view it in "responsive" view e.g a phone resolution, the menu colors aren't displaying the right way...
As per the full screen version the colors should be as follows
menu text - #278189
background - #fff
hover background - #3A3A3A
I have trawled through the code time after time but cannot see why this isn't working? for some other strange reason "home" "about" and "contact" have a black hover background.
Another minor issue (not massively bothered but would be nice to know) is when in full screen there is a "home" button which will link to the index page, but in the smaller version there is a "menu" button too...?
TIA
Dan
<html>
<head>
<meta charset="utf-8">
<title>Primeheat | Chichester Plumbing & Heating Installation,
Maintenance & Emergency Breakdown</title>
<meta name="viewport" content="width=device-width">
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<nav>
<div id="logo">Your Logo here</div>
<label for="drop" class="toggle">Menu</label>
<input type="checkbox" id="drop" />
<ul class="menu">
<li>Home</li>
<li>
<!-- First Tier Drop Down -->
<label for="drop-1" class="toggle">Plumbing</label>
Plumbing
<input type="checkbox" id="drop-1"/>
<ul>
<li>Installation</li>
<li>Service</li>
<li>Breakdown</li>
</ul>
</li>
<li>
<!-- First Tier Drop Down -->
<label for="drop-2" class="toggle">Heating</label>
Heating
<input type="checkbox" id="drop-2"/>
<ul>
<li>Installation</li>
<li>Service</li>
<li>Service</li>
<li>
</ul>
</li>
<li>Contact</li>
<li>About</li>
</ul>
</nav>
<div id="navbar2" div id class="navbar2">
<h1 class="h1">Welcome to Primeheat Plumbing & Heating</h1>
</div>
</body>
</html>
body {
background: #212121;
font-size:22px;
line-height: 32px;
color: #278189;
margin: 0;
padding: 0;
word-wrap:break-word !important;
font-family: 'Open Sans', sans-serif;
}
h1 {
font-size: 60px;
text-align: center;
color: #278189;
}
h3 {
font-size: 30px;
line-height: 34px;
text-align: center;
color: ##278189;;
}
h3 a {
color: ##278189;;
}
a {
color: ##278189;;
}
h1 {
margin-top: 100px;
text-align:center;
font-size:60px;
line-height: 70px;
font-family: 'Bree Serif', 'serif';
}
#container {
margin: 0 auto;
max-width: 890px;
}
p {
text-align: center;
}
.toggle,
[id^=drop] {
display: none;
}
/* Giving a background-color to the nav container. */
nav {
margin:0;
padding: 0;
background-color: #FFFFFF;
}
#logo {
display: block;
padding: 0 30px;
float: left;
font-size:20px;
line-height: 60px;
}
/* Since we'll have the "ul li" "float:left"
* we need to add a clear after the container. */
nav:after {
content:"";
display:table;
clear:both;
}
/* Removing padding, margin and "list-style" from the "ul",
* and adding "position:reltive" */
nav ul {
float: right;
padding:0;
margin:0;
list-style: none;
position: relative;
}
/* Positioning the navigation items inline */
nav ul li {
margin: 0px;
display:inline-block;
float: left;
background-color: #fff;
}
/* Styling the links */
nav a {
display:block;
padding:14px 20px;
color:#278189;
font-size:17px;
text-decoration:none;
}
nav ul li ul li:hover { background: #3A3A3A; }
/* Background color change on Hover */
nav a:hover {
background-color: #3A3A3A;
}
/* Hide Dropdowns by Default
* and giving it a position of absolute */
nav ul ul {
display: none;
position: absolute;
/* has to be the same number as the "line-height" of "nav a" */
top: 60px;
}
/* Display Dropdowns on Hover */
nav ul li:hover > ul {
display:inherit;
}
/* Fisrt Tier Dropdown */
nav ul ul li {
width:170px;
float:none;
display:list-item;
position: relative;
}
/* Second, Third and more Tiers
* We move the 2nd and 3rd etc tier dropdowns to the left
* by the amount of the width of the first tier.
*/
nav ul ul ul li {
position: relative;
top:-60px;
/* has to be the same number as the "width" of "nav ul ul li" */
left:170px;
}
/* Change ' +' in order to change the Dropdown symbol */
li > a:after { content: ' +'; }
li > a:only-child:after { content: ''; }
/* Media Queries
-------------------------------------------- */
#media all and (max-width : 768px) {
#logo {
display: block;
padding: 0;
width: 100%;
text-align: center;
float: none;
}
nav {
margin: 0;
}
/* Hide the navigation menu by default */
/* Also hide the */
.toggle + a,
.menu {
display: none;
}
/* Stylinf the toggle lable */
.toggle {
display: block;
background-color: #FFF;
padding:14px 20px;
color:##278189;
font-size:17px;
text-decoration:none;
border:none;
}
.toggle:hover {
background-color: #278189;
}
/* Display Dropdown when clicked on Parent Lable */
[id^=drop]:checked + ul {
display: block;
}
/* Change menu item's width to 100% */
nav ul li {
display: block;
width: 100%;
}
nav ul ul .toggle,
nav ul ul a {
padding: 0 40px;
}
nav ul ul ul a {
padding: 0 80px;
}
nav a:hover,
nav ul ul ul a {
background-color: #000000;
}
nav ul li ul li .toggle,
nav ul ul a,
nav ul ul ul a{
padding:14px 20px;
color:#464646;
font-size:17px;
}
nav ul li ul li .toggle,
nav ul ul a {
background-color: #3a3a3a;
}
/* Hide Dropdowns by Default */
nav ul ul {
float: none;
position:static;
color: #278189;
/* has to be the same number as the "line-height" of "nav a" */
}
/* Hide menus on hover */
nav ul ul li:hover > ul,
nav ul li:hover > ul {
display: none;
}
/* Fisrt Tier Dropdown */
nav ul ul li {
display: block;
width: 100%;
}
nav ul ul ul li {
position: static;
/* has to be the same number as the "width" of "nav ul ul li" */
}
}
#media all and (max-width : 330px) {
nav ul li {
display:block;
width: 94%;
}
}
Before going into your stated problem, I would like to point out some obvious mistakes in your code. First mistake, you typed some of the color hex codes wrongly. You type extra hashtags and semicolons. Not only this h3 tag, but others as well. Check your code properly.
h3 {
font-size: 30px;
line-height: 34px;
text-align: center;
color: ##278189;; /* should be #278189; */
}
Second mistake, why do you style the same tag (h1) twice? I can understand you style it twice if one of them is either inside a media query or nested under other tags or classes/ids, but it's not.
h1 {
font-size: 60px;
text-align: center;
color: #278189;
}
h1 {
margin-top: 100px;
text-align:center;
font-size:60px;
line-height: 70px;
font-family: 'Bree Serif', 'serif';
}
Ok, to solve your problem:
You mentioned that menu colors aren't displaying correctly in mobile resolution.
Under the media query #media all and (max-width : 768px), you have something like this below. Just change it to the color that you want, which is #3A3A3A.
.toggle:hover {
background-color: #278189; /* it's using the menu text color. change this to the color you want, which is #3A3A3A */
}
If you want the nav items to have the same hover background color, change this as well, also under the same media query.
nav a:hover,
nav ul ul ul a {
background-color: #000000; /* #000000 is black color. Change this */
}
If the submenu text is meant to have the #278189 too, change this.
nav ul li ul li .toggle,
nav ul ul a,
nav ul ul ul a{
padding:14px 20px;
color: #464646; /* change this too... */
font-size:17px;
}
Another minor issue (not massively bothered but would be nice to know) is when in full screen there is a "home" button which will link to the index page, but in the smaller version there is a "menu" button too...?
The "menu" button that you mention is for collapsing the dropdown menu on mobile resolution. You click it, the dropdown menu will be shown. It's from this line of html code:
<label for="drop" class="toggle">Menu</label>
If you were to remove this whole line, you can't get the dropdown menu on mobile resolution anymore, as the dropdown css code are all handled by the toggle class.
Basically, your mentioned problems aren't big. If you're not sure where does the color come from, why is it showing the wrong color, etc, you can always use inspect element from your browser to look for it (read here for more info if you don't know much about inspect element. Also, always make sure your code is free from syntax errors (read more about css syntax), like the color hex codes like I mention above.

Third level of CSS menu doesn't display properly

I'm working on a three level menu. It works with two levels, however when I added a third level and hover over level 1, it displays level 2 and 3. How can I make it only display the third level when lis on level 2 are hovered over?
My html:
<div id="menuContainer">
<div id="menuwrapper">
<ul>
<li>One 1
<ul>
<li>Two 1</li>
<li>Two 2</li>
</ul>
</li>
<li>One 2
<ul>
<li>Two 3</li>
<li>Two 4</li>
</ul>
</li>
<li>One 3
<ul>
<li>
Two 5</font>
<ul>
<li><font size="2">Three 1</font></li>
<li><font size="2">Three 2</font></li>
</ul>
</li>
<li>
<font size="2">Two 6</font>
<ul >
<li><font size="2">Three 3</font></li>
<li><font size="2">Three 4</font></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
My CSS:
/*MENU CSS */
#menuwrapper {
width:100%;
z-index:2000;
}
/* for adding arrows to the menu items with sub menus YET TO IMPLEMENT*/
#menuwrapper li > a:after {
content: ' ';
}
#menuwrapper li > a:only-child:after {
content: '';
}
/* We remove the margin, padding, and list style of UL and LI components */
#menuwrapper ul, #menuwrapper ul li, #menuwrapper ul li ul li{
margin:0;
padding:0;
list-style:none;
}
/* We apply background color and border bottom white and width to 150px */
#menuwrapper ul li{
background-color:#2d6aff;
border-top:solid 1px black;
width:100%;
cursor:pointer;
}
/* We apply the background hover color when user hover the mouse over of the li component */
#menuwrapper ul li:hover{
background-color:#15357F;
position:relative;
}
/* We apply the link style */
#menuwrapper ul li a{
padding:5px 15px;
color:#ffffff;
display:inline-block;
text-decoration:none;
}
/**** SECOND LEVEL MENU ****/
/* We make the position to absolute for flyout menu and hidden the ul until the user hover the parent li item */
#menuwrapper ul li ul{
position:absolute;
display:none;
}
/* When user has hovered the li item, we show the ul list by applying display:block, note: 150px is the individual menu width. */
#menuwrapper ul li:hover ul{
left:100%;
min-width:283px;
top:0px;
display:block;
}
/* we apply different background color to 2nd level menu items*/
#menuwrapper ul li ul li{
background-color:#EEEEEE;
border-left: 1px solid #999999;
width:100%;
}
/* We change the background color for the level 2 submenu when hovering the menu */
#menuwrapper ul li:hover ul li:hover{
background-color:#4cff00;
}
/* We style the color of level 2 links */
#menuwrapper ul li ul li a{
color:#000000;
display:inline-block;
width:100%;
width: auto;
}
/**** THIRD LEVEL MENU ****/
/* We make the position to absolute for flyout menu and hidden the ul until the user hover the parent li item */
#menuwrapper ul li ul li ul{
position:absolute;
display:none;
}
/* When user has hovered the li item, we show the ul list by applying display:block, note: 150px is the individual menu width. */
#menuwrapper ul li:hover ul li:hover > ul {
min-width:283px;
top:0px;
display:block;
}
/* we apply different background color to 3rd level menu items*/
#menuwrapper ul li ul li ul {
background-color:#EEEEEE;
border-left: 1px solid #999999;
width:100%;
}
/* We style the color of level 3 links */
#menuwrapper ul li ul li ul li a{
color:#000000;
display:inline-block;
width:100%;
width: auto;
}
I think you want this : See this fiddle
I added two lines of CSS in the end with playing with parent selectors :
#menuwrapper > ul > li:hover > ul { display: block; left: 0; }
#menuwrapper > ul > li:hover > ul ul { display: none; }

Sub-menu vertically align

I've got a simple menu that should show a sub-menu vertically. However, i changed this menu to be in order to center it, and it now doesn't show vertically but horizontally.
Here is my codepen :
http://codepen.io/anon/pen/NGwmGq
.navitem{
height: 30px;
}
#menu ul {
margin:0;
padding:0;
list-style-type:none;
text-align:center;
}
#menu li {
background-color:black;
display: inline-block;
padding: 0;
vertical-align: middle;
}
#menu li a {
display:block;
width:125px;
color:white;
text-decoration:none;
line-height:30px
}
#menu li a:hover {
color:#FFD700;
}
#menu ul li ul {
display:none;
}
#menu ul li:hover ul {
display:block;
}
#menu li:hover ul li {
float:none;
}
#menu li ul {
position:absolute;
}
#menu {
height:30px;
margin-top: 30px;
}
.table {
display: table; /* Allow the centering to work */
margin: 0 auto;
}
/* Logo */
#logo{
height: 190px;
width: 266px;
background-color:black;
margin: 0 30px;
}
/* Fin MENU */
As you can see, the "portfolio" actually shows the sub-menu but this sub-menu should be vertically aligned.
You seem to have deleted the positioning context on the li
#menu li {
background-color: black;
display: inline-block;
padding: 0;
vertical-align: middle;
position: relative; /* add this */
}
For li you have given display as inline-block that,s why they are coming in one line. so for portfolio submenu Write this css in your css file
#menu ul li ul li {
display: block;
}
In your css, you're making all main menu items inline using #menu li selector, which is also applied for lis in sub menu.
So you've to explicitly specify display: block for sub menu lis
Change your code as given below.
#menu li:hover ul li {
float:none;
display:block;
}
Just Add display:block to your sub menu li.
#menu li:hover ul li {
float:none;
display:block; /* Add This */
}
UPDATED : EXPLANATION
1) display:block; property is a block property in HTML. So every element with such property takes a new line(Elements views Vertically).
2) display:inline-block; property is a block but inline property. So elements which such property appears on same single line(Elements views Horizontally).
Working : Fiddle

Hover Not Staying Long Enough

The following code creates a NAV bar with hover lists.
The hover works but I have to move my mouse quickly down the hover list to make sure it stays open on hover - ie it flashes off very quickly . Do I need to squeeze the top of the hover closer to the main NAV bar ? Any help much appreciated.
/* Navigation Style */
.dropdown { position:relative; font-family: arial, sans-serif; width:100%; height:40px; border:1px solid #666666; font-size:14px; color:#ffffff; background:#333333; z-index:2; }
/* Basic List Styling (First/Base Level) */
.dropdown ul {padding:0; margin:0; list-style: none;}
.dropdown ul li {float:left; position:relative;}
.dropdown ul li a { border-right:1px solid #666666; padding:12px 8px 12px 8px; display:block; text-decoration:none; color:#000; text-align:center; color:#fff;}
.dropdown ul li a:hover {color:#ffffff; background:#232323;}
/* Second Level Drop Down Menu */
.dropdown ul li ul {display: none;}
.dropdown ul li:hover ul { font-size:13px; display:block; position:absolute; top:41px; min-width:150px; left:0;}
.dropdown ul li:hover ul li a {display:block; background:#000; color:#ffffff; width:170px; }
.dropdown ul li:hover ul li a:hover {background:#666666; color:#ffffff;}
/* Third Level Drop Down Menu */
.dropdown ul li:hover ul li ul {display: none;}
.dropdown ul li:hover ul li:hover ul { display:block; position:absolute; left:145px; top:0; }
The actual NAV bar HTML is
<div class="dropdown">
<ul>
<li>About</li>
<li>Steam Rail Tours
<ul>
<li>All Rail Tours</li>
<li>British Pullman (VSOE)</li>
</ul>
</li>
</ul>
</div>
The problem is that your dropdown menu is 1px away from your static menu. Can be fixed by changing this one line of code:
.dropdown ul li:hover ul { font-size:13px; display:block; position:absolute; top:40px; min-width:150px; left:0;}
I changed 41px to 40px.
http://jsfiddle.net/eqH2Q/1/
Live Demo
Just add this simple rule:
.dropdown>ul>li>a:hover {
margin-bottom:20px;
}
This way when you hover the button, it gets an invisible bottom margin that will extend the area that triggers the hover event. This works with multiple dropdowns as the demo shows.
Try this line :
li:not(:hover) li {
display: none;
}
And get rid of all display: none and other hovers. It will make sublist's open when their partent list's li element is hovered, and you can add as many sublists as you want, without changing the CSS