[ACCEPTED]-How to stretch a fixed number of horizontal navigation items evenly and fully across a specified container-justify
Use text-align:justify
on the container, this way it will 3 work no matter how many elements you have 2 in your list (you don't have to work out 1 % widths for each list item
#nav {
text-align: justify;
min-width: 500px;
}
#nav:after {
content: '';
display: inline-block;
width: 100%;
}
#nav li {
display: inline-block;
}
<ul id="nav">
<li><a href="#">HOME</a></li>
<li><a href="#">ABOUT</a></li>
<li><a href="#">BASIC SERVICES</a></li>
<li><a href="#">OUR STAFF</a></li>
<li><a href="#">CONTACT US</a></li>
</ul>
This one really works. Also has the benefit 4 that you can use media queries to easily 3 turn off the horizontal style — for instance 2 if you want to stack them vertically when 1 on mobile phone.
HTML
<ul id="nav">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
CSS
#nav {
display: table;
height: 87px;
width: 100%;
}
#nav li {
display: table-cell;
height: 87px;
width: 16.666666667%; /* (100 / numItems)% */
line-height: 87px;
text-align: center;
background: #ddd;
border-right: 1px solid #fff;
white-space: nowrap;
}
@media (max-width: 767px) {
#nav li {
display: block;
width: 100%;
}
}
if you can, use flexbox:
<ul>
<li>HOME</li>
<li>ABOUT US</li>
<li>SERVICES</li>
<li>PREVIOUS PROJECTS</li>
<li>TESTIMONIALS</li>
<li>NEWS</li>
<li>RESEARCH & DEV</li>
<li>CONTACT</li>
</ul>
ul {
display: flex;
justify-content:space-between;
list-style-type: none;
}
jsfiddle: http://jsfiddle.net/RAaJ8/
Browser 2 support is actually quite good (with prefixes 1 an other nasty stuff): http://caniuse.com/flexbox
An ideal solution will:
- Automatically scale to the width of the navigation container
- Support a dynamic number of menu items.
Using a simple ul
menu 11 inside of an nav
container, we can build a 10 solution that meets the above requirements.
HTML
<nav>
<ul>
<li>Home</li>
<li>About</li>
<li>Basic Services</li>
<li>Specialty Services</li>
<li>Our Staff</li>
<li>Contact Us</li>
</ul>
</nav>
First, we 9 need to force the ul
to have the full width 8 of its nav
container. To accomplish this, we 7 will use the :after
psuedo-element with width: 100%
.
This 6 achieves our goal perfectly, but adds trailing 5 whitespace from the psuedo-element. We 4 can remove this whitespace across all browsers 3 through IE8 by setting the line-height
of the ul
to 0 2 and setting it back to 100% on its li
children. See 1 the example CodePen and solution below:
CSS
nav {
width: 900px;
}
nav ul {
text-align: justify;
line-height: 0;
margin: 0;
padding: 0;
}
nav ul:after {
content: '';
display: inline-block;
width: 100%;
}
nav ul li {
display: inline-block;
line-height: 100%;
}
I tried all the above and found them wanting. This 9 is the simplest most flexible solution I 8 could figure out (thanks to all of the above 7 for inspiration).
HTML
<div id="container">
<ul>
<li>HOME</li>
<li>ABOUT US</li>
<li>SERVICES</li>
<li>PREVIOUS PROJECTS</li>
<li>TESTIMONIALS</li>
<li>NEWS</li>
<li>RESEARCH & DEV</li>
<li>CONTACT</li>
</ul>
</div>
CSS
div#container{
width:900px;
background-color:#eee;
padding:20px;
}
ul {
display:table;
width: 100%;
margin:0 0;
-webkit-padding-start:0px; /* reset chrome default */
}
ul li {
display:table-cell;
height:30px;
line-height:30px;
font-size:12px;
padding:20px 10px;
text-align: center;
background-color:#999;
border-right:2px solid #fff;
}
ul li:first-child {
border-radius:10px 0 0 10px;
}
ul li:last-child {
border-radius:0 10px 10px 0;
border-right:0 none;
}
You can drop the 6 first/last child-rounded ends, obviously, but 5 I think they're real purdy (and so does 4 your client ;)
The container width limits 3 the horizontal list, but you can ditch this 2 and just apply an absolute value to the 1 UL if you like.
Fiddle with it, if you like..
This should do it for you.
<div id="nav-wrap">
<ul id="nav">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>
#nav-wrap {
float: left;
height: 87px;
width: 900px;
}
#nav {
display: inline;
height: 87px;
width: 100%;
}
.nav-item {
float: left;
height: 87px;
line-height: 87px;
text-align: center;
text-decoration: none;
width: 150px;
}
0
Have you tried setting the li width to, say, 16% with 3 a margin of 0.5%?
nav li {
line-height: 87px;
float: left;
text-align: center;
width: 16%;
margin-right: 0.5%;
}
edit: I would set the UL 2 to 100% width:
nav ul { width: 100%; margin: 0 1 auto; }
This is the sort of thing that the CSS flexbox 3 model will fix, because it will let you 2 specify that each li will receive an equal 1 proportion of the remaining width.
I tried so many different things and finally 4 found what worked best for me was simply 3 adding in
padding-right: 28px;
I played around with the padding 2 to get the right amount to evenly space 1 the items.
Instead of defining the width, you could 4 just put a margin-left on your li, so that 3 the spacing is consistent, and just make 2 sure the margin(s)+li fit within 900px.
nav li {
line-height: 87px;
float: left;
text-align: center;
margin-left: 35px;
}
Hope 1 this helps.
<!DOCTYPE html>
<html lang="en">
<head>
<style>
#container { width: 100%; border: 1px solid black; display: block; text-align: justify; }
object, span { display: inline-block; }
span { width: 100%; }
</style>
</head>
<div id="container">
<object>
<div>
alpha
</div>
</object>
<object>
<div>
beta
</div>
</object>
<object>
<div>
charlie
</div>
</object>
<object>
<div>
delta
</div>
</object>
<object>
<div>
epsilon
</div>
</object>
<object>
<div>
foxtrot
</div>
</object>
<span></span>
</div>
</html>
0
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.