Extra space occurring when hovering link in navigation bar - html

HTML:
<ul>
<li>Home</li>
<li>Products
<ul>Power tools</ul>
<ul>Decorating</ul>
<ul>Plumbing</ul>
<ul>Electrical</ul>
<ul>Lighting</ul>
<ul>Tools</ul>
<ul>More products...</ul>
</li>
<li>Service
<ul>Handy man</ul>
<ul>Key cutting</ul>
</li>
<li>Contact us</li>
<li>About us</li>
<li>More...</li>
</ul>
CSS:
li ul {
display:none;
}
li:hover ul {
display:block;
}
ul li {
list-style:none;
}
ul {
padding:0px;
margin:0px;
}
li {
float:left;
position:relative;
}
ul{
position: relative;
}
ul li a{
display:block;
padding: 25px;
background-color:white;
background: linear-gradient(to bottom, rgba(238,238,238,1) 0%,rgba(238,238,238,1) 100%); /* W3C */
text-decoration:none;
color: black;
font-family:arial bold;
border-bottom: 4px solid rgb(140, 0, 0);
}
ul li ul a {
display:block;
padding: 25px;
background-color:rgb(140,0,0);
background:rgb(140,0,0);
color: white;
font-family:arial bold;
border-bottom: 0px solid rgb(140, 0, 0);
}
JSFIDDLE: http://jsfiddle.net/r6Mzp/6/
How can I remove the extra space which is occurring when hovering the main navigation bar link?
What i mean is when i hover a link in the navigation bar the drop down will show but the link that was originally hovered has got slightly bigger from the right. How can i stop the original link from getting bigger from the right? HELP!

The sub menu has more characters than the main navigation links which is creating that effect. In order to remove the increase in width, you need to limit the width of the navigation links. So here is what you need to modify:
ul li ul a {
display:block;
/*add this width element*/
width:64px;
padding: 25px;
background-color:rgb(140,0,0);
background:rgb(140,0,0);
color: white;
font-family:arial bold;
border-bottom: 0px solid rgb(140, 0, 0);
}
Fiddle
UPDATE:
Instead of changing the width of the above element as I had suggested, you can adjust the width on ul li like this:
ul li {
list-style:none;
width:150px;
}
UPDATED FIDDLE
FINAL UPDATE:
Please find the updated css. I think now it wont be possible without altering any width.
ul li ul a {
display:block;
background-color:rgb(140,0,0);
background:rgb(140,0,0);
color: white;
width:60px;
word-wrap:break-word;
font-family:arial bold;
border-bottom: 0px solid rgb(140, 0, 0);
}
FIDDLE FOR SAME

I am on my phone, and can't comment cause of my rep. That apart, make your ul(sub menu) position absolute and is patent element position relative. should do the trick.

Provide the width of ul li css element as below :
ul li {
list-style:none;
width:125px;
}
or you may give the width for each li (ul li a) element. that will also works fine.
JSFIDDLE

The size of the child objects are larger than the parents.
Increase the size to 35 in the padding.
ul li a{
...
padding: 35px;
..
}

ul li {
list-style:none;
width: 15%;
}

Related

How to get link to respect padding around text

Currently the link is just around the text / li. How do I get the link to respect the padding on the li? i.e. for the full height of the list item to be clickable / the yellow background on hover to fill the height of the list item including the padding top and bottom.
For various reasons I don't want to add the padding top and bottom to the link a style. it has to be on the li element
ul {
font-size:22px;
list-style-type: none;
padding-left: 0;
border-top:1px solid;
line-height:35px;
}
li {
border-bottom:1px solid;
padding:18px 0;
}
a:link { color:rgb(66,66,66); display:block; }
a:visited { color:rgb(66,66,66); display:block; }
a:hover { color:rgb(66,66,66); display:block; background-color:yellow; }
a:active { color:rgb(66,66,66); display:block; background-color:yellow; }
<ul>
<li>Coming soon</li>
</ul>
JS Fiddle: https://jsfiddle.net/1ah7qyfc/
You could extend the area of the link element with a pseudoelement positioned in absolute according to the list-item.
Add position: relative to the li, then for the ::before pseudoelement of the link set top: 0 and bottom: 0 (so even if you change the value of the padding of the parent element, the clickable area will adapt itself).
ul {
font-size:22px;
list-style-type: none;
padding-left: 0;
border-top:1px solid;
line-height:35px;
}
li {
border-bottom:1px solid;
padding:18px 0;
position: relative;
}
a::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
li:hover { background: yellow; }
a,
a:link,
a:visited,
a:hover,
a:active { color:rgb(66,66,66); display:block; }
a:hover,
a:active { background: inherit; }
<ul id="list-of-posts" class="cms-editable">
<li>Coming soon</li>
</ul>
As the final result, the top and bottom padding areas are clickable.
Try with this CSS:
li:hover{
color:rgb(66,66,66); display:block; background-color:yellow;
}
You can add id="" if necessary.

