I'm trying to achieve horizontal navigation links like this:
|--------------------------------------| 
|Link1   L2   LongLink3   Link4   Link5|
|--------------------------------------|
Rules:
This solution almost works--it's so close. But introducing the empty :after content adds unwanted additional vertical space in the nav container (why?). Is there a way to remove the extra vertical space injected by the empty :after content?
HTML that almost works:
<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><!--
--><h2>next element</h2>
CSS that almost works:
* {
    padding: 0;
    margin: 0;
}
#nav {
    text-align: justify;
    outline: 1px solid grey;
}
#nav:after {
    content: '';
    display: inline-block;
    width: 100%;
}
#nav li {
    display: inline-block;
    background-color: green;
}
#nav a:link {
    display: block;
    color: white;
    padding: 1em 0;
}
jsfiddle showing what this looks like, as well as the extra vertical space injected by the :after content. The "next element" should be directly below the nav links. Thanks.
Strange issue.
I assume it has something to do with the fact that inline elements respect whitespace in the markup, though the whitespace is necessary for text-align:justify to work, thus it can't be removed.
Since the whitespace is determined by the font's size, you can set the parent's font-size to 0, and then set the children's font-size accordingly. It works.. jsFiddle example
#nav {
    text-align: justify;
    outline: 1px solid grey;
    font-size:0;
}
#nav li {
    display: inline-block;
    background-color: green;
    font-size:16px;
}
Can't think of anything better at the moment. I will let you know if I do.
The trick here is related to the ul#nav:after psuedo-element:
#nav:after {
    content: '';
    display: inline-block;
    width: 100%;
}
This inserts an additional element within the nav that has the full width of the container we're trying to fill (the closest ancestor with position: relative).  This sets the width of ul#nav so that text-align: justify will create the desired spacing effect.
The trailing space is the height of the ul#nav:after psuedo-element.  Setting font-size: 0 on the ul#nav (as per @Josh Crozier's answer) is an indirect way of forcing the line-height to 0.  That method fails in IE for some reason, but setting the line-height directly appears to work in Chrome, FF, IE10+.  I haven't tested below IE10, but I expect this to work back through IE8 at least.  Here is the full solution:
* {
    padding: 0;
    margin: 0;
}
#nav {
    text-align: justify;
    outline: 1px solid grey;
    line-height: 0;
}
#nav:after {
    content: '';
    display: inline-block;
    width: 100%;
}
#nav li {
    display: inline-block;
    background-color: green;
    line-height: 100%;
}
#nav a:link {
    display: block;
    color: white;
    padding: 1em 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With