3

I created a CSS menu that looks like this - jsfiddle.

The CSS classes used.

#main_nav {
    margin-top:15px
}            

#main_nav ul {
    list-style:none;
    position:relative;
    float:left;
    margin:0;
    padding:0;
    background: #888;
}

#main_nav ul a {
    display:block;
    text-decoration:none;
    font-size:12px;
    line-height:32px;
    padding:0 15px;
    color: #fff;
    font-family: "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;
}

#main_nav ul li {
    position:relative;
    float:left;
    margin:0;
    padding:0
}

#main_nav ul li.current-menu-item {
    background:#ddd
}

#main_nav ul li:hover {
    background: #008000
}

#main_nav ul ul {
    display:none;
    position:absolute;
    top:100%;
    left:0;
    background:#888;
    padding:0
}

#main_nav ul ul li {
    float:none;
    width:200px;                
}

#main_nav ul ul a {
    line-height:120%;
    padding:10px 15px
}

#main_nav ul ul ul {
    top:0;
    left:100%
}

#main_nav ul li:hover > ul {
    display:block
}

.menu li > a:after { margin-left: 5px; float: right; content: '\25BA'; }
.menu > li > a:after { margin-left: 5px; float: right; content: '\25BC'; }
.menu li > a:only-child:after { margin-left: 0; content: ''; }
<div id="main_nav">
    <ul class="menu">
        <li class="current-menu-item"><a href="#">Home</a></li>
        <li><a href="#">Menu 1</a>
            <ul>
                <li><a href="#">Sub Menu 1</a></li>
                <li><a href="#">Sub Menu 2</a></li>
                <li><a href="#">Sub Menu 3</a></li>
                <li><a href="#">Sub Menu 4</a>
                    <ul>
                        <li><a href="#">Deep Menu 1</a>
                            <ul>
                                <li><a href="#">Sub Deep 1</a></li>
                                <li><a href="#">Sub Deep 2</a></li>
                                <li><a href="#">Sub Deep 3</a></li>
                                <li><a href="#">Sub Deep 4</a></li>
                            </ul>
                        </li>
                        <li><a href="#">Deep Menu 2</a></li>
                    </ul>
                </li>
                <li><a href="#">Sub Menu 5</a></li>
            </ul>
        </li>
        <li><a href="#">Menu 2</a>
            <ul>
                <li><a href="#">Sub Menu 1</a></li>
                <li><a href="#">Sub Menu 2</a></li>
                <li><a href="#">Sub Menu 3</a></li>
            </ul>
        </li>
        <li><a href="#">Menu 3</a>
            <ul>
                <li class="dir"><a href="#">Sub Menu 1</a></li>
                <li class="dir"><a href="#">Sub Menu 2</a>
                    <ul>
                        <li><a href="#">Category 1</a></li>
                        <li><a href="#">Category 2</a></li>
                        <li><a href="#">Category 3</a></li>
                        <li><a href="#">Category 4</a></li>
                        <li><a href="#">Category 5</a></li>
                    </ul>
                </li>
                <li><a href="#">Sub Menu 3</a></li>
                <li><a href="#">Sub Menu 4</a></li>
                <li><a href="#">Sub Menu 5</a></li>
            </ul>
        </li>
        <li><a href="#">Menu 4</a></li>
        <li><a href="#">Menu 5</a></li>
        <li><a href="#">Menu 6</a></li>
    </ul>
</div>

a:only-child:after in the given CSS does not work on Internet Explorer (8). Hence, an arrow appears on every menu item including those items without a sub menu.

Is there an alternative to a:only-child:after in Internet Explorer 8?

Tiny
  • 27,221
  • 105
  • 339
  • 599

1 Answers1

4

I couldn't find any other pseudo selector that could act in this case in place of :only-child. I tried to work with some sibilings selectors but unsuccessfully.

A possible solution would be to "mock" the only-child with Jquery. Jquery natively supports most of css pseudos, browser independent. You could something like this:

$(document).ready(function() {
    $("a:only-child").addClass("only-child");
});

Setting a class .only-child to every a that would meet the pseudo. Then, change your css rule to:

.menu li > a.only-child:after {

Working fiddle: http://jsfiddle.net/xgjhk0kw/2/

LcSalazar
  • 16,524
  • 3
  • 37
  • 69
  • "I couldn't find any other pseudo selector that could do the same as :only-child." If such a selector already existed, they probably wouldn't have bothered to create a new one ;) – BoltClock Aug 21 '14 at 16:44
  • I recommend this solution as well - the main reason you can't emulate `:only-child` with CSS is because there are no preceding sibling selectors. See [Faking CSS :only-child in IE8 with jQuery/JavaScript](http://stackoverflow.com/questions/19207380/faking-css-only-child-in-ie8-with-jquery-javascript) – BoltClock Aug 21 '14 at 16:47
  • I'm sorry if I didn't make myself clear. I meant that I couldn't find another selector that would allow him to do what he wants... Of course I know there's no other that will do exactly the same... – LcSalazar Aug 21 '14 at 16:51