Fixing width and other CSS problems in menu navigation

I am coding a very simple CSS navigation menu. I’m trying to stretch the nav to 100% width across the page and set the last menu option to orange background color and white text color to no avail.
Can someone have a look at my CSS code and see where my problem is?
body {
background: #282828;
}
#nav ul {
margin: 0;
padding: 0;
list-style: none;
}
#nav ul li {
margin-right: 5px;
padding: 10px 20px;
position: relative;
height: 20px;
line-height: 20px;
background-color: #282c2b;
color: #fff;
}
#nav > ul > li {
float: left;
height: 30px;
line-height: 30px;
background-color: #282c2b;
border-left: 4px solid #282c2b;
}
#nav li > ul {
visibility: hidden;
position: absolute;
top: 0px;
color: #fff;
}
#nav > ul > li > ul {
width: 100%;
top: 50px;
margin-bottom: 10px;
left: -4px;
}
#nav li:hover {
background-color: #ffffff;
color: #282c2b;
border-left: 4px solid #ff3d00;
}
#nav li:hover > ul {
visibility: visible;
}
#nav ul li .navOrange {
background-color: #ff3d00;
}
Here’s a CodePen
I know it might be hard to achieve this with pure CSS but is it possible to make the menu drop down upon clicking or is it just set to rollover without JavaScript?
so i decided to change it up a little and use elements because it suits me better.
so i now have the following;
http://codepen.io/anon/pen/waKENz
when i add around the div elements it doesnt use the style setup in css, why is it doing this?
and is it possible to perhaps have menu option 4 perform a dropdown on rollover as before or not with elements.
You might have to target each navigation item seperately by setting a percentage width for the item and probably a percentage margin also. Make sure they all add up to 100%.
#nav > ul > li {
margin: 0 1%;
}
.home,
.level-1,
.support,
.sign-up {
width: 18%;
}
.info {
width: 20%;
}
.home {
margin-left: 0;
}
.sign-up {
margin-right: 0;
}
<div id="nav">
<ul>
<li class="home">Home</li>
<li class="info">Information</li>
<li class="level-1">Level 1</li>
<li class="support">Support</li>
<li class="sign-up">SIGN-UP!</li>
</ul>
</div>
Here's a demo jsFiddle (not full code).
The last item in the navigation is not turning orange because the selector is incorrect. You have:
#nav ul li .navOrange { background-color: #ff3d00;}
Which says (working right to left), select any element with the class of .navOrange that is a child of any li that is a child of any ul that is a child of #nav. .navOrange is an not a child of an li but on class on an li and also a child of a ul.
Remove li from the selector and it will work.
#nav ul .navOrange { background-color: #ff3d00;}
About the orange background color: you need to remove the space between "li" and ".navOrange" in the last definition. This will make it more specific than the other definitions and be applied later.
Full width can be achieved relatively simply if you know how many options you'll have in the menu with resizing the buttons to an adequate percentage. Though be careful with this - you generally want something less than 20% with 5 buttons because of the margins etc.
The hover menu that you already have is pure CSS, I don't know of a way to make it onclick without JavaScript.
Please check this code snippet.
body {background: #282828;}
#nav ul{ margin:0; padding:0; list-style:none; }
#nav ul li{ margin-right:5px; padding:10px 20px; position:relative; height:20px; line-height:20px; background-color:#282c2b; color:#fff; }
#nav > ul > li { float: left; height:30px; line-height:30px; background-color:#282c2b; border-left:4px solid #282c2b; }
#nav li > ul{ visibility:hidden; position: absolute; top:70px; color:#fff;
transition: all 0.2s ease-in;
opacity: 0;
}
#nav li.have-item:hover ul{
visibility:visible;
top:50px;
opacity: 1;
}
#nav > ul > li > ul{ width:100%; margin-bottom:10px; left:-4px; }
#nav > ul > li > ul li{
width:100%;
}
#nav li:hover{ background-color:#ffffff; color:#282c2b; border-left:4px solid #ff3d00; }
#nav li:hover > ul{visibility:visible;}
#nav > ul > li:last-child { background-color:#ff3d00 !important; }
<div id="nav">
<ul>
<li>Home</li>
<li>Information</li>
<li>Level 1</li>
<li class="have-item">Support
<ul>
<li>FAQ</li>
<li>Contact</li>
</ul>
</li>
<li class="navOrange">SIGN-UP!</li>
</ul>
</div>

Text not horizontally centre in nav bar / How to make a <br> half the size/ Too much space between nav bar text

Here I have my website: http://gyazo.com/56e069ebf8b5bd61ee30523886180b88
There are a number of issues with the nav bar.
You can see that the text or nav bar is not horizontally centered, as indicated by the hover (which is equal on top and bottom)
There is to much space in between the text, (and this spacing is the only way I've found works without the text moving around when highlighting or hovering.
The <.br> spacing on the drop down menu is too spaced apart.
So for 1. is there a way I can make the text or the nav bar (not sure what is the cause) centre so the hover looks more equal (horizontally)
For 2. Is there a way I can close the gap between the text, while still keeping the same padding settings, and so it doesn't move the text around when I use the hover function.
And 3. Is there a way to make the <.br> have half the space it currently uses
I've also added a jsfiddle if that helps: http://jsfiddle.net/d1a5eshs/
HTML code for the nav bar:
<!--TOP NAV BAR SECTION-->
<div id="nav_bar">
<ul>
<li>HOME
</li>
<li>STATUS
</li>
<li>INFO
</li>
<li>GAMEMODES
<ul>
<li>SURVIVAL
</li>
<li><br>PURE-PVP
</li>
<li><br>GAMESWORLD
</li>
</ul>
</li>
<li>RULES
</li>
<li>VOTE
</li>
<li>CONTACT
</li>
</ul>
</div>
And the CSS for the nav bar:
/*TOP NAV BAR SECTION*/
#nav_bar {
background-color: #a22b2f;
padding:1px;
box-shadow: 0px 2px 10px;
height:45px;
}
#nav_bar ul li {
display: inline-block;
}
#nav_bar ul li a {
color: white;
text-decoration:none;
font-weight:bold;
font-size:15px;
margin-left:10px;
padding-bottom:13px;
padding-top:17px;
padding-left:10px;
padding-right:10px;
margin-bottom:30px;
}
#nav_bar ul li ul {
display: none;
}
#nav_bar>ul>li>a:hover {
background:#8c1b1f;
padding-bottom:13px;
padding-top:13px;
padding-left:10px;
padding-right:10px;
}
#nav_bar>ul>li>ul>li>a:hover {
background:#c9c9c9;
padding-bottom:5px;
padding-top:5px;
padding-left:5px;
padding-right:5px;
}
#nav_bar ul li:hover ul {
display: block;
position: absolute;
padding: 0px;
background: #e2e2e2;
padding-top:10px;
padding-bottom:10px;
padding-left:0px;
padding-right:10px;
border: 1px solid black;
border-radius:5px;
}
#nav_bar ul li:hover ul li {
display: block;
}
#nav_bar ul li:hover ul li a {
color: black;
font-size:12px;
font-weight:bol;
margin-left:-20px;
padding-bottom:5px;
padding-top:5px;
padding-left:5px;
padding-right:5px;
}
you dont have to use the in your inner list. adjust line-height to get desired result.
http://www.jsfiddle.net/9058vefk
#nav_bar ul li:hover ul {
display: block;
position: absolute;
padding: 0px;
background: #e2e2e2;
padding-top:10px;
padding-bottom:10px;
padding-left:10px;
padding-right:10px;
border: 1px solid black;
border-radius:5px;
line-height:1.5em; /* added this- you can change it th=o what you want */
height:5em;
}
as far as centering the main ul li , divide the entire div (nav_bar) into 7 equal smaller divs and apply that space to each nav item.

Menu Padding Variations

I have an 8 item menu, to get it evenly spaced across IE, Chrome Firefox and when viewed using an ipad I've had to use extraneous padding within the stylesheet which works but is so messy. Not helping is the fact each menu item is a different width.
Having spent several hours on google I've achieved absolutely nothing. If possible looking for a much cleaner solution, HTML and CSS below
<nav>
<ul>
<li>Home</li>
<li>Shop</li>
<li>Convertible Roofs</li>
<li>Contact Us</li>
<li>Gallery</li>
<li>Customer Comments</li>
<li class="active">Buyers Guide</li>
<li>Leather Care</li>
</ul>
</nav>
nav ul {
margin:0;
padding:0;
background:rgba(0,0,0,.2);
}
nav ul li {
display:inline-block;
border-right:1px solid rgba(255,255,255,.2);
margin-right:-3px;
}
nav ul li:last-child {
border-right:none;
}
nav ul li a {
display:inline-block;
padding:14px 21.3px;
text-align:center;
text-decoration:none;
text-transform:uppercase;
font-size:0.938em;
outline:0;
color:#fff;
}
#media screen and (-webkit-min-device-pixel-ratio:0) {
nav ul li a {
padding:14px 20.7px;
}
}
#media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
nav ul li a {
padding:14px 21.3px;
}
}
#-moz-document url-prefix() {
nav ul li a {
padding:14px 20.7px;
}
}
nav ul li a:hover,nav li.active a {
color:#fff;
background:rgba(0,0,0,.4);
}
See if you can follow this as is; if not, I'll do you a fiddle ...
The basic premise is to make the elements behave like table cells so you don't need the padding. I did a quick edit in Firebug - see if it works for you:
nav {
display: table;
height: 50px;
width: 100%;
}
nav ul {
background: none repeat scroll 0 0 rgba(0, 0, 0, 0.2);
display: table-row;
margin: 0;
padding: 0;
width: 100%;
}
nav ul li {
border-right: 1px solid rgba(255, 255, 255, 0.2);
display: table-cell;
line-height: 50px;
}
nav ul li a {
color: #fff;
display: block;
font-size: 0.938em;
outline: 0 none;
padding: 0;
text-align: center;
text-decoration: none;
text-transform: uppercase;
}
You can remove the rule that adds the padding (line 170).
Disclaimer: Not tested in anything other than Firefox.
Did a bit more digging and found this answer by #Rob Lowe on this page how to make a ul li css menu with variable space between items, very close to your method #Jayx so thanks again.
nav {
width:960px;
display:table;
background:rgba(0,0,0,.2);
border-collapse:collapse;
margin:0;
padding:0;
}
nav ul {
display:table-row-group;
list-style:none;
margin:0;
padding:0;
}
nav li {
display:table-cell;
border-right:1px solid rgba(255,255,255,.2);
vertical-align:middle;
}
nav li a {
display:block;
padding:12px 15px;
text-align:center;
text-decoration:none;
text-transform:uppercase;
font-size:0.938em;
outline:0;
color:#fff;
}

Submenu appears right away on the page, but disappears when mouse goes over the main menu item

hoping someone could help me solve this issue...im not using js, just css and html. I have built a menu which works good but my issue is when i try to add in a sub menu. I would like for it be hidden until someone goes over the main menu, then i would like for it to drop down. The effect that im getting now is my sub menu loads right away with the main menu above it and then it disappears when i go over that main menu item. i have tried some different things such as adding z-index here and there, but no luck so far...
HTML:
<div id="container">
<div id="menu">
<ul id="nav">
<ul>
<li id="menu1"><h2>Home</h2></li>
<li id="menu2"><h2>Sign-Up</h2></li>
<li id="menu3"><h2>Packages</h2>
<ul>
<li>Gold</li>
<li>Platinum</li>
</ul>
</li>
<li id="menu4"><h2>About Us</h2></li>
<li id="menu5"><h2>Contact</h2></li>
</ul>
</ul>
</div>
CSS:
* {
margin:0px;
padding:0px;
}
.form-textbox{
height:100px;
font-size:100px;
}
#fieldset{
width:300px;
}
#fieldst p{
clear:both;
padding:5px;
}
#legend{
font-size:16px;
}
label[for="username"] {
color:#FFFFFF;
font-weight:bold;
clear:both;
text-align:left;
}
label[for="password"] {
color:#FFFFFF;
font-weight:bold;
clear: both;
text-align:left;
margin-top:40px;
}
body {
padding-top:0px;
background-color:#01111d;
color:#FFF;
font-family:verdana, arial, sans-serif;
text-align: left;
letter-spacing: 1px;
}
a {
color: #FFF;
font-size: 14px;
}
a:hover {
color:#efae00;
} //01a9c0
.more {
float:left;
}
.clear {
clear:both;
}
p {
margin: 20px 0px 20px 0px;
line-height: 16px;
font-size: 14px;
}
#container {
margin: 0px auto;
width: 873px;
}
#menu {
background-image:url(images/menu.gif);
width:862px;
height:90px;
position:relative;
z-index:99999;
}
#menu li{
position:absolute;
top:40px;
list-style-type:none;
}
#menu1 {
left:110px;
}
#menu2 {
left:255px;
}
#menu3 {
left:400px;
}
#menu4 {
left:540px;
}
#menu5 {
left:680px;
}
#menu a {
font-family: verdana, arial, sans-serif;
font-size:12px;
font-weight:bolder;
color:#FFFFFF;
text-decoration:none;
text-transform:uppercase;
}
#menu a:hover {
color:#efae00;
}
#menu li > #nav li ul
#nav li ul {
position:absolute;
display:none;
}
#nav li:hover ul {
display: none;
}
#nav li ul li {
float: none;
display: block;
}
#nav li ul li a {
width: 118px;
position: absolute;
border-left: 1px solid black;
border-right: 1px solid black;
border-bottom: 1px solid black;
background: #333;
color: #fff;
}
#nav li ul li a:hover {
background: #066;
color: #000;
}
Jsfiddle here: http://jsfiddle.net/bC7f2/
So it appears there are a few things that we can change in your code. The first thing is when you should and should not display things. To keep it short, I have made a few adjustments to the CSS code, just be sure you are getting the exact area you are trying to use. Here are the new selector names:
#nav ul li:hover ul #ITEM NAME HERE
#nav li ul # ITEM NAME HERE
Next, you started off by displaying your drop down menu as "display: block;" , this means that anything in the drop down menu will automatically begin on the page, this should actually be set to "display:none;", so that it is not visible until you hover. Here is your end product:
#nav ul li:hover ul #item1 {
display: none;
position: absolute;
z-index: 100;
display: inline-block;
top: 20px;
}
#nav ul li:hover ul #item2 {
/* display: none; */
position: relative;
z-index:1;
display: block;
top: 13px;
}
#nav ul li:hover ul #item3 {
/* display: none; */
position: relative;
z-index:0;
display: block;
top: 27px;
}
#nav li ul #item1 {
z-index:100;
display:none;
}
#nav li ul #item2 {
z-index:1;
display:none;
}
#nav li ul #item3 {
z-index:0;
display:none;
}
I also added a margin here to connect the sub menu to the normal menu or else it will act really weird. Your end product can be found here.
I would suggest looking into some specific tutorials on how to create drop down menus with CSS or look into using jQuery with your drop down menu (it will make it more clean and easy to use).
Edit: Here is an update with the sub menus showing, I have also added another sub menu to show you exactly how the items will work and the corresponding CSS to go with it here.
To break down my additions, I will split it up into sections really fast:
Z-Index: This is pretty much the order of what the items will appear in, where the higher the number, the higher on the list it will appear. Here is a resource for more information.
Positioning: I have used a combination of absolute and relative positioning. This is extremely dirty and I don't know if many would recommend the use of this in the applicable web programming world. It would be better to use solely absolute positioning, but this will still get your job done. More information can be found here.
Top: This is pretty self explanatory but it is really the distance from the utmost top object. More information on this can be found here